我几乎可以肯定,我只是看同样的代码太久了,但我没有看到它。
我也一遍又一遍地阅读了类似的问题: [https://stackoverflow.com/questions/11692773/php-mysql-pdo-refuses-to-set-null-value][1]
这有效:
$updateqry = $db->prepare(
'UPDATE Objects SET InventorGroup=:NEWGROUP WHERE ' .
'Inventor1=:INVENTOR1 AND ' .
'Inventor2=:INVENTOR2 AND ' .
'Inventor3 IS NULL'
);
$updateqry->bindValue(:NEWGROUP, $iNewGroupVar, PDO::PARAM_INT);
$updateqry->bindValue(:INVENTOR1, $iInventor1Var, PDO::PARAM_INT);
$updateqry->bindValue(:INVENTOR2, $iInventor2Var, PDO::PARAM_INT);
$updateqry->execute();
但这并不:
$updateqry = $db->prepare(
'UPDATE Objects SET InventorGroup=:NEWGROUP WHERE ' .
'Inventor1=:INVENTOR1 AND ' .
'Inventor2=:INVENTOR2 AND ' .
'Inventor3=:INVENTOR3'
);
$updateqry->bindValue(:NEWGROUP, $iNewGroupVar, PDO::PARAM_INT);
$updateqry->bindValue(:INVENTOR1, $iInventor1Var, PDO::PARAM_INT);
$updateqry->bindValue(:INVENTOR2, $iInventor2Var, PDO::PARAM_INT);
$updateqry->bindValue(:INVENTOR3, $iInventor3Var, PDO::PARAM_NULL);
$updateqry->execute();
即使我更改了最后一个bindValue,这也不起作用:
$updateqry->bindValue(:INVENTOR3, NULL, PDO_::PARAM_NULL);
作为一个不优雅的工作方法,因为我必须让它在我的代码的其余部分中前进,所以我没有在我的第三个参数中检查 Null 并为这两种情况执行完全不同的查询,而不是优雅地使用/传递变量值。
我错过了什么?
您需要了解 SQL 中空比较的工作原理。无论列内的值是 null 还是其他值,
Inventor3 = null
的结果都是 unknown
。 正确的解决方案是根据变量动态构建查询:
$sql =
'UPDATE Objects SET InventorGroup = :NEWGROUP WHERE ' .
'Inventor1 = :INVENTOR1 AND ' .
'Inventor2 = :INVENTOR2 AND ';
if ($Inventor3Var !== null) {
$sql .= 'Inventor3 = :INVENTOR3';
} else {
$sql .= 'Inventor3 IS NULL';
}
$updateqry = $db->prepare($sql);
$updateqry->bindValue(:NEWGROUP, $iNewGroupVar, PDO::PARAM_INT);
$updateqry->bindValue(:INVENTOR1, $iInventor1Var, PDO::PARAM_INT);
$updateqry->bindValue(:INVENTOR2, $iInventor2Var, PDO::PARAM_INT);
if ($Inventor3Var !== null) {
$updateqry->bindValue(:INVENTOR3, $iInventor3Var, PDO::PARAM_INT);
}
更好的解决方案是使用
IS NOT DISTINCT FROM
子句(如果您的 RDMBS 支持):
'UPDATE Objects SET InventorGroup = :NEWGROUP WHERE ' .
'Inventor1 = :INVENTOR1 AND ' .
'Inventor2 = :INVENTOR2 AND ' .
'Inventor3 IS NOT DISTINCT FROM :INVENTOR3'
对于上述内容,只需使用适当的
PDO::PARAM_...
类型按原样传递值(空或其他)。