4

通常在使用 PDO 时,我想准备一个语句,然后只执行一次。我这样做是为了确保我的所有参数都正确转义。

据我了解,通过准备一个语句然后执行它,您将向 MySQL 服务器发送 2 个请求,因此这实际上比手动转义参数并通过PDO::query发送一个请求要慢。

有没有办法一口气发送参数化查询和参数值?


我写了一个小测试,

$t = new WxTimer();
for($i=0; $i<1000; ++$i) {
    $db->prepare("SELECT user_id, $i FROM wx_user WHERE user_id=?")->execute($i)->fetch();
}
echo $t->elapsed().PHP_EOL;

并在ATTR_EMULATE_PREPARES开和关的情况下运行它。ATTR_EMULATE_PREPARES设置为(这true似乎是默认值),它的运行速度大约是两倍(295ms vs 639ms)。

奇怪的是,这个说法,

$db->query("SELECT user_id, $i FROM wx_user WHERE user_id=".$db->quote($i))->fetch();

尽管似乎没有使用准备好的语句,但在打开模拟的情况下运行大约 633 毫秒,或者在关闭模拟的情况下运行 301 毫秒。

(如果您想知道语法,我覆盖了 PDO 类中的一些方法)

4

2 回答 2

1

这取决于PDO::ATTR_EMULATE_PREPARES的设置,

如果您使用准备好的语句的模拟,那么 pdo 将为您模拟准备好的语句,转义过程将在 pdo 中完成。所以这只会向数据库发送一个请求。

于 2013-06-17T01:17:15.400 回答
-1

看这里: http: //php.net/manual/en/pdo.quote.php

例子:

$pdo = new PDO ("mysql:host=$hostname;dbname=$dbname","$username","$pw");
$str = "gh'gh";
$str = $pdo->quote($str);
$pdo->query ("UPDATE table SET field=$str")

我想这就是你想要的。

为了:

$str = "gh'gh";
echo $pdo->quote($str);

输出将是:

'gh\'gh'
于 2013-06-17T01:10:08.760 回答