php - 速记PDO查询

标签 php mysql pdo

目前要使用 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);

但是我得到以下错误:

Fatal error: Call to a member function fetchAll() on a non-object in /home/.../index.php on line 20

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

最佳答案

所以您已经得到了“为什么我会收到此错误”这个问题的答案,但没有得到“速记 PDO 查询”的答案。

为此我们需要一些叫做“编程”的东西。

关于编程的一件有趣的事情是,我们不局限于现有的工具,就像其他职业一样。通过编程,我们始终可以创建自己的工具,然后开始使用它,而不是使用一整套旧工具。

而面向对象编程尤其擅长于此,因为我们可以采用现有对象并仅添加一些功能,其余部分保持原样。

例如,假设我们想要一种在 PDO 中运行准备好的查询的简写方式。我们所需要做的就是使用新的简写方法扩展 PDO 对象。最难的部分是为新方法命名。

剩下的很简单:你只需要几行代码

class MyPDO extends PDO
{
    public function run($sql, $bind = NULL)
    {
        $stmt = $this->prepare($sql);
        $stmt->execute($bind);
        return $stmt;
    }
}

这是您需要的所有代码。您可以将其存储在存储数据库凭据的同一文件中。请注意,此添加不会以任何方式影响您现有的代码 - 它保持完全相同,您可以像往常一样继续使用所有现有的 PDO 功能。

现在您只需更改 PDO 构造函数中的 2 个字母,将其命名为

$conn = new MyPDO(...the rest is exactly the same...);

您可以立即开始使用 Shiny 的新工具:

$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]);

更不用说后者并不总是可用的,因为它只适用于获取数组。虽然使用真正的速记,但任何结果格式都是可能的:

$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

关于php - 速记PDO查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37504649/

相关文章:

php - 正则表达式 mysql 函数

php - 当我使用 PDO PHP 查询 MySQL 数据库时出现令人困惑的错误

jquery - 使用 PDO、CSS 和 JQUERY 的数据表问题

mysql - 根据前一行中的值计算列值

php - MySql 查询 : DELETE FROM. 语法错误或访问冲突:1064

php - 带有连接的 mysql 查询的可能规范化

php - 如何在 ubuntu 上启用 ZTS 重新编译 php?

php - 关于PHP/MySQL密码安全的问题

php - 如何获取表2中没有的值

MySql 存储过程 - 错误 1172 (42000) : Result consisted of more than one row