J'ai un champ de table dans une base de données MySQL:
userid INT(11)
Je l'appelle donc 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 fais:
echo gettype($id);
Je reçois une chaîne. Cela ne devrait-il pas être un entier?
$conn->query("your query")
j'ai obtenu les champs entiers sous forme de chaîne, mais lorsque j'ai utilisé,$conn->prepare("your query")
j'ai obtenu les paramètres tels qu'ils étaient dans la base de donnéesRéponses:
Lorsque vous sélectionnez des données dans une base de données MySQL en utilisant PHP, le type de données sera toujours converti en chaîne. Vous pouvez le reconvertir en entier à l'aide du code suivant:
Ou en utilisant la fonction
intval()
:la source
Utilisez le mysqlnd (pilote natif) pour php.
Si vous êtes sur Ubuntu:
Si vous êtes sur Centos:
Le pilote natif renvoie les types entiers de manière appropriée.
Éditer:
Comme @Jeroen l'a souligné, cette méthode ne fonctionnera que pour PDO.
Comme @LarsMoelleken l'a souligné, cette méthode fonctionnera avec mysqli si vous définissez également l'option MYSQLI_OPT_INT_AND_FLOAT_NATIVE sur true.
Exemple:
la source
$link = mysqli_connect('localhost', 'root', ''); mysqli_set_charset($link,'utf8'); $result = mysqli_query($link,'SELECT CAST(\'3.51\' AS DECIMAL(3,2))'); $row = mysqli_fetch_assoc($result); var_dump($row);
renvoie:array(1) { ["CAST('3.51' AS DECIMAL(3,2))"]=> string(4) "3.51" }
Solution la plus simple que j'ai trouvée:
Vous pouvez forcer json_encode à utiliser des nombres réels pour les valeurs qui ressemblent à des nombres:
(depuis PHP 5.3.3).
Ou vous pouvez simplement convertir votre identifiant en un int.
la source
json_encode
pour lancer une chaîne en int, si possible, c'est comme utiliser un microscope pour étrangler les ongles.UNIX_TIMESTAMP()
, par exemple.Ma solution consiste à transmettre le résultat de la requête
$rs
et à obtenir un tableau assoc des données castées comme retour:Exemple d'utilisation:
la source
Indépendamment du type de données défini dans vos tables, le pilote MySQL de PHP sert toujours les valeurs de ligne comme des chaînes.
Vous devez convertir votre identifiant en int.
la source
J'aime la réponse de Chad, en particulier lorsque les résultats de la requête seront transmis à javascript dans un navigateur. Javascript traite proprement les entités numériques comme des nombres, mais nécessite un travail supplémentaire pour traiter les entités numériques comme des chaînes. ie doit utiliser parseInt ou parseFloat sur eux.
En m'appuyant sur la solution de Chad, j'utilise ceci et c'est souvent exactement ce dont j'ai besoin et crée des structures qui peuvent être encodées en JSON pour une utilisation facile en javascript.
L'ajout d'une chaîne numérique à 0 produit un type numérique en PHP et identifie correctement le type afin que les nombres à virgule flottante ne soient pas tronqués en entiers.
la source
Cela se produit lorsque
PDO::ATTR_EMULATE_PREPARES
est défini surtrue
sur la connexion.Attention cependant, le paramétrer sur
false
interdit l'utilisation de paramètres plus d'une fois. Je pense que cela affecte également la qualité des messages d'erreur qui reviennent.la source
Vous pouvez le faire avec ...
... selon l'extension que vous souhaitez utiliser. Le premier n'est pas recommandé car l'extension mysql est obsolète. Le troisième est encore expérimental.
Les commentaires sur ces hyperliens expliquent bien comment définir votre type d'une ancienne chaîne simple à son type d'origine dans la base de données.
Certains frameworks font également abstraction de cela (CodeIgniter fournit
$this->db->field_data()
).Vous pouvez également faire des suppositions - comme faire une boucle sur vos lignes résultantes et utiliser is_numeric () sur chacune. Quelque chose comme:
Cela transformerait tout ce qui ressemble à un nombre en un ... certainement pas parfait.
la source
if (is_float()) { $value = (float)$value; }
Dans mon projet, j'utilise généralement une fonction externe qui "filtre" les données récupérées
mysql_fetch_assoc
.Vous pouvez renommer les champs de votre table afin de comprendre de manière intuitive quel type de données est stocké.
Par exemple, vous pouvez ajouter un suffixe spécial à chaque champ numérique: si
userid
c'est un,INT(11)
vous pouvez le renommeruserid_i
ou s'il s'agit d'un,UNSIGNED INT(11)
vous pouvez le renommeruserid_u
. A ce stade, vous pouvez écrire une simple fonction PHP qui reçoit en entrée le tableau associatif (récupéré avecmysql_fetch_assoc
), et appliquer le cast à la "valeur" stockée avec ces "clés" spéciales.la source
Si des instructions préparées sont utilisées, le type sera int le cas échéant. Ce code renvoie un tableau de lignes, où chaque ligne est un tableau associatif. Comme si
fetch_assoc()
était appelé pour toutes les lignes, mais avec des informations de type préservées.la source
MySQL a des pilotes pour de nombreuses autres langues, la conversion des données en chaîne "standardise" les données et laisse à l'utilisateur le soin de taper des valeurs en int ou autres
la source
Dans mon cas, l'
mysqlnd.so
extension avait été installée. MAIS je ne l'avais pas faitpdo_mysqlnd.so
. Ainsi, le problème avait été résolu en remplaçantpdo_mysql.so
parpdo_mysqlnd.so
.la source
J'aime la technique de mastermind , mais le codage peut être plus simple:
J'ai également ajouté la vérification des requêtes retournant false plutôt qu'un jeu de résultats.
Et vérifier une ligne avec un champ qui a une valeur nulle.
Et si le type souhaité est une chaîne, je ne perds pas de temps dessus - c'est déjà une chaîne.
Je ne prends pas la peine de l'utiliser dans la plupart des codes php; Je compte juste sur la conversion automatique de type de php. Mais si vous interrogez beaucoup de données, pour ensuite effectuer des calculs arithmétiques, il est judicieux de convertir en premier les types optimaux.
la source