从PHP 手册中,它指出:
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();
Run Code Online (Sandbox Code Playgroud)
我意识到,如果不设置以下语句,我将使用上面的代码获取'0'一个NULL值(而不是$_POST['code'] == "")到我的数据库中.为什么会这样?
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Run Code Online (Sandbox Code Playgroud)
更新:
虽然禁用仿真对我有用,但我更喜欢使用它,因为像这个问题中的OP一样,基本上我的所有查询只在每次执行脚本时执行一次.因此,准备好语句不会给我带来任何好处,并且会创建对数据库的不必要调用,如下面的常规查询日志中所示:
Emulation Disabled
22 Connect user@localhost 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 user@localhost on Database
22 Query UPDATE Product SET code='abc' WHERE id='123'
22 Quit
Run Code Online (Sandbox Code Playgroud)
NULL非常感谢任何帮助解决这个问题.
尝试绑定null的PDO::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();
Run Code Online (Sandbox Code Playgroud)
事实上,似乎你不需要使用PDO::PARAM_NULL,下面的代码也会插入null.
$stmt->bindValue(1, $_POST['code'] ? $_POST['code'] : null, PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
342 次 |
| 最近记录: |