PHP Conference Japan 2024

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 实例;以前,期望的是一个 资源

范例

示例 #1 pg_fetch_object() 示例

<?php

$database
= "store";

$db_conn = pg_connect("host=localhost port=5432 dbname=$database");
if (!
$db_conn) {
echo
"连接 postgres 数据库 $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 个笔记

10
ekevu at yahoo dot com
17 年前
PostgreSQL 布尔值 true 变成字符串 "t"
PostgreSQL 布尔值 false 变成字符串 "f"
这不明确,并导致代码重复。我想知道为什么在获取值时类型没有正确地进行类型转换。我们至少可以有一个可选的参数来启用它。
2
oracle dot shinoda at gmail dot com
20 年前
如果您希望对结果使用对象,但因为似乎无法对结果的每个字段应用函数(例如 stripslashes)而却步,请尝试以下代码

<?php
// 连接数据库,执行查询等代码...

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

?>
0
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子句对没有返回任何内容的情况进行单独检查。

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

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

这里,postgresqltimestamp2unix是一个将PostgreSQL时间戳转换为Unix时间戳的函数。上面示例第一行中字段数据的检索将影响第三行中date()使用的时区。
-2
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_numeric是否足够严格?
-2
qeremy [atta] gmail [dotta] com
12年前
将数据库结果作为对象获取。

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

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

// 或者

$rows = array_map(function($a){
return (object)
$a;
}, (array)
pg_fetch_all($qry));
?>
-4
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