- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
db->query($sql); $result = $pdo->fe-6ren">
我有一个关于 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 |
+----+------+
这是默认的,结果没有分组,并且有基于名称和基于索引的字段:
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"
}
}
这是 $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"
}
}
}
这是$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
适用于这两种情况。
现在,来自文档的间接确认:
这是所有 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_GROUP
和 PDO::FETCH_UNIQUE
出现在 fetchAll()
中描述,但不存在于 fetch()
描述中。
所以我认为与多行操作相关的常量,比如PDO::FETCH_GROUP
,只用于fetchAll()
,被fetch( )
和 setFetchMode()
。
我尝试了几种组合,看起来像 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/
我在以下查询的 Criteria API 中调用 SetFetchMode 时遇到问题: DetachedCriteria.For() .Add(u => u.Stat
我正在使用 PEAR 的 MDB2 连接到我的 MySQL 数据库。 我以前从未遇到过问题,但这个特定的主机给我带来了问题。 起初我以为这是用户凭据,但我已经使用标准 MySQL 代码在同一个文件上进
我正在使用 drupal 7,在 PHP 7 上,在 Windows 上的 Xampp 上,突然我开始收到以下错误: Call to undefined method DatabaseStatemen
在我被钉在十字架上之前,我已经研究了一个星期,如果有人能提供帮助,我将不胜感激。我还阅读了该平台上所有关于 password_hash 和 password_verify 的文章,但是没有一个解决方案
我有一个简单的 Criteria ,像这样: final Criteria players = session.createCriteria(Players.class).add(Restri
我正在寻找一些关于 Hibernate.initialize(list) 和 setFetchMode 之间区别的解释...... 据我了解,它们具有相同的目的:加载惰性集合。 还有什么事吗? 我可以
问题: 第一:使用update语句+PDO准备更新数据 第二:更新数据后,推送返回数据,不使用select语句 注意:如果我在更新执行后使用 select sql 语句,我可以获得结果,但我只想使用更
在 Codeigniter 中,如何将数据库查询的结果集提取到模型中?在 native PHP PDO 引擎中,我有类似的东西: $pdo->setFetchMode(PDO::FETCH_INTO,
在 Criteria 中,我将 SetFetchMode 作为 Lazy 执行,但仍然获取所有项目,我该如何解决这个问题? public class MenuItem : BaseClass {
嗯,我正在尝试查询一些数据并显示结果,并查看 row_count。下面是我正在使用的代码: query($sql); $q->setFetchMode(PDO::FETCH_ASSO
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is is possible to set a default PDO fetch mode? 我已经搜索了
我正在努力创建一个 Hibernate 条件查询,它使用 setFetchMode(... SELECT) 并对返回的子记录进行限制。如果我按照推荐使用 creteAlias,它会产生一个内部连接,从
我有一个多对多的关系,我试图获取渴望的关系: *.CreateCriteria(typeof(Class1)) .SetFetchMode("Class2", FetchMode.Eager) .Se
我的 AJAX 中的 php 脚本遇到以下错误。 fatal error :在非对象上调用成员函数 setFetchMode()。实际上我已经编写了一个存储过程来创建动态临时表。请在下面找到存储过程和
我有一个关于 PDO 的问题。 有区别吗 $sql = "SELECT * FROM pages"; $pdo = $this->db->query($sql); $result = $pdo->fe
我是一名优秀的程序员,十分优秀!