PDO准备 - 阻止空值SQL更新

时间:2016-01-21 11:52:13

标签: php mysql sql pdo

我提供了可选输入作为'type'值。我试图阻止语句更新类型,如果它是空数据并继续更新设备值。

我很想创建依赖于PHP检查null的单独的prepare语句,但后来找到了SQL ISNULL()。我以前曾经使用它并且不确定如何在准备中使用它,除非有更好的方法来实现这一点?

PHP:

    $update = $db -> prepare("UPDATE room 
    SET type = ISNULL(@:type,:type), equipment = :equipment 
    WHERE room_id = :room_id");

    $update -> bindParam(":room_id", $room_id);
    $update -> bindParam(":type", $data['type']);
    $update -> bindParam(":equipment", $equipmentList);

    $update -> execute();

我在尝试上述操作时收到'SQLSTATE [42000]:语法错误或访问冲突:1582'。

更新

    UPDATE room 
    SET type = IFNULL(:type, type), equipment = :equipment 
    WHERE room_id = :room_id

好的,正确的语法可以修复错误,感谢 eggyal !现在的问题是更新了null :type值,并且不使用数据库值type(这是一个枚举)而不是null。我在SQL之前在php中检查过:type值为null。

为什么IFNULL仍然返回null?

3 个答案:

答案 0 :(得分:1)

  • 使用bindValue代替bindParam,您不会更改参数的,因此您无需通过引用传递它。

  • 如果MySQL 中的数据类型可以包含null ,那么您可以告诉它您正在发送NULL值。代码:

$update -> bindValue(":type", $data['type'], is_null($data['type'] ? PDO::PARAM_NULL : PDO::PARAM_STR);

如果目标列不能包含null ,则根本不需要执行查询。

答案 1 :(得分:0)

MySQL的ISNULL()函数只接受一个参数,并返回1或0,分别表示该参数是否为null。它等同于IS NULL比较运算符。

MySQL确实有一个2参数IFNULL()函数,这可能是您打算使用的函数(尽管您应用的参数是无意义的)?

UPDATE room 
SET    type      = IFNULL(:type, type),
       equipment = :equipment 
WHERE  room_id   = :room_id

如果:type不是NULL,则会使用其值;否则将使用type列的任意值(不产生任何变化)。

答案 2 :(得分:0)

您可以使用COALESCE()功能。它需要尽可能多的参数,并返回它遇到的第一个非null参数(如果有的话)。否则返回NULL。

UPDATE room 
SET type = COALESCE(:type, type), equipment = :equipment 
WHERE room_id = :room_id
相关问题