使用pdo插入值“000”将导致null

0s7z1bwu  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(416)

在处理整数值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实现我想要的呢?

gcxthw6b

gcxthw6b1#

我想(不确定),问题是因为你在使用 !empty() . 这将转换 0 为false,这将使三元条件无效。因此如果 $final_status == 0 ,您的三元条件将返回null。
尝试将其更改为:

isset($final_status) && $final_status >= 0 ? $final_status : null

is_null($final_status) ? null : (int) $final_status

如果这个答案不起作用,请发表评论,我将删除它以避免将来的混淆。

envsm3lx

envsm3lx2#

从官方文件http://php.net/manual/en/function.empty.php 以下值视为空:
“”(空字符串)
0(0为整数)
0.0(0作为浮点数)
“0”(0作为字符串)
无效的

array()(空数组)
这将成为现实。

<?php
    $final_status = 000;
    echo empty($final_status);

考虑改用isset。

$stmt->bindValue(':final_status',       !isset($final_status)       ? $final_status     : NULL, PDO::PARAM_NULL);

相关问题