【问题标题】:fetchAll() - Is really necessary?fetchAll() - 真的有必要吗?
【发布时间】:2018-09-13 18:50:53
【问题描述】:

示例 1°:

$stmt = 'SELECT * FROM table ORDER BY id DESC LIMIT 2';
$Dp = $conn->query($stmt)->fetchAll();

示例 2°:

$stmt = 'SELECT * FROM table ORDER BY id DESC LIMIT 2';
$Dp = $conn->query($stmt);

这两个例子有什么区别?我是 PDO 的新手,我看不出这两个示例之间的区别。

【问题讨论】:

  • var_dump($Dp); 你会看到区别
  • 示例 1 返回一个包含结果集中所有剩余行的数组。该数组将每一行表示为列值数组或具有与每个列名称对应的属性的对象。如果要获取的结果为零,则返回一个空数组,如果失败则返回 FALSE。
  • @PrathapG 在此代码上放置fetchAll() 的目的是什么?

标签: pdo fetchall


【解决方案1】:

这有点取决于你想对结果做什么。

您从中获得的实际数据结构非常不同,但您可能会问这个问题,因为您可以使用foreach 循环遍历结果。

但是fetchAll() 返回一个纯 PHP 数组,而 query 返回一个带有隐藏内部的 PHP 对象。您可以(例如)调用 json_encode 的两个之一。

通常直接循环 PDOStatement 可能会快一点,因为您没有创建(可能很大)中间数组。

【讨论】:

  • 我应该换个方式问它,以澄清我的问题。我实际上想知道我是否应该将fetchAll() 放在我的代码上,因为我可以看到......在网页上显示结果时没有任何区别。
  • @Susi 如果在您的情况下没有明显差异,您可能会通过不使用 fetchAll() 获得轻微的性能优势。*但是*从严格的架构设计角度来看,我不确定我是否想要我的模型层“泄漏” PDOStatement 对象。 也没有错,所以做你最舒服的事。从架构上讲,我更喜欢返回普通的 PHP 数组,因为在您的应用程序中有些情况您需要对 MySQL 查询的结果进行后处理,如果您从一开始就返回数组,您可以保持 100% 的一致性。
  • 'leak' PDOStatement objects 我不确定我是否理解这部分内容。你的意思是如果我不使用fetchAll() 我可能会遇到一些安全问题?
  • 不,我指的是“泄漏抽象”的“泄漏”。您的模型层应该“抽象”数据库访问。这里没有安全问题。
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2017-10-29
  • 1970-01-01
相关资源
最近更新 更多