通常在使用 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 类中的一些方法)