【问题标题】:Preserve leading zeros when saving numeric values in database [duplicate]在数据库中保存数值时保留前导零 [重复]
【发布时间】:2018-04-26 13:34:04
【问题描述】:

当对 INSERT 或 UPDATE 执行动态 MySQL 准备语句时,前导零(例如 0213123 中的 0)消失。我怎样才能防止这种情况发生?

public function update($tablo, array $column, array $form)
{
    global $db;
    $sutun = implode(' = ?, ', array_keys($column)) . ' = ?';
    $where = implode(' = ?, ', array_keys($form)) . ' = ?';
    $stmt = $this->db->prepare("UPDATE $tablo SET $sutun  WHERE $where") or die($this->db->error);
    $form = array_merge($column, $form);
    call_user_func_array(array($stmt,'bind_param'), $this->params($form));
    return $stmt->execute() or die($this->db->error);
}

public function params($params, $types = '', $input = array())
{
    foreach ($params as $key => $val) {
        ${$key} = $val;
        $input[] =& ${$key};

        if (is_numeric($val) AND fmod($val, 1) === 0.00) {
            $types .= 'i';
        } elseif (is_float($val)) {
            $types .= 'd';
        } elseif (is_string($val) OR fmod($val, 1) !== 0.00) {
            $types .= 's';
        } else {
            $types .= 'b';
        }
    }
    array_unshift($input, $types);
    return $input;
}

【问题讨论】:

标签: php mysql mysqli prepared-statement column-types


【解决方案1】:

不要使用is_numeric()来决定是否使用i作为类型。对于像"0213123" 这样的字符串,它将是true。这将导致它被解析为数字,而不是保留为字符串。使用is_int()

    if (is_int($val)) {
        $types .= 'i';
    } elseif (is_float($val)) {
        $types .= 'd';
    } elseif (is_string($val)) {
        $types .= 's';
    } else {
        $types .= 'b';
    }

但是,这意味着您将无法将数字字符串用于整数或浮点列。调用者需要提供适当的类型。

但这应该不是什么大问题。 MySQL 会在存储到数据库时自动转换类型,因此prepare() 调用中指定的类型不必与数据库类型完全匹配。

【讨论】:

    【解决方案2】:

    这似乎是数据库的行为。该列可能是不允许前导零的数据类型,例如INT。尝试将该列更改为VARCHAR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2018-02-10
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多