无论PDO是否在PDO::ATTR_EMULATE_PREPARES
设置为TRUE或FALSE的情况下执行,如何判断PDO是否真的在模拟语句,或者它们是否由本机驱动程序处理?
嗯,它似乎不可用作PDO连接处理程序属性,因为此设置可以在运行时更改
但是,可以为语句处理程序获取它
因此,如果您想在启动任何实际语句之前了解模拟状态,则必须使用假查询。作为一个额外的证明,我在揭示模拟方面的小技巧可以使用:
try {
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, FALSE);
$sth = $pdo->prepare("SELECT 1");
$emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES);
var_dump($emul);
$sth = $pdo->prepare("SELECT 1 LIMIT ?,?");
$sth->execute(array(1,2));
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, TRUE);
$sth = $pdo->prepare("SELECT 1");
$emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES);
var_dump($emul);
$sth = $pdo->prepare("SELECT 1 LIMIT ?,?");
$sth->execute(array(1,2));
} catch (PDOException $e) {
echo $e->getMessage();
}
输出
bool(false)
bool(true)
SQLSTATE[42000]: Syntax error or access violation:
1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near ''1','2'' at line 1
意味着在第二种情况下,PDO只是模拟,从而将值格式化为字符串,从而导致解析错误。
尽管我认为这些信息没有多大用处。为什么不把它设置成你想要的任何条件呢?