Frage

Verwenden Sie: MySQL 5.1 + PHP 5.3.5

MySQL:

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

Ich bekomme das erwartete Ergebnis, wenn ich:

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

Aber nicht, wenn ich eine vorbereitete Anweisung verwende:

$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

Wenn Sie die vorbereitete Aussage direkt in der MySQL -Konsole ausprobieren, zeigt sie sich wie erwartet an (es ist nicht mySQL).

Laut PHP MySQLI_STMT :: BIND_RESULT Dokumentation Ich fand das:

Abhängig von Spaltentypen können gebundene Variablen stillschweigend in den entsprechenden PHP -Typ ändern.

Ich muss die Nummer mit den nachlaufenden Nullen zeigen, ohne sie in einem späteren Schritt zu tun. Es gibt so viele Felder mit ZeroFill, und der Prozess wird praktisch von den Daten auf den Bildschirm automatisiert. Wenn Sie also versuchen, dies nach diesem Code zu beheben, müssen Sie den Bürgermeister ändern.

Jeder Hinweis darauf, wie man dieses Problem lösen kann, ist willkommen.

War es hilfreich?

Lösung 3

Eine andere Lösung bestand darin, das Feld als Dezimalzahl anzugeben (6,0). Aus irgendeinem Grund funktioniert es wie erwartet (keine Änderungen des erforderlichen Codes).

Andere Tipps

Der ZeroFill verliert sich, da MySQLI weiß, dass die Spalte vom Typ Ganzzahl ist und der Typ der PHP -Variablen auch int wird und die führenden Nullen verloren gehen.

Dies scheint nur zu passieren, wenn Sie vorbereitete Aussagen mit MySQLI verwenden (PDO scheint dieses Verhalten nicht zu haben).

Um MySQLI den Typ der Variablen für Ganzzahl zu verhindern, müssen Sie den Typ in MySQL in etwas ändern, das als Zeichenfolge zurückgegeben wird.

Es gibt zwei Möglichkeiten:

  1. CAST(intCol AS CHAR) Wirft die Ganzzahl einschließlich der führenden Nullen in eine Schnur.
  2. Verwenden der ZeroFalten -Ganzzahl in einem String -Kontext, z. B. CONCAT(intCol, "").

Hinweis: Wenn Sie diesen Wert in einem HTML5 -Eingangsfeld vom Typ verwenden number, Dies wird auch führende Nullen (zumindest in einigen Browsern) abziehen. Um dieses Problem zu lösen, sehen Sie sich einen Blick auf Diese Antwort.

Zeitlich habe ich es gelöst, dass die folgenden Zeilen hinzugefügt wurden:

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;
}  

Trotzdem hoffe ich, dass mir jemand einen besseren Weg zeigen kann, um es zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top