简写 PDO 查询

2024-03-19

目前,要使用 PDO 执行查询,我使用以下代码行:

$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

经过一些研究,我发现了执行相同命令的更短方法:

$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$stmt_test->execute([$id])->fetchAll(PDO::FETCH_ASSOC);
$result = $stmt_test->fetchAll(PDO::FETCH_ASSOC);

从那里我想我可以使用以下代码使其变得更短:

$stmt_test = $conn->prepare("SELECT * FROM status WHERE status_id = ?");
$result = $stmt_test->execute([$id])->fetchAll(PDO::FETCH_ASSOC);

但我收到以下错误:

致命错误:在非对象上调用成员函数 fetchAll() /home/.../index.php 第 20 行

问题:为什么我会收到此错误?据我了解,$stmt_test->execute([$id])应该首先执行,然后执行的结果->fetchAll(PDO::FETCH_ASSOC)并从那里将数组返回到$result,但既然错误发生了,我的逻辑一定有问题。我究竟做错了什么?另外,有谁知道更好的速记方法来执行前面的查询?


因此,您已经得到了“为什么我收到此错误”这一问题的答案,但没有得到“简写 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简写 PDO 查询 的相关文章

随机推荐