我在使用PDO时遇到一些麻烦,就像处理整数值0时需要它一样。
在模拟订单系统中,final_status
0表示成功下单。订单错误导致final_status
的非零整数,例如14,5等。不完整订单需要实际的NULL final_status
值
这是示例表结构:
CREATE TABLE `order_status` (
`order_id` int(10) NOT NULL,
`final_status` int(10) DEFAULT NULL,
`date_status` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当订单更新时,我遇到了PDO将final_status
0设置为NULL或将实际NULL /空值设置为0的问题(取决于我声明的哪个常量)绑定语句)。
所以,假设:
$final_status = 0000;
$order_id = 123456;
更新查询:
try
{
$q = "
UPDATE
order_status
SET
final_status = :final_status
WHERE
order_id = :order_id
";
$stmt = $dbx_pdo->prepare($q);
$stmt->bindValue(':final_status', !empty($final_status) ? $final_status : NULL, PDO::PARAM_NULL);
$stmt->bindValue(':order_id', !empty($order_id) ? $order_id : NULL, PDO::PARAM_INT);
$stmt->execute();
$stmt->closeCursor();
} catch(PDOException $err) {
error_handler();
}
如果我使用PARAM_NULL作为第一个bindParam常量,则值为&00; 0000'或空值被转换为NULL,这会产生误报。
如果我使用PARAM_INT,则值为&00; 0000'或空白值转换为0,这会产生误报并且很糟糕。
那么,是表定义的罪魁祸首,还是有办法用INT做我想做的事情?
答案 0 :(得分:3)
我认为(不确定),问题是因为您正在使用!empty()
。这会将0
转换为false,这将使三元条件无效。因此,如果$final_status == 0
,您的三元条件将返回null。
尝试将其更改为:
isset($final_status) && $final_status >= 0 ? $final_status : null
或
is_null($final_status) ? null : (int) $final_status
如果此答案不起作用,请发表评论,我会将其删除以避免将来出现混淆。
答案 1 :(得分:3)
来自官方文档http://php.net/manual/en/function.empty.php 以下值被视为空:
这将返回true。
<?php
$final_status = 000;
echo empty($final_status);
请考虑使用isset。
$stmt->bindValue(':final_status', !isset($final_status) ? $final_status : NULL, PDO::PARAM_NULL);