因此,您已经得到了“为什么我收到此错误”这一问题的答案,但没有得到“简写 PDO 查询”的答案。
为此,我们需要一些称为“编程”的东西。
关于编程的一件有趣的事情是,我们并不局限于现有的工具,就像其他职业一样。通过编程,我们总是可以创建自己的工具,然后开始使用它而不是一整套旧工具。
面向对象编程尤其擅长于此,因为我们可以采用现有对象并仅添加一些功能,而其余部分保持原样。
例如,假设我们想要一种简写方式来在 PDO 中运行准备好的查询。我们所需要的只是extend使用新的简写方法的 PDO 对象。最困难的部分是给新方法命名。
剩下的很简单:您只需要几行代码
class MyPDO extends PDO
{
public function run($sql, $bind = NULL)
{
$stmt = $this->prepare($sql);
$stmt->execute($bind);
return $stmt;
}
}
This is 所有代码你需要。您可以将其存储在存储数据库凭据的同一文件中。注意这个添加不会影响您现有的代码无论如何 - 它保持完全相同,您可以像往常一样继续使用所有现有的 PDO 功能。
现在您只需更改 PDO 构造函数中的 2 个字母,将其调用为
$conn = new MyPDO(...the rest is exactly the same...);
您可以立即开始使用闪亮的新工具:
$sql = "SELECT * FROM myTable WHERE id = :id";
$result = $conn->run($sql, ['id' => $id])->fetchAll(PDO::FETCH_ASSOC);
或者,对其进行一些优化,
$result = $conn->run("SELECT * FROM myTable WHERE id = ?", [$id])->fetchAll();
因为您始终可以一次性设置默认获取模式,并且对于单个变量,命名占位符没有用处。这使得这段代码成为真正的速记与接受的答案相比,
$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$stmt_test->execute([$id]);
$result = $stmt_test->fetchAll(PDO::FETCH_ASSOC);
甚至是你迄今为止得到的最好的答案,
$result = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$result->execute([$id]);
更不用说后者并不总是可用,因为它仅适合获取数组。虽然与real任何结果格式都可以简写:
$result = $conn->run($sql, [$id])->fetchAll(); // array
$result = $conn->run($sql, [$id])->fetch(); // single row
$result = $conn->run($sql, [$id])->fetchColumn(); // single value
$result = $conn->run($sql, [$id])->fetchAll(PDO::FETCH_*); // dozens of different formats