我正试图从mysqli程序迁移到PDO,因为我的网站是一半,一半在PDO,其余的在mysqli程序,现在我想完全转移到PDO。下面是我运行
的代码示例$rowNum = 0;
foreach ($result->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_OBJ) as $row) {
$rowNum = $rowNum + 1;
$dbUsername = $row['Username'];
}
if ($row>0) {
echo $dbUsername;
}
但是在某些情况下,代码给了我一个错误,trying to get property 'Username' of non-object
我知道只使用($result->fetchAll(PDO::FETCH_ASSOC)
是可能的
但是这样做($result->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_OBJ)
成为一种需要,因为我正在修改的代码的一些上下文使用像$row->Usename
这样的符号和其他使用$row['Username
'],我怎么能使它接受上面所示的两种模式?
我尝试使用PDO:: FETCH_BOTH,但问题仍然存在。
正如@YourCommonSense在他的评论中指出的那样,您可以使用PDO::FETCH_LAZY
来完成此操作。然而,你不能用fetchAll
,只能用fetch
:
while ($row = $result->fetch(PDO::FETCH_LAZY)) {
// Both of these will work
$username = $row['Username'];
$username = $row->Username;
}
如果你真的想使用fetchAll
,你必须将行作为一种类型获取,并在数组和对象之间来回转换它们:
foreach ($result->fetchAll(PDO::FETCH_ASSOC) as $row) {
// with PDO::FETCH_ASSOC, $row is an array
$username = $row['Username'];
$row = (object)$row;
// $row is an object now
$username = $row->Username;
$row = (array)$row;
// $row is now an array again
$username = $row['Username'];
}
不可能。你不可能同时得到两者。在PHP中没有办法表示这样的结果。
当你尝试使用PDO::FETCH_ASSOC|PDO::FETCH_OBJ
时,你实际上是在获取PDO::FETCH_COLUMN
的结果。这是因为fetch参数是位标志参数。当您对这些标志进行OR操作时,它与2|5 = 7
相同。7为PDO::FETCH_COLUMN
的值
我不知道你有什么用例,但这听起来像一个XY问题。如果使用fetchAll()
,则不能将其同时作为数组和对象。但是如果你用fetch()
逐行获取,你可以用不同的方式获取每一行。
$res = $pdo->query("SELECT 1 as foo UNION ALL SELECT 2 as foo");
var_dump($res->fetch(PDO::FETCH_ASSOC));
var_dump($res->fetch(PDO::FETCH_OBJ));
/*
Outputs:
array(1) {
["foo"]=>
int(1)
}
object(stdClass)#3 (1) {
["foo"]=>
int(2)
}
*/