PostgreSQL 布尔值 true 变成字符串 "t"
PostgreSQL 布尔值 false 变成字符串 "f"
这不明确,并导致代码重复。我想知道为什么在获取值时类型没有正确地进行类型转换。我们至少可以有一个可选的参数来启用它。
(PHP 4, PHP 5, PHP 7, PHP 8)
pg_fetch_object — 将一行作为对象获取
$result
,$row
= null
,$class
= "stdClass",$constructor_args
= []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
对象的构造函数。
当 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);
?>
PostgreSQL 布尔值 true 变成字符串 "t"
PostgreSQL 布尔值 false 变成字符串 "f"
这不明确,并导致代码重复。我想知道为什么在获取值时类型没有正确地进行类型转换。我们至少可以有一个可选的参数来启用它。
如果您希望对结果使用对象,但因为似乎无法对结果的每个字段应用函数(例如 stripslashes)而却步,请尝试以下代码
<?php
// 连接数据库,执行查询等代码...
$row = pg_fetch_object($result);
$vars = get_object_vars($row);
foreach ( $vars as $key => $var )
{
$row->{$key} = stripslashes($var);
}
?>
我注意到很多人使用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子句对没有返回任何内容的情况进行单独检查。
我喜欢这种方法,因为它不使用任何临时计数器变量。
result_type参数无效或文档记录不正确,因为“result_type是可选的...”段落是从pg_fetch_array逐字复制的,而PGSQL_NUM选项与前面一段落“您只能通过字段名称访问数据,而不能通过它们的”相冲突。
偏移量。
当您检索“带时区的时间戳”字段的内容时,这将设置环境的时区变量。因此,这是危险的
$s=$row->mydatefield;
$unixtimestamp=postgresqltimestamp2unix($s);
echo date("Y-m-d H:i:s",$unixtimestamp);
这里,postgresqltimestamp2unix是一个将PostgreSQL时间戳转换为Unix时间戳的函数。上面示例第一行中字段数据的检索将影响第三行中date()使用的时区。
这并没有多大用处。例如,如果您执行foreach($row as $field),那么您仍然会得到每个值两次!
不过,您可以执行以下操作
foreach ($line as $key => $cell){
if (! is_numeric($key)){
echo "<td>$key $cell</td>";
}
}
is_numeric是否足够严格?
将数据库结果作为对象获取。
<?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));
?>
我学到的一些使用方法
$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");
}