Php PDO语句:在'fetchAll($mode);`和` setFetchMode($mode);fetchAll()`
我有一个关于PDO的问题 两者之间有区别吗Php PDO语句:在'fetchAll($mode);`和` setFetchMode($mode);fetchAll()`,php,arrays,pdo,fetch,Php,Arrays,Pdo,Fetch,我有一个关于PDO的问题 两者之间有区别吗 $sql = "SELECT * FROM pages"; $pdo = $this->db->query($sql); $result = $pdo->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC); 及 ? 我为每一个都得到了不同的$result PHP中关于这些获取模式的文档对我来说不是很清楚 我有一个包含不同页面的表,我想获取所有按ID索引的页面 第一个方法返回: [ [id
$sql = "SELECT * FROM pages";
$pdo = $this->db->query($sql);
$result = $pdo->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
及
?
我为每一个都得到了不同的$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);
解释似乎是
fetchAll()
和setFetchMode()
支持不同的PDO::FETCH\uuu
常量集
我认为setFetchMode()
忽略了PDO::FETCH_GROUP
,而不是PDO::FETCH_ASSOC
我从PHP源代码中确认了这一点,请参见实现。setFetchMode
支持的常量列表不包括PDO::FETCH_GROUP
为什么
setFetchMode()
和fetchAll()
的结果不同
守则:
结果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\u组
和FETCH\u ASSOC
的效果:
array(2) {
[1] => array(1) {
[0] => array(1) {
'name' => string(3) "one"
}
}
[2] => array(1) {
[0] => array(1) {
'name' => string(3) "two"
}
}
}
array(2) {
[0] => array(2) {
'id' => string(1) "1"
'name' => string(3) "one"
}
[1] => array(2) {
'id' => string(1) "2"
'name' => string(3) "two"
}
}
结果2
这是$q->setFetchMode(PDO::FETCH_GROUP | PDO::FETCH_ASSOC)的结果代码>,我们只有FETCH\u ASSOC
的作用:
array(2) {
[1] => array(1) {
[0] => array(1) {
'name' => string(3) "one"
}
}
[2] => array(1) {
[0] => array(1) {
'name' => string(3) "two"
}
}
}
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\u GROUP
适用于fetchAll()
,但不适用于setFetchMode()
<代码>获取助理
在这两种情况下都有效
PHP文档
现在,来自文档的间接确认:
这是所有的清单。PDO::FETCH_FUNC
的说明如下:
允许完全定制动态处理数据的方式(仅在PDOStatement::fetchAll()内部有效)
所以我们知道,至少这个常量只适用于fetchAll()
,并且可以假设其他常量可能不适用于任何地方
另外,如果我们查看文档,我们会看到一个有限的常量列表
例如,PDO::FETCH_组
和PDO::FETCH_UNIQUE
在说明中存在,但在FETCH()
说明中不存在
因此,我认为与多行操作相关的常量,例如PDO::FETCH_GROUP
,只用于fetchAll()
,而被FETCH()
和setFetchMode()
忽略
如何获取按ID索引的数组
我尝试了几个组合,看起来像是FETCH\u GROUP
+FETCH\u UNIQUE
做到了
代码
结果
另一个选项是使用带有自定义函数的FETCH_FUNC
来格式化数据,请参阅文档。哦,我不认为这是相关的,因为我只是问这两者之间是否有区别,如果有,是什么。。。但是如果我添加它可能会更好这里应该有任何不同,所以我添加了一个它返回什么的示例,区别是什么,因为对我来说,代码应该返回相同的…我认为你最好在这里删除你的示例,我们在问题中已经有一个示例,所以最好只解释原因,这不是一个新的例子。@TaReQMahMooD这个问题只涉及fetchall和setFetchMode之间的区别。我的解释是基于将它们与问题中不存在的默认行为(非标志)进行比较。如果我删除示例,恐怕遵循逻辑会很复杂。谢谢,这是一个很好的解释,示例只是支持了它,享受赏金:)@Arth谢谢,我还能够从php源代码中确认我的假设,setFetchMode忽略了FETCH_组。我更新了答案。
array(2) {
[0] => array(2) {
'id' => string(1) "1"
'name' => string(3) "one"
}
[1] => array(2) {
'id' => string(1) "2"
'name' => string(3) "two"
}
}
$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"
}
}