我提供了可选输入作为'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?
答案 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