代码之家  ›  专栏  ›  技术社区  ›  a coder

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

  •  0
  • a coder  · 技术社区  · 6 年前

    我在让PDO工作时遇到了一些困难,就像处理整数值0时需要它工作一样。

    在模拟订单系统中, final_status 0表示已成功下订单。订单错误导致的非零整数 最终状态 如14、5等。未完成订单需要实际空值 最终状态 价值

    下面是示例表结构:

    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要么设置 最终状态 或者将实际的空/空值设置为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_NULL,则将“0000”或空值转换为NULL,这将创建一个假负。

    如果我使用param_int,则将“0000”或空值的值转换为0,这将创建一个错误的正数,并且是错误的。

    那么,表定义是罪魁祸首,还是有一种方法可以用int来做我想做的事情?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Phil Cross    6 年前

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

    尝试将其更改为:

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

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

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

        2
  •  3
  •   Plixxer    6 年前

    从官方文件中 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);