我正在尝试从查询结果的第一行中检索特定字段。以下工作正常...
$result = $db->query($query);
$firstrow = $result->fetch();
$desired_field = $firstrow["field"];
我的问题是,我可以在不将第一行结果存储在变量中的情况下一步完成吗?提前致谢!
您可以使用类似$firstrow = $db->query($query)->fetch()
的方法,但对于不能保证返回对象的函数,这不是一个好习惯。
query() 函数可以在错误时返回 FALSE,而对 fetch() 的动态调用将是一个致命错误。您不能调用->fetch()
标量 FALSE 值。
例如,尝试以下操作,您的脚本将爆炸:
$firstrow = $db->query("SELECT * FROM table_that_does_not_exist")->fetch();
PDO 确实支持抛出异常而不是返回 FALSE 的模式,因此在这种情况下,您可以保证query()->fetch()
工作正常,否则 query() 将抛出异常,因此您永远不会遇到致命错误。但是您可能没有使用 PDO 的异常模式。
@GeorgeCummins 的回答指出,fetchColumn()
一旦有了 PDOStatement 对象,您就可以使用一种方法,这是获取单列的好方法。如果您只需要一列,将该列命名为选择列表中的唯一列,然后始终使用fetchColumn(0)
:
$oneValue = $db->query("SELECT oneColumn FROM table")->fetchColumn(0);
否则,如果您使用 fetch(),这将返回一个数组。PHP 5.4 支持数组解引用:
$oneValue = $db->query("SELECT oneColumn FROM table")->fetch()[0];
但如果您使用的是 PHP 5.3 或更早版本,则不支持此功能。而且我从未尝试过使用 PDOStatement 返回的数组,所以如果它实际上返回一个 ArrayObject 或其他东西,这可能无论如何都不起作用。
您可以使用fetchColumn()
从结果集中的下一行返回单列。如果结果集中只有一列,请执行以下操作:
$desired_field = $result->fetchColumn();
如果结果集中有多列,请指定所需列的数字索引:
$desired_field = $result->fetchColumn(1);
注意fetchColumn()
文档中提供的警告:
如果您使用 PDOStatement::fetchColumn() 检索数据,则无法从同一行返回另一列。
当且仅当您的查询正确并且至少有一个行数据时,这保证工作。
$db->query($query)->fetch(PDO::FETCH_OBJ)->field;