通常在使用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课程中覆盖了一些方法)
答案 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'