php une Comment obtenir des types numériques à partir de MySQL en utilisant PDO?




pdo openclassroom (4)

La réponse de Pascal est correcte. J'ai eu du mal à faire en sorte que tout fonctionne. Voici ce que tu dois faire.

Tout d'abord, assurez-vous que mysqlnd est installé et activé. Regardez php --info . Dans la section pdo_mysql, cela devrait ressembler à ceci:

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321

Si au lieu de voir mysqlnd dans la version API Client, vous voyez une ligne comme ...

Client API version => 5.5.29

... alors vous n'avez pas mysqlnd installé et en cours. Prenez soin de cela en premier.

Deuxièmement, PDO utilise des instructions préparées émulées par défaut pour toutes les connexions MySQL . Ridicule, mais ça y est. Et vous obtiendrez des types de données natifs uniquement si vous utilisez des instructions réellement préparées (appelées "instructions préparées côté serveur" dans l'article de blog lié, qui se trouve maintenant ici ). Vous devez donc définir PDO :: ATTR_EMULATE_PREPARES sur false, comme ceci:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Enfin, assurez-vous que vous n'avez pas défini PDO :: ATTR_STRINGIFY_FETCHES sur true.

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

J'utilise PDO et MySQL, pour une raison quelconque, lorsque j'obtiens des valeurs de la base de données de type int, le PDOStatement retourne une représentation sous forme de chaîne du nombre et non une valeur de type numérique. Comment puis-je empêcher cela?

J'ai remarqué qu'il y a un attribut de la classe PDO: PDO::ATTR_STRINGIFY_FETCHES qui est supposé s'en occuper mais, en essayant de le modifier, il émet une erreur disant que l'attribut n'est pas valide pour le pilote MySQL.

Est-il normal d'obtenir des chaînes au lieu de chiffres lors de la consultation d'une base de données?


Je ne pense pas avoir de "numéros" peut être fait en PHP 5.2 :-(

En PHP 5.3, il devient possible, si je me souviens bien, lorsque vous utilisez le nouveau pilote mysql nd (MySQL Native Driver) (nouveau comme dans PHP> = 5.3) .

Eh bien, après avoir creusé plus à travers mes signets, j'ai trouvé cet article sur mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Il dit ceci (citation):

Avantages de l'utilisation de mysqlnd pour AOP

mysqlnd renvoie des types de données natifs lors de l'utilisation des instructions préparées côté serveur. Par exemple, une colonne INT est renvoyée en tant que variable entière et non en tant que chaîne. Cela signifie moins de conversions de données en interne.

Mais c'est PHP 5.3 seulement (à condition que votre version de PHP 5.3 soit compilée avec mysqlnd ( et non pas libmysql ancienne) ), et semble être seulement le cas pour les instructions préparées :-(

Pardon...

Une solution serait d'avoir, du côté PHP, un système de mapping (comme un ORM - voir Doctrine , juste comme un exemple de ORM: je ne sais pas s'il fait ce que vous demandez) pour convertir les résultats venant de la DB vers les types de données PHP ...

Et oui, c'est mauvais si vous voulez utiliser des opérateurs comme === et !== , qui sont sensibles au type ...


Pour répondre d'abord à votre dernière question, «oui», il est malheureusement normal de recevoir des chiffres sous forme de chaînes. Comme le dit le manuel de Pascal, mysqlnd (PHP 5.3) renverra des types de données natifs à partir d'instructions préparées, à condition de désactiver l'émulation d'instruction préparée à partir de PDO.

new PDO($dsn, $user, $pass, array(
    PDO::ATTR_EMULATE_PREPARES => false
))

PDO :: ATTR_STRINGIFY_FETCHES n'est pas lié à MySQL.

Si vous regardez le bon côté, c'est une bonne pratique d'utiliser des instructions préparées de toute façon, alors ...;)


Vous pouvez avoir mysqlnd installé, mais cela ne signifie pas qu'il est prêt à être utilisé par l'extension PDO normale (pdo_mysql) , c'est plus souvent le cas sur un hébergement partagé, donc assurez-vous d'activer l'extension nd_pdo_mysql , et aussi désactiver d'autres extension pdo_mysql car cela pourrait créer un conflit.

@capture d'écran

J'ai trouvé cette question (en double), j'ai décidé de poster mes pensées ici, j'espère que ça va;)







pdo