php 是否可以在PDO fetchAll()中组合FETCH_OBJ和FETCH_ASSOC?

j2cgzkjk  于 2023-01-24  发布在  PHP
关注(0)|答案(2)|浏览(106)

我正在尝试从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,但问题仍然存在。

332nm8kg

332nm8kg1#

正如@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'];
}
bz4sfanl

bz4sfanl2#

这是不可能的。你不可能同时得到这两个结果。在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)
}
*/

相关问题