PHP 将 NULL 与绑定值一起使用时出现问题

问题描述 投票:0回答:1

我几乎可以肯定,我只是看同样的代码太久了,但我没有看到它。

我也一遍又一遍地阅读了类似的问题: [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 并为这两种情况执行完全不同的查询,而不是优雅地使用/传递变量值。

我错过了什么?

php sql pdo
1个回答
0
投票

您需要了解 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_...
类型按原样传递值(空或其他)。

© www.soinside.com 2019 - 2024. All rights reserved.