在处理整数值0时,让pdo正常工作有点困难。
在模拟订单系统中, final_status
0表示已成功下单。顺序错误会导致 final_status
,如14、5等。未完成的订单需要实际空值 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
或将实际的null/blank值设置为0(取决于我在bind语句中声明的常量)。
所以,假设:
$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();
}
如果我对第一个bindparam常量使用param\u null,“0000”或空值的值被转换为null,这将创建一个假负值。
如果我使用param_int,“0000”或空白值的值将被转换为0,这将创建一个假阳性,并且是错误的。
那么,表定义是罪魁祸首,还是有什么方法可以用int实现我想要的呢?
2条答案
按热度按时间gcxthw6b1#
我想(不确定),问题是因为你在使用
!empty()
. 这将转换0
为false,这将使三元条件无效。因此如果$final_status == 0
,您的三元条件将返回null。尝试将其更改为:
或
如果这个答案不起作用,请发表评论,我将删除它以避免将来的混淆。
envsm3lx2#
从官方文件http://php.net/manual/en/function.empty.php 以下值视为空:
“”(空字符串)
0(0为整数)
0.0(0作为浮点数)
“0”(0作为字符串)
无效的
假
array()(空数组)
这将成为现实。
考虑改用isset。