【问题标题】:Trying to create a query function for PDO尝试为 PDO 创建查询函数
【发布时间】:2011-11-02 04:02:45
【问题描述】:

在编写脚本时,我不断地输入 $db->prepare()'s 和 $stmt->bindParam()'s。我正在寻找一种将其整合到一个函数中的方法。这是我目前所拥有的。

$sql = "SELECT (name, email) FROM users WHERE VALUES (:name, :email)"
$values = array(':name' => 'my_name', ':email' => 'blahblah@example.com', );

    function db_query($sql, $values) {
    global $db; //Database object

        $stmt = $db->prepare($sql);

        foreach($values as $placeholder => $value) {
            $stmt->bindParam($placeholder, $value);

        }

        $stmt->execute();

        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        return $result;
      }

这对于大多数查询是否足够?这是一种安全的方法吗?

我只想让查询运行并返回它返回的任何内容(NULL、值、错误等...)。

谢谢。

【问题讨论】:

  • 你不能用$stmt->execute($values);替换那个foreach循环吗?
  • 应该够用,只要能用就行。为您将要执行的每个项目编写一些测试用例,获取/插入/删除/更新。我倾向于让“查询”是一个实际的查询,并编写一个单独的函数来获取 IE fetchAll fetchOne,但我也只是用我自己的包装器扩展 PDO 类,所以我不必搞砸全球业务。 :) 查看它是否足够且有效的最佳方法......是测试它并查看。
  • +1 表示这里的问题非常罕见。
  • Brad,fetch 和 fetchall 是从查询中获取结果的仅有的两种方法吗?感谢您的帮助

标签: php pdo


【解决方案1】:

您的代码将无法按预期工作,因为 bindParam() 将占位符名称(第一个参数)绑定到第二个参数中的变量 reference

使用您的示例,这将导致所有参数设置为 blahblah@example.com,因为它是循环中的最后一个 $value

如 cmets 中所述,只需使用 $stmt->execute($values)。见http://php.net/manual/en/pdostatement.execute.php

如果您真的想继续循环,请改用PDOStatement::bindValue()

【讨论】:

  • 好的,谢谢。 $result 变量是否“正确”,因为无论 SELECT、UPDATE、DELETE 等如何,它都会返回查询发回的任何内容。使用 mysql 函数我这样做了:$result = mysql_query($query);感谢您的帮助。
  • @Brandon 鉴于我回答中的信息,我反对创建这个包装函数。
  • 好的。是否有“最佳实践”方法来删除大量冗余 PDO 代码?我实际上将 Drupal 的 db_query 视为灵感。我的很多代码都只是prepare() 和execute()。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2023-02-22
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多