Question

Utilisation: MySQL 5.1 + PHP 5.3.5

MySQL:

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

J'obtenir le résultat attendu lors de l'utilisation:

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

Mais pas quand je l'utilise déclaration préparée:

$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

Lorsque vous essayez la déclaration préparée directement dans la console de MySQL, il montre comme prévu (il n'est pas MySQL).

Selon PHP mysqli_stmt :: bind_result documentation J'ai trouvé ceci:

En fonction des types de colonnes variables liées peuvent changer automatiquement la correspondant de type PHP.

Je dois montrer le nombre des zéros sans avoir à le faire dans une étape ultérieure. Il y a tellement de champs avec ZEROFILL et le processus est pratiquement automatisé à partir des données à l'écran, afin d'essayer de corriger cela après ce code, il faudra modifier maire.

Tout soupçon de la façon de résoudre ce problème est la bienvenue.

Était-ce utile?

La solution 3

Une autre solution est de préciser le champ en décimal (6,0). Pour une raison quelconque, il fonctionne comme prévu (aucune modification du code requis).

Autres conseils

Le ZEROFILL se perd, parce que mysqli sait que la colonne est de type entier et donc le type de la variable php devient aussi int et donc les zéros se perdent.

Cela ne semble se produire lorsque vous utilisez les commandes préparées avec mysqli (AOP ne semble pas avoir ce comportement).

Pour mysqli empêcher le type de la variable à nombre entier, vous devez changer le type de MySQL à quelque chose qui est retourné comme une chaîne.

Il y a deux façons:

  1. CAST(intCol AS CHAR) jette l'entier y compris les zéros à une chaîne.
  2. Utilisation de l'entier zerofilled dans un contexte de chaîne, par exemple, CONCAT(intCol, "").

Remarque: Si vous utilisez cette valeur dans un champ d'entrée HTML5 de type number, cela dépouilleront des zéros au large (au moins dans certains navigateurs). Pour résoudre ce problème ont un regard sur cette réponse .

Temporellement, je l'ai résolu l'ajout de ces lignes:

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

J'espère encore que quelqu'un peut me montrer une meilleure façon de le résoudre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top