在PDO fetchAll()中组合FETCH_OBJ和FETCH_ASSOC可能吗?



我正试图从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)
}
*/

最新更新