在数据库中保存数值时保留前导零
Preserve leading zeros when saving numeric values in database
当执行动态 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;
}
这似乎是数据库的行为。该列可能是不允许前导零的数据类型,例如 INT
。尝试将该列更改为 VARCHAR
.
不使用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()
调用中指定的类型不必与数据库类型完全匹配。
当执行动态 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;
}
这似乎是数据库的行为。该列可能是不允许前导零的数据类型,例如 INT
。尝试将该列更改为 VARCHAR
.
不使用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()
调用中指定的类型不必与数据库类型完全匹配。