2011-11-20 71 views
4

从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问题是极大的赞赏。

+1

我可以说至少是空字符串不等于NULL –

+0

还冒充日志,无关上面的代码,我不会把一个合理的动作。 –

+0

@ Col.Srapnel。解决了它。我不认为这很容易。你应该把它作为答案让我接受。谢谢。 –

回答

5

尝试绑定nullPDO::PARAM_NULL

$type = PDO::PARAM_INT; 
if($_POST['code'] == "") { 
    $_POST['code'] = null; 
    $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(); 

事实上,看来你并不需要使用PDO::PARAM_NULL,下面的代码也将插入null

$stmt->bindValue(1, $_POST['code'] ? $_POST['code'] : null, PDO::PARAM_INT); 
+0

我明白了..你的回答有点晚了,请看上面的讨论。但它是正确的。我想知道Shrapnel上校是否想要拥有它。如果他没有发帖,他会接受你的回答。谢谢... –