Domanda

Utilizzo: MySQL 5.1 + PHP 5.3.5

MySQL:

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

I ottenere il risultato previsto quando si utilizza:

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

Ma non quando io uso dichiarazione preparata:

$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

Quando si cerca la dichiarazione preparata direttamente nella console di MySQL, mostra come previsto (non è MySQL).

Secondo PHP mysqli_stmt :: bind_result documentazione ho trovato questo:

A seconda del tipo di colonne variabili vincolate può silenziosamente passare alla corrispondente tipo PHP.

devo mostrare il numero con gli zeri finali senza dover fare in un passaggio successivo. Ci sono così tanti campi con ZEROFILL e il processo è praticamente automatizzati dai dati allo schermo, in modo da cercare di risolvere questo problema dopo questo codice, richiederà cambiamenti sindaco.

Qualsiasi accenno di come risolvere questo problema è il benvenuto.

È stato utile?

Soluzione 3

Un'altra soluzione era quella di specificare il campo come decimale (6,0). Per qualche ragione che funziona come previsto (nessuna modifica al codice richiesto).

Altri suggerimenti

Lo zerofill si perde, perché mysqli sa che la colonna è di tipo intero e quindi il tipo di variabile php diventa anche int e così gli zeri iniziali si perdono.

Questo sembra accadere solo quando si utilizza istruzioni preparate con mysqli (DOP sembra non avere questo comportamento).

Per evitare mysqli il tipo di variabile per intero è necessario cambiare il tipo in MySQL a qualcosa che viene restituito come una stringa.

Ci sono due modi:

  1. CAST(intCol AS CHAR) proietta l'intero inclusi gli zeri iniziali in una stringa.
  2. Utilizzando il numero intero zerofilled in un contesto stringa, ad esempio CONCAT(intCol, "").

Avviso: Se si utilizza questo valore in un campo di input di tipo HTML5 number, questo sarà anche togliere gli zeri iniziali (almeno in alcuni browser). Per risolvere questo problema di dare un'occhiata a questa risposta .

Temporalmente, ho risolto aggiungendo queste righe:

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

Ancora spero che qualcuno mi può mostrare un modo migliore per risolverlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top