准备&执行

时间:2013-06-16 19:38:41

标签: php mysql pdo

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

据我所知,通过准备一个语句然后执行它你就向MySQL服务器发送了2个请求,所以这实际上比手动转义参数并通过PDO::query发送一个请求要慢。 / p>

有没有办法一举发送参数化查询加上参数值?


我写了一点测试,

$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课程中覆盖了一些方法)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-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")

我认为这就是你想要的。

for:

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

输出将是:

'gh\'gh'