mysqli更新设置为零

时间:2017-11-13 19:00:00

标签: mysql mysqli

提前致谢。

当通过bind_param发送mysql insert或update时,前导零(例如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;
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

请勿使用is_numeric()来决定是否使用i作为类型。对于true这样的字符串,它将为"0213123"。这将导致它被解析为数字,而不是将其保持为字符串。使用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()调用中指定的类型不必与数据库类型完全匹配。