从PHP manual,它指出:为什么模拟准备好的语句失败,返回NULL?
PDO :: ATTR_EMULATE_PREPARES启用或禁用准备 语句的仿真。某些驱动程序不支持本机预处理语句,或者对其支持有限。使用此设置可强制PDO 始终模拟预准备语句(如果为TRUE),或尝试使用准备好的语句(如果为FALSE)。如果驱动程序无法成功准备 当前查询,它总是会回退到模拟 准备好的语句。需要布尔。
我有一个查询是这样的:
$type = PDO::PARAM_INT;
if($_POST['code'] == "") $type = PDO::PARAM_NULL;
$stmt = $dbh->prepare("UPDATE Product SET code=? WHERE id=?");
$stmt->bindValue(1, $_POST['code'], $type);
$stmt->bindValue(2, $_SESSION['id'], PDO::PARAM_INT);
$stmt->execute();
我意识到,如果没有设置下面的语句,我会得到一个'0'
而不是NULL
值(当$_POST['code'] == ""
)到使用我的数据库上面的代码。为什么?
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
UPDATE:
虽然仿真的禁止工作对我来说,我更愿意使用它,因为像这样question的OP,基本上所有我的查询每个脚本执行一次只能执行。因此,在拟备不会获得我任何优势的声明,并创建到数据库不必要的调用如下图所示一般查询日志:
Emulation Disabled
22 Connect [email protected] on Database
22 Prepare UPDATE Product SET code=? WHERE id=?
22 Execute UPDATE Product SET code='abc' WHERE id='123'
22 Close stmt
22 Quit
Emulation Enabled
22 Connect [email protected] on Database
22 Query UPDATE Product SET code='abc' WHERE id='123'
22 Quit
任何帮助解决NULL
问题是极大的赞赏。
我可以说至少是空字符串不等于NULL –
还冒充日志,无关上面的代码,我不会把一个合理的动作。 –
@ Col.Srapnel。解决了它。我不认为这很容易。你应该把它作为答案让我接受。谢谢。 –