PDOStatement:在`fetchAll($ mode);`和`setFetchMode($ mode)之间获得不同的结果; 使用fetchall();`

use*_*837 6 php arrays pdo fetch

我有一个关于PDO的问题.

两者之间有区别吗?

$sql = "SELECT * FROM pages";
$pdo = $this->db->query($sql);
$result = $pdo->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC); 
Run Code Online (Sandbox Code Playgroud)

$sql = "SELECT * FROM pages";
$pdo = $this->db->query($sql);
$pdo->setFetchMode(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
$result = $pdo->fetchAll();
Run Code Online (Sandbox Code Playgroud)

$result对他们每个人都有所不同.

PHP的关于这些获取模式的文档对我来说不是很清楚.

我有一个包含不同页面的表,我想获取其ID所索引的所有页面.

第一种方法返回:

[
   [id of page 1] => [
      [0] => [ page 1 ],
   ],
   [id of page 2] => [
      [0] => [ page 2 ],
   ],
   ...
]
Run Code Online (Sandbox Code Playgroud)

当我做第二种方法时,我只得到:

[
   [0] => [ page 1 ],
   [1] => [ page 2 ],
   [3] => [ page 3 ],
   ...
]
Run Code Online (Sandbox Code Playgroud)

我希望这样:

[
   [id of page 1] => [ page 1 ],
   [id of page 2] => [ page 2 ],
   [id of page 3] => [ page 3 ],
   ...
]
Run Code Online (Sandbox Code Playgroud)

第一个对我来说足够好,因为我可以使用数组映射函数轻松调整它:

array_map('reset', $result);
Run Code Online (Sandbox Code Playgroud)

Bor*_*rov 5

解释似乎是fetchAll()setFetchMode()支持不同的集合PDO::FETCH__

\n\n

我认为setFetchMode()忽略PDO::FETCH_GROUP,但不是PDO::FETCH_ASSOC

\n\n

我从 PHP 源代码中证实了这一点,请参阅setFetchMode()实现。支持的常量列表setFetchMode不包括PDO::FETCH_GROUP.

\n\n
\n\n

为什么结果是setFetchMode()fetchAll()不同

\n\n

\xc2\xa0代码:

\n\n
<?php\n\n$db = new PDO(\'mysql:host=localhost;dbname=test\', \'root\');\n\n// print the default output, no constants\n$sql = "SELECT * FROM service_table";\n$q = $db->query($sql);\n$result = $q->fetchAll();\necho \'Result 0\' . PHP_EOL;\nvar_dump($result);\n\n// use fetchAll() with constants\n$sql = "SELECT * FROM service_table";\n$q = $db->query($sql);\n$result = $q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);\necho \'Result 1\' . PHP_EOL;\nvar_dump($result);\n\n// use setFetchMode with constants\n$sql = "SELECT * FROM service_table";\n$q = $db->query($sql);\n$q->setFetchMode(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);\n$result = $q->fetchAll();\necho \'Result 2\' . PHP_EOL;\nvar_dump($result);\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xa0测试数据

\n\n
mysql> select * from test.service_table;\n+----+------+\n| id | name |\n+----+------+\n|  1 | one  |\n|  2 | two  |\n+----+------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果 0

\n\n

这是默认值,结果不会分组,并且有基于名称和基于索引的字段:

\n\n
array(2) {\n  [0] =>\n  array(4) {\n    \'id\' => string(1) "1"\n    [0] => string(1) "1"\n    \'name\' => string(3) "one"\n    [1] => string(3) "one"\n  }\n  [1] =>\n  array(4) {\n    \'id\' => string(1) "2"\n    [0] => string(1) "2"\n    \'name\' => string(3) "two"\n    [1] => string(3) "two"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果1

\n\n

这是 的结果$q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC)FETCH_GROUP我们同时具有和 的效果FETCH_ASSOC

\n\n
array(2) {\n  [1] => array(1) {\n    [0] => array(1) {\n      \'name\' => string(3) "one"\n    }\n  }\n  [2] => array(1) {\n    [0] => array(1) {\n      \'name\' => string(3) "two"\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果2

\n\n

这是 的结果$q->setFetchMode(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);,我们只有的效果FETCH_ASSOC

\n\n
array(2) {\n  [0] => array(2) {\n    \'id\' => string(1) "1"\n    \'name\' => string(3) "one"\n  }\n  [1] => array(2) {\n    \'id\' => string(1) "2"\n    \'name\' => string(3) "two"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,FETCH_GROUP适用于fetchAll(),但不适用于setFetchMode()FETCH_ASSOC在这两种情况下都有效。

\n\n

PHP 文档

\n\n

现在,来自文档的间接确认:

\n\n

这是所有PDO 常量的列表。描述为PDO::FETCH_FUNC说:

\n\n
\n

允许完全自定义动态处理数据的方式(仅在内部有效)PDOStatement::fetchAll())。

\n
\n\n

所以我们知道至少这个常数只适用于fetchAll(),并且可以假设其他常数可能并不适用于所有地方。

\n\n

另外,如果我们查看文档fetch(),我们会看到那里的常量列表有限。

\n\n

例如PDO::FETCH_GROUPPDO::FETCH_UNIQUE出现在fetchAll()说明书中,但不出现在说明书中fetch()说明书中。

\n\n

所以我认为与多行操作相关的常量,比如PDO::FETCH_GROUP, 只用于andfetchAll()被忽略fetch()setFetchMode()

\n\n
\n\n

如何获取按 ID 索引的数组

\n\n

我尝试了几种组合,看起来像FETCH_GROUP+FETCH_UNIQUE确实可以。

\n\n

\xc2\xa0代码

\n\n
$sql = "SELECT * FROM service_table";\n$q = $db->query($sql);\n$result = $q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);\nvar_dump($result);\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果

\n\n
array(2) {\n  [1] => array(1) {\n    \'name\' => string(3) "one"\n  }\n  [2] => array(1) {\n    \'name\' => string(3) "two"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一种选择是使用FETCH_FUNC自定义函数来格式化数据,请参阅fetchAll()文档。

\n