Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO语句:在'fetchAll($mode);`和` setFetchMode($mode);fetchAll()`_Php_Arrays_Pdo_Fetch - Fatal编程技术网

Php PDO语句:在'fetchAll($mode);`和` setFetchMode($mode);fetchAll()`

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

我有一个关于PDO的问题

两者之间有区别吗

$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"
  }
}