db->query($sql); $result = $pdo->fe-6ren">
gpt4 book ai didi

php - PDO语句 : Getting different results between `fetchAll($mode);` and `setFetchMode($mode); fetchAll();`

转载 作者:可可西里 更新时间:2023-11-01 13:24:25 27 4
gpt4 key购买 nike

我有一个关于 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);

最佳答案

解释似乎是 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_GROUPFETCH_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 constants 的列表. PDO::FETCH_FUNC 的描述说:

Allows completely customize the way data is treated on the fly (only valid inside PDOStatement::fetchAll()).

所以我们知道至少这个常量只适用于fetchAll(),并且可以假设其他常量可能并非在任何地方都有效。

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

例如 PDO::FETCH_GROUPPDO::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()文档。

关于php - PDO语句 : Getting different results between `fetchAll($mode);` and `setFetchMode($mode); fetchAll();` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620886/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com