使用: 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 の型に変更される場合があります。
後のステップでそれを行う必要なく、末尾にゼロを付けて数字を表示する必要があります。ゼロフィルのフィールドが非常に多く、プロセスはデータから画面まで実質的に自動化されているため、このコードの後にこれを修正しようとすると、市長の変更が必要になります。