我有一个关于PDO的问题。
有什么区别吗
$sql = "SELECT * FROM pages";
$pdo = $this->db->query($sql);
$result = $pdo->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC); 和
$sql = "SELECT * FROM pages";
$pdo = $this->db->query($sql);
$pdo->setFetchMode(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
$result = $pdo->fetchAll();我为他们每个人得到一个不同的$result。
PHP提供的关于这些获取模式的文档对我来说并不十分清楚。
我有一个具有不同页面的表,我想获取所有按ID索引的页面。
第一个方法返回以下内容:
[
[id of page 1] => [
[0] => [ page 1 ],
],
[id of page 2] => [
[0] => [ page 2 ],
],
...
]当我执行第二种方法时,我只得到:
[
[0] => [ page 1 ],
[1] => [ page 2 ],
[3] => [ page 3 ],
...
]我想要这样:
[
[id of page 1] => [ page 1 ],
[id of page 2] => [ page 2 ],
[id of page 3] => [ page 3 ],
...
]第一个对我来说已经足够好了,因为我可以使用数组映射函数轻松地调整它:
array_map('reset', $result);发布于 2016-01-14 00:22:16
原因似乎是fetchAll()和setFetchMode()支持不同的PDO::FETCH__常量集。
我认为setFetchMode()忽略了PDO::FETCH_GROUP,但没有忽略PDO::FETCH_ASSOC。
我从PHP源代码中确认了这一点,请参阅setFetchMode()实现。setFetchMode支持的常量列表不包括PDO::FETCH_GROUP。
为什么setFetchMode()和fetchAll()的结果不同?
守则:
<?php
$db = new PDO('mysql:host=localhost;dbname=test', 'root');
// print the default output, no constants
$sql = "SELECT * FROM service_table";
$q = $db->query($sql);
$result = $q->fetchAll();
echo 'Result 0' . PHP_EOL;
var_dump($result);
// use fetchAll() with constants
$sql = "SELECT * FROM service_table";
$q = $db->query($sql);
$result = $q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
echo 'Result 1' . PHP_EOL;
var_dump($result);
// use setFetchMode with constants
$sql = "SELECT * FROM service_table";
$q = $db->query($sql);
$q->setFetchMode(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
$result = $q->fetchAll();
echo 'Result 2' . PHP_EOL;
var_dump($result);试验数据
mysql> select * from test.service_table;
+----+------+
| id | name |
+----+------+
| 1 | one |
| 2 | two |
+----+------+结果0
这是默认的,结果没有分组,并且有基于名称和基于索引的字段:
array(2) {
[0] =>
array(4) {
'id' => string(1) "1"
[0] => string(1) "1"
'name' => string(3) "one"
[1] => string(3) "one"
}
[1] =>
array(4) {
'id' => string(1) "2"
[0] => string(1) "2"
'name' => string(3) "two"
[1] => string(3) "two"
}
}结果1
这是$q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC)的结果。我们有FETCH_GROUP和FETCH_ASSOC的影响
array(2) {
[1] => array(1) {
[0] => array(1) {
'name' => string(3) "one"
}
}
[2] => array(1) {
[0] => array(1) {
'name' => string(3) "two"
}
}
}结果2
这是$q->setFetchMode(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);的结果,我们只有FETCH_ASSOC的效果。
array(2) {
[0] => array(2) {
'id' => string(1) "1"
'name' => string(3) "one"
}
[1] => array(2) {
'id' => string(1) "2"
'name' => string(3) "two"
}
}这样,FETCH_GROUP适用于fetchAll(),但不适用于setFetchMode()。FETCH_ASSOC在这两种情况下都可以工作。
PHP文档
现在,文档的间接确认:
这是所有PDO常数的列表。对PDO::FETCH_FUNC的描述是:
允许完全自定义动态处理数据的方式(仅在
PDOStatement::fetchAll()中有效)。
因此,我们知道,至少这个常数只适用于fetchAll(),并且可以假定其他常量可能不是在任何地方都起作用。
另外,如果我们查看fetch()的文档,就会看到有限的常量列表。
例如,PDO::FETCH_GROUP和PDO::FETCH_UNIQUE在fetchAll()描述中存在,但在fetch()描述中不存在。
因此,我认为与多行操作(如PDO::FETCH_GROUP )相关的常量仅用于fetchAll(),而被fetch()和setFetchMode()忽略。
如何获取按ID索引的数组
我尝试了几个组合,看起来好像是FETCH_GROUP + FETCH_UNIQUE做的。
违约金守则
$sql = "SELECT * FROM service_table";
$q = $db->query($sql);
$result = $q->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);
var_dump($result);结果
array(2) {
[1] => array(1) {
'name' => string(3) "one"
}
[2] => array(1) {
'name' => string(3) "two"
}
}另一种选择是使用带有自定义函数的FETCH_FUNC来格式化数据,请参阅fetchAll()文档。
https://stackoverflow.com/questions/20620886
复制相似问题