【问题标题】:Running queries in PDO without binding在不绑定的 PDO 中运行查询
【发布时间】:2014-04-25 07:50:08
【问题描述】:

您可以在不准备的情况下在 PDO 中运行查询吗?我知道这可能会出现 SQL 注入问题,但我处于测试环境中。

我希望能够编写纯 MySQL 查询并执行它们,而不必准备查询、绑定占位符等...

我希望能够立即执行如下查询。

INSERT INTO table (table_id, car, bike, date) VALUES (1, 'bmw', 'suzuki', 2004)

我似乎遇到了直接在这个查询上运行 execute() 的错误。

提前致谢。

【问题讨论】:

  • 这看起来不像是有效的 sql,尤其是在你有一个字符串 bmw 没有包含在 ' 中的部分?也许这是你的问题?
  • @Nanne 你的语法是正确的,但它仍然失败,答案如下。谢谢

标签: php


【解决方案1】:

prepared statements 的思想主要不是你可以绑定参数,而是你可以多次重用编译后的语句,这应该会提高效率。

准备-执行工作流对于一次性用例来说并不太方便,但 PDO 也提供了其他方法:

  • exec 执行一条语句并返回受影响的行数。它对初始化有用,但对SELECTs 无效。
  • query 对于不涉及不受信任输入的静态查询很有用。它类似于prepare-execute,但不允许参数,并且不允许重用已编译的查询。

由于这些限制,它们通常只能用于静态查询(即查询是纯字符串,而不是由变量连接构成)。

您可以使用 quote 方法安全地转义用户输入,因此您可以执行类似的操作

// untrusted data:
$car = 'bmw';
$bike = 'suzuki';
$year = 2004;
...
$dbh->exec('INSERT INTO table (table_id, car, bike, date) VALUES (1, '. $dbh->quote($car) .', '. $dbh->quote($bike) .', '. $dbh->quote($year) .')');

但这太不方便了,你最终会使用

$dbh->prepare('INSERT INTO table (table_id, car, bike, date) VALUES (1, :car, :bike, :year)')
    ->execute(array(':car' => $car, ':bike' => $bike, ':year' => $year));

改为。

【讨论】:

    【解决方案2】:

    不要使用PDOStatement,直接使用PDO连接对象。

    $conn = new PDO("....");
    $result = $conn->exec("INSERT INTO table (table_id, car, bike, date) VALUES (1, bmw, suzuki, 2004)");
    

    $result = $conn->query("SELECT * FROM table");
    

    http://www.php.net/manual/en/pdo.query.php

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 2021-04-28
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2013-12-26
      • 2019-04-03
      相关资源
      最近更新 更多