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)
解释似乎是fetchAll()和setFetchMode()支持不同的集合PDO::FETCH__。
我认为setFetchMode()忽略PDO::FETCH_GROUP,但不是PDO::FETCH_ASSOC。
我从 PHP 源代码中证实了这一点,请参阅setFetchMode()实现。支持的常量列表setFetchMode不包括PDO::FETCH_GROUP.
setFetchMode()和fetchAll()不同<?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);\nRun Code Online (Sandbox Code Playgroud)\n\nmysql> select * from test.service_table;\n+----+------+\n| id | name |\n+----+------+\n| 1 | one |\n| 2 | two |\n+----+------+\nRun Code Online (Sandbox Code Playgroud)\n\n这是默认值,结果不会分组,并且有基于名称和基于索引的字段:
\n\narray(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}\nRun Code Online (Sandbox Code Playgroud)\n\n这是 的结果$q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC)。FETCH_GROUP我们同时具有和 的效果FETCH_ASSOC:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n这是 的结果$q->setFetchMode(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);,我们只有的效果FETCH_ASSOC:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n这样,FETCH_GROUP适用于fetchAll(),但不适用于setFetchMode()。FETCH_ASSOC在这两种情况下都有效。
现在,来自文档的间接确认:
\n\n这是所有PDO 常量的列表。描述为PDO::FETCH_FUNC说:
\n\n\n允许完全自定义动态处理数据的方式(仅在内部有效)
\nPDOStatement::fetchAll())。
所以我们知道至少这个常数只适用于fetchAll(),并且可以假设其他常数可能并不适用于所有地方。
另外,如果我们查看文档fetch(),我们会看到那里的常量列表有限。
例如PDO::FETCH_GROUP和PDO::FETCH_UNIQUE出现在fetchAll()说明书中,但不出现在说明书中fetch()说明书中。
所以我认为与多行操作相关的常量,比如PDO::FETCH_GROUP, 只用于andfetchAll()被忽略fetch()setFetchMode()。
我尝试了几种组合,看起来像FETCH_GROUP+FETCH_UNIQUE确实可以。
$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);\nRun Code Online (Sandbox Code Playgroud)\n\narray(2) {\n [1] => array(1) {\n \'name\' => string(3) "one"\n }\n [2] => array(1) {\n \'name\' => string(3) "two"\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n另一种选择是使用FETCH_FUNC自定义函数来格式化数据,请参阅fetchAll()文档。
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |