简写 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 查询 的相关文章

  • 如何更新 mongodb PHP 中的所有文档

    我正在设置一个 cronjob 来更新该字段views 15关于集合中的所有文档query 这就是我所拥有的 应该有效 update array set gt array views 15 gt 0 db gt queries gt upd
  • 创建前判断MySQL表索引是否存在

    我们系统的自动数据库迁移过程涉及运行包含新表定义及其附带索引的 sql 脚本 仅当这些表和索引尚不存在时 我才需要能够创建它们 表是通过使用 IF NOT EXISTS 来处理的 但创建索引时不存在这样的语法 我尝试编写一个存储过程 如下所
  • SQL 连接中的多个条件

    如何指定多个条件SQL加入 我知道A key B key除此之外是强制性的 以下对于指定多个条件是否正确SQL ON A key B key and or cond1 and or cond2 etc OR ON A key B key w
  • 当 mysql_connect 不适用于 IIS 上的 PHP 时,不会返回任何错误消息

    我是 PHP 和 MySQL 的新手 最近在已经运行 IIS v6 的 Windows Server 2003 服务器上安装了 PHP v5 3 10 和 MySQL v 5 5 21 PHP 运行 我已经从 MySQL 5 5 命令行客户
  • SQL错误:1054,SQLState:42S22“字段列表”中的未知列错误Java Spring Boot Mysql错误

    基本上我正在尝试制作一个简单的促销页面 我收到的错误是 SQL 错误 1054 SQLState 42S22 错误是 字段列表 中的未知列 promotion0 promo type id 这是模型类 package promotions
  • 在 PHP 中自动加载类的最佳方法

    我正在开发一个项目 该项目具有以下文件结构 index php lib lib type class name php lib size example class php 我想自动加载类 class name 和 example clas
  • PHP 警告:模块“imagick”已在第 0 行未知加载

    我有一个简单的测试文件 其中唯一的 php 代码是 if isset REQUEST back back back REQUEST back filename images back jpg file file exists filenam
  • 调用不同 SELECT 语句的 MySQL IF/CASE 语法

    我在使用 MySQL 时遇到问题IF or CASE syntax 程序是这样的 我有一个调用 MySQL 查询的 PHP 项目 假设 PHP 传递变量X If X is not 0那么它应该执行如下查询 SELECT FROM table
  • 提交表单问题... Enter key

    我有一个包含几个下拉列表和一个文本字段以及一个按钮的表单 当我单击按钮时 将调用 ajax 函数 ajax 然后调用一个 php 函数 该函数从 mysql 数据库获取结果 问题是我不能通过在表单中 按回车键来完成同样的事情 页面只会刷新
  • 如何提取 MySQL 日期中的月份和年份并进行比较?

    如何从 mySQL 日期中提取月份和日期并将其与另一个日期进行比较 我找到了 this MONTH 但它只获取月份 我寻找月份和年份 在Mysql Doku中 http dev mysql com doc refman 5 5 en dat
  • Lucene外来字符问题

    我在使用 Zend Lucene 和 等外来字符时遇到了一些严重的问题 这些问题在创建索引和查询索引时都会出现 我已经尝试过 iso 8859 1 和 utf 8 ISO 8859 1 不起作用的查询看起来像 area sk ne 使用 Z
  • 当我只想更改一个列属性时,是否必须在 SQL 语句中包含所有列属性?

    我有一个 MySQL 数据库 我想通过向所有列添加注释来进行注释 从我读到的MySQL 文档 http dev mysql com doc refman 5 5 en alter table html 在更改其中任何一个时 必须包括数据类型
  • 解析日期字符串

    我在 post 变量中有这个字符串 03 21 2011 我需要通过php解析它并将其转换成这种格式 2011 03 21 我正在使用 php 我需要这种格式 以便我可以运行此查询 SELECT prospect as Prospect c
  • @mysql_connect 和 mysql_connect

    我使用 PHP 连接到数据库没有问题 但是在我测试过的一些脚本中 我发现连接命令存在细微差别 有什么区别 mysql connect and mysql connect 我从未使用过 编写我自己的脚本时使用的符号 所以只是想知道它是否有用
  • 使用Ajax使用php将记录插入mysql数据库

    如何使用 Ajax 对此代码进行编码 请帮助 我是 Bignner 我已经编写了这段代码 它可以工作 但我想与 ajax 一起使用 因为不想重新加载页面 PHP文件 Code For Making Form And getting Data
  • 好的 PHP 开源分析/统计软件吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在构建的网址缩短服务需要向用户显示一些基本的点击统计信息 点击次数 转化次数 引用域和国家 地区
  • PHP - 如何查看服务器是否支持 TLS 1.0?

    我正在编写一个简单的检查器 您可以在其中输入一个 URL 该检查器将检查输入的 URL 是否使用 TLS 1 0 1 1 或 1 2 本质上 我想显示一条消息 Yoursite com 正在使用 TLS 1 0 建议禁用此功能 问题是 只有
  • 使用哈希检查具有 $_POST 值的页面是否已刷新

    当将表单发布到同一个PHP页面时 正确的方法是什么来查找页面是否被意外刷新而不是再次提交 这是我现在正在使用的 tmp implode POST myHash md5 tmp if isset SESSION myHash SESSION
  • 从 MySQL 执行 shell 命令

    我知道我正在寻找的可能是一个安全漏洞 但由于我设法在 Oracle 和 SQL Server 中做到了这一点 所以我会尝试一下 我正在寻找一种从 MySQL 上的 SQL 脚本执行 shell 命令的方法 如有必要 可以创建和使用新的存储过
  • 如何提高MySQL INSERT和UPDATE性能?

    我们数据库中的 INSERT 和 UPDATE 语句的性能似乎正在下降 并导致我们的 Web 应用程序性能不佳 表是InnoDB 应用程序使用事务 我可以做一些简单的调整来加快速度吗 我认为我们可能会遇到一些锁定问题 我怎样才能找到答案 你

随机推荐