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 の型に変更される場合があります。

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

4

3 に答える 3

0

別の解決策は、フィールドをdecimal(6,0)として指定することでした。何らかの理由で期待どおりに機能します(コードを変更する必要はありません)。

于 2011-07-26T05:04:17.837 に答える
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 に答える