153 votes

Le champ entier MySQL est retourné sous forme de chaîne en PHP

Salut les gars, j'ai un champ de table dans une base de données MySQL:

 userid INT(11)
 

Donc, je l’appelle sur ma page avec cette requête:

 "SELECT userid FROM DB WHERE name='john'"
 

Ensuite, pour gérer le résultat, je fais:

 $row=$result->fetch_assoc();

$id=$row['userid'];
 

Maintenant si je le fais:

 echo gettype($id);
 

Je reçois une ficelle. Cela ne devrait-il pas être un entier?

Merci

Luca

145voto

Michiel Pater Points 6968

Lorsque vous sélectionnez des données d'une base de données MySQL à l'aide de PHP, le type de données est toujours converti en chaîne. Vous pouvez le reconvertir en un entier à l'aide du code suivant:

 $id = (int) $row['userid']; 

Ou en utilisant la fonction intval() :

 $id = intval($row['userid']); 

92voto

advait Points 2255

Utilisez le mysqlnd (pilote natif) pour php. Si vous êtes sur Ubuntu:

 sudo apt-get install php5-mysqlnd
sudo service apache2 restart
 

Le pilote natif renvoie les types entiers de manière appropriée.

19voto

mastermind202 Points 61

C'est évidemment très tard, mais je voulais partager une fonction que j'ai écrite pour ce même problème. Transmettez le résultat de la requête $rs et obtenez un tableau assoc des données transférées comme retour:

 function cast_query_results($rs) {
    $fields = mysqli_fetch_fields($rs);
    $data = array();
    $types = array();
    foreach($fields as $field) {
        switch($field->type) {
            case 3:
                $types[$field->name] = 'int';
                break;
            case 4:
                $types[$field->name] = 'float';
                break;
            default:
                $types[$field->name] = 'string';
                break;
        }
    }
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row);
    for($i=0;$i<count($data);$i++) {
        foreach($types as $name => $type) {
            settype($data[$i][$name], $type);
        }
    }
    return $data;
}
 

Exemple d'utilisation:

 $dbconn = mysqli_connect('localhost','user','passwd','tablename');
$rs = mysqli_query($dbconn, "SELECT * FROM Matches");
$matches = cast_query_results($rs);
// $matches is now a assoc array of rows properly casted to ints/floats/strings
 

11voto

BoltClock Points 249668

Non. Quel que soit le type de données défini dans vos tables, le pilote MySQL de PHP fournit toujours les valeurs de ligne sous forme de chaînes.

Vous devez convertir votre identifiant en int.

 $row = $result->fetch_assoc();
$id = (int) $row['userid'];
 

2voto

Didax Points 18

Dans mon projet, j'ai l'habitude d'utiliser une fonction externe "filtres" les données récupérées *mysql_fetch_assoc*.

Vous pouvez renommer les champs de votre table de manière intuitive pour comprendre de quel type de données est stockée.

Par exemple, vous pouvez ajouter un suffixe à chaque champ numérique: si "userid" est un INT(11) vous pouvez le renommer en "userid_i" ou si c'est un UNSIGNED INT(11) vous pouvez renommer "userid_u". À ce stade, vous pouvez écrire une simple fonction PHP qui reçoivent en entrée le tableau associatif (récupéré avec mysql_fetch_assoc) et appliquer le casting de la "valeur" stockés avec ces "touches".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X