public bool execute ([ array $input_parameters ] )
在执行之前将参数的关联数组绑定到参数化语句。
fetch
或fetchAll
答案 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();
我发现在可用性和兼容性之间取得了相当可接受的权衡