pg_fetch_object

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_fetch_object将一行作为对象获取

描述

pg_fetch_object(
    PgSql\Result $result,
    ?int $row = null,
    string $class = "stdClass",
    array $constructor_args = []
): object|false

pg_fetch_object() 返回一个对象,其属性对应于获取的行中的字段名称。它可以选择实例化一个特定类的对象,并将参数传递给该类的构造函数。

注意: 此函数将 NULL 字段设置为 PHP 的 null 值。

在速度方面,此函数与 pg_fetch_array() 相同,几乎与 pg_fetch_row() 一样快(差异微不足道)。

参数

result

一个 PgSql\Result 实例,由 pg_query()pg_query_params()pg_execute()(以及其他)返回。

row

结果集中要获取的行号。行从 0 开始编号。如果省略或为 null,则获取下一行。

class

要实例化的类的名称,设置属性并返回。如果未指定,则返回一个 stdClass 对象。

constructor_args

一个可选的 array,用于将参数传递给 class 对象的构造函数。

返回值

一个 object,每个字段名称在结果中都有一个属性。数据库 NULL 值将返回为 null

如果 row 超过集合中的行数,没有更多行,或者发生任何其他错误,则返回 false

错误/异常

constructor_args 不为空且类没有构造函数时,将抛出 ValueError

变更日志

版本 描述
8.3.0 现在当 constructor_args 不为空且类没有构造函数时,会抛出 ValueError 异常;以前会抛出 Exception
8.1.0 result 参数现在需要一个 PgSql\Result 实例;以前需要一个 resource

示例

示例 #1 pg_fetch_object() 示例

<?php

$database
= "store";

$db_conn = pg_connect("host=localhost port=5432 dbname=$database");
if (!
$db_conn) {
echo
"Failed connecting to postgres database $database\n";
exit;
}

$qu = pg_query($db_conn, "SELECT * FROM books ORDER BY author");


while (
$data = pg_fetch_object($qu)) {
echo
$data->author . " (";
echo
$data->year . "): ";
echo
$data->title . "<br />";
}

pg_free_result($qu);
pg_close($db_conn);

?>

参见

添加注释

用户贡献的注释 8 个注释

ekevu at yahoo dot com
17 年前
PostgreSQL 布尔值 true 变成字符串 "t"
PostgreSQL 布尔值 false 变成字符串 "f"
这很模糊,会导致代码重复。我想知道为什么在获取值时类型没有正确类型化。我们至少可以有一个可选参数来启用该功能。
oracle dot shinoda at gmail dot com
19 年前
如果你想使用对象来获取结果,但因为你似乎无法对结果的每个字段应用函数(例如 stripslashes)而感到犹豫,请尝试这段代码

<?php
// 连接代码、执行查询等等...

$row = pg_fetch_object($result);
$vars = get_object_vars($row);
foreach (
$vars as $key => $var )
{
$row->{$key} = stripslashes($var);
}

?>
robeddielee at hotmail dot com
18 年前
我注意到很多人使用 FOR 循环来提取查询数据。这是我用来提取数据的方法。

<?php
@$members = pg_query($db_conn, 'SELECT id,name FROM boards.members ORDER BY name;');
if (
$members AND pg_num_rows($members)) {
while (
$member = pg_fetch_object($members)) {
echo
$member->name.' ('.$member->id.')';
}
}
?>

如果在上面的代码中发生错误(或者没有返回任何内容),则不会输出任何内容。可以在 IF 中添加一个 ELSE 子句来处理查询错误(或没有返回任何内容)。或者可以使用 ELSEIF 子句对没有返回任何内容的事件进行单独检查。

我喜欢这种方法,因为它不使用任何临时计数器变量。
inbox at bucksvsbytes dot com
22 年前
result_type 参数无效或文档记录不正确,因为“result_type 可选...”段落是从 pg_fetch_array 中直接复制的,并且 PGSQL_NUM 选项与前一段落的“您只能通过字段名称访问数据,而不能通过偏移量访问”相冲突。
偏移量。
Lars at dybdahl dot dk
20 年前
当您检索“带时区的时间戳”字段的内容时,这将设置环境的时区变量。因此,这很危险

$s=$row->mydatefield;
$unixtimestamp=postgresqltimestamp2unix($s);
echo date("Y-m-d H:i:s",$unixtimestamp);

在这里,postgresqltimestamp2unix 是一个将 postgresql 时间戳转换为 Unix 时间戳的函数。上面示例中第一行中字段数据的检索将影响第三行中 date() 函数使用的时区。
ian at eiloart dot com
21 年前
这并没有什么用。例如,如果您执行 foreach($row as $field),那么您仍然会获得每个值两次!

不过,您可以执行以下操作

foreach ($line as $key => $cell){
if (! is_numeric($key)){
echo "<td>$key $cell</td>";
}
}

is is_numeric 够严格吗?
qeremy [atta] gmail [dotta] com
12 年前
将数据库结果获取为对象。

<?php
$qry
= pg_query("SELECT * FROM users");

$rows = array();
while (
$fch = pg_fetch_object($qry)) {
$rows[] = $fch;
}

// or

$rows = array_map(function($a){
return (object)
$a;
}, (array)
pg_fetch_all($qry));
?>
michiel at minas-2 dot demon dot nl
20 年前
我学到的一个用法

$result=$pg_query (...);
$num = pg_numrows($result);

for($count=0;$count < $num && $data=pg_fetch_object($result,$count);$count++)
{
printf("<tr>\n");
printf(" <td>%s</td>\n",$data->foo);
printf(" <td>%s</td>\n",$data->bar);
printf("</tr>\n");
}
To Top