PDOStatement fetch / fetchAll参数数组

时间:2014-03-28 17:10:53

标签: php pdo

The PDOStatement class有一个方法

public bool execute ([ array $input_parameters ] )

在执行之前将参数的关联数组绑定到参数化语句。

fetchfetchAll

的等效内容在哪里?

2 个答案:

答案 0 :(得分:3)

看到我的评论是不够的 - 这是一个完整的答案,将赞扬开始回答的用户“你的常识”。

如上所述 - fetch / fetchall补充了execute(如果你正在执行SELECT语句,则需要在执行后使用它)

区别在于获取检索一行,其中fetchAll将获得整个有效负载。如果有效负载较低 - 您可以获取它,然后自己迭代,而无需再次通过提取部分。举个例子:

  $sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY bet';
  try {
    $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST);
    do {
      $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
      print $data;
    } while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));
    $stmt = null;
  }
  catch (PDOException $e) {
    print $e->getMessage();
  }
}

您可以在这种情况下反映抓取并执行$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);然后foreach($rows as $row) $row每行

答案 1 :(得分:1)

这些功能有不同的用途。

execute()用于查询执行,fetchAll()用于结果提取。虽然确实可以使它们互换,但是PDO的作者决定不这样做。这确实是这个非常棒的图书馆的不一致。

所以,你应该轮流打电话给他们。你甚至不能使用方法链接,因为execute返回boolean而不是self。但是,经过轻微的调整,它很有可能。我已经在PDO helper library中创建了它,以便能够像这样调用:

$data = DB::prepare("SELECT * FROM t WHERE id=?")->execute([$id])->fetchAll();

我发现在可用性和兼容性之间取得了相当可接受的权衡