插入价值' 000' PDO结果为NULL

时间:2018-05-29 21:24:16

标签: php mysql pdo

我在使用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做我想做的事情?

2 个答案:

答案 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 以下值被视为空:

  • "" (空字符串)
  • 0(0为整数)
  • 0.0(0作为浮动)
  • " 0" (0作为字符串)
  • NULL
  • FALSE
  • array()(空数组)

这将返回true。

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

请考虑使用isset。

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