1

使用:MySQL 5.1 + PHP 5.3.5

MySQL:

id in "table" is defined as: mediumint(6) zerofill not null

使用时我得到了预期的结果:

$mysqli->query("SELECT id FROM table WHERE id = 1");
while($row = $ret->fetch_array(MYSQLI_ASSOC)) $arr[] = $row;
>>> $arr[0]["id"] = 000001

但不是当我使用准备好的语句时:

$ret = $mysqli->prepare("SELECT id FROM table WHERE id = ?");
call_user_func_array(array($ret,"bind_param"),array("i",1));
$ret->execute();
$ret->store_result();
$meta = $ret->result_metadata();
$fields = $meta->fetch_fields();
$cols = array(); $data = array();
foreach($fields as $field) $cols[] = &$data[$field->name];
call_user_func_array(array($ret, 'bind_result'), $cols);
while($ret->fetch()) {
    $row = array();
    foreach($data as $key => $val) $row[$key] = $val;
    $arr[] = $row;
}
>>> $arr[0]["id"] = 1

当直接在 MySQL 控制台中尝试准备好的语句时,它按预期显示(它不是 MySQL)。

根据 PHP mysqli_stmt::bind_result文档,我发现了这个:

根据列类型,绑定变量可以静默更改为相应的 PHP 类型。

我需要在后面的步骤中显示带有尾随零的数字,而不必这样做。zerofill 的字段非常多,并且从数据到屏幕的过程实际上是自动化的,因此尝试在此代码之后修复此问题,将需要市长进行更改。

4

3 回答 3

3

zerofill 会丢失,因为 mysqli 知道该列是整数类型,因此 php 变量的类型也变为 int,因此前导零会丢失。

这似乎只在您使用带有 mysqli 的准备好的语句时才会发生(PDO 似乎没有这种行为)。

为了防止 mysqli 将变量类型更改为整数,您必须将 MySQL 中的类型更改为以字符串形式返回的类型。

有两种方法:

  1. CAST(intCol AS CHAR)将包括前导零的整数转换为字符串。
  2. 在字符串上下文中使用填零整数,例如CONCAT(intCol, "").

注意:如果您在 HTML5 类型的输入字段中使用此值number,这也会去除前导零(至少在某些浏览器中)。要解决此问题,请查看此答案

于 2014-11-04T08:00:38.463 回答
0

暂时,我解决了它添加这些行:

define("ZEROFILL_FLAG",64);
$zeros = array();
foreach($fields as $field) {
    $zeros[$field->name] = $field->flags & ZEROFILL_FLAG ? $field->length : 0;
    $cols[] = &$data[$field->name];
}   
call_user_func_array(array($ret, 'bind_result'), $cols);
while($ret->fetch()) {
    $row = array();
    foreach($data as $key => $val) {
        $row[$key] = $zeros[$key] > 0 ? sprintf('%0'.$zeros[$key].'s', $val) : $val;
    }   
    $arr[] = $row;
}  

我仍然希望有人能告诉我一个更好的方法来解决它。

于 2011-07-26T04:18:41.097 回答
0

另一种解决方案是将字段指定为十进制(6,0)。由于某种原因,它按预期工作(无需更改代码)。

于 2011-07-26T05:04:17.837 回答