Oké merci , ça me rassure.
Oké merci , ça me rassure.
Bonjour,
Je trouve que c'est un bon tuto qui va beaucoup m'aider dans mon apprentissage.
Merci.
beegees
Bonjour,
Il me semble avoir vu une petite faute dans l'instanciation de la connexion.au lieu de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $pdo = new PDO($connStr, 'Utilisateur', 'Mot de passe', $arrExtraParam);Sinon merci pour ce tuto,
Code : Sélectionner tout - Visualiser dans une fenêtre à part $pdo = new PDO($strConnection, 'Utilisateur', 'Mot de passe', $arrExtraParam);
Bilal
toute a fait d'accord , personnellement j'ai appris pas mal de choses encore bravo +++L'article à été écris pour être une base d'apprentissage saine à PDO. J'ai donc essayé de casser certains "mythes". Par la suite, la lecture d'article plus poussée devrait être facilité.
juste faut voir le format pdf qui est un peut mal imprimer (page 8) .
Bonjour,
Je découvre bien tardivement ton TOPO sur PDO !
Un vrais bijoux, et pour cela mille bravos
Je sais qu'il faut garder la "légéretée" a ton sujet, il n'empéche que
le mécanisme du PREPARE qui reste un pilier de PDO
(pas obligatoir comme tu l'a souligné) mériterait quelques précisions.
A ce sujet je te soumet une analyse dont tu fera le trie si bon te semble
pour l'incorporer si tu juges que cela n'alourdirait pas ton sujet.
____________________________________
Préparé ou pas, avec ou sans bindparam, au final chaque exec envoie en une seule fois la requête et les vraies variables au gestionnaire de base de données (par exemple MySql) a la différence du PREPARE SQL !
Dans un PREPARE (SQL par exemple) le gestionnaire reçoit et analyse la requête et attend tout envoi de données sur le pointeur de l'instruction préparée.
Voilà pour le prépare ...
______________________________________
Concernant "protection" "injection" et "échappement"
l' injection doit être évitée par un contrôle (de notre choix)
Pour le reste "protection" "échappement"
Juste un petit historique que vous connaissez bien sur:
Au début nous faisions avant un INSERT ou autre ... le fameux addslashes()
avec la douce contrainte de contrôler l'état d' activation de ou non des magic_quotes_gpc...
le résultat .. plein d' antislashs et obligé a la relecture de faire un
stripslashes()
Maintenant, les versions modernes de SQL / PHP ont cette superbe fonction
mysql_real_escape_string qui fait EXACTEMENT la même chose que PDO
A savoir doubler les ' et inscrire les caractères spéciaux et accentués sur deux octets ! ce qui protége bien les données.
Ainsi la relecture est directe sans instructions !!
____________________________________
A++ et encore BRAVO !
Christele
Pour Mysql (je ne sais pas pour les autres drivers), la préparation est par défaut émulé par soucis de compatibilité avec mysql < 5.1 mais il est possible d'utiliser la préparation du serveur mysql en changeant le paramètre ATTR_EMULATE_PREPARES.Préparé ou pas, avec ou sans bindparam, au final chaque exec envoie en une seule fois la requête et les vraies variables au gestionnaire de base de données (par exemple MySql) a la différence du PREPARE SQL !
pas vraiment moderne : cette fonction existe depuis 11 ans et est maintenant classé comme obsolète à ne plus utiliser.Maintenant, les versions modernes de SQL / PHP ont cette superbe fonction
mysql_real_escape_string qui fait EXACTEMENT la même chose que PDO
Quand au fait qu'elle ferrait la même chose que PDO je ne vois pas trop à quoi tu fais référence.
Les accents ne posent pas de problème dans les requêtes et ne sont pas modifiés par mysql_real_escape_string. Ca serait d'ailleurs bien gênant d'avoir des caractères multioctet dans un encodage simple octet non ?A savoir doubler les ' et inscrire les caractères spéciaux et accentués sur deux octets ! ce qui protége bien les données.
N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP
Je n'ais pas contrôlé depuis longtemps, mais par défault j'étais "True" de base
Je fais référence justement a la protection des données tels que je l'ais écris
plus bas.
Oui tu as raison Sabotage, mais c'est ce que m'indique mon éditeur hexadécimal
Dans un fichier non UTF8 j'ais bien cela ... mais tu me mets le doute,
c'est peut-étre l'export en *.SQL qui provoque cela ???
Bref tu m'as mis un gros doute sur tout cela, je vais appronfondir ces trois points
A++ et merci
Christele
Je note une erreur dans le paragraphe nommé
III.a. Établir une connexion avec PDO
Le bloc try pour la connexion est écrit ainsi :
or la variable de la ligne 3 (commentée "//Ligne 3; Instancie la connexion"), $connStr, sort de nulle part. En fait, c'est la variable $strConnection qu'on devrait trouver à cet endroit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 try { $strConnection = 'mysql:host=localhost;dbname=ma_base'; //Ligne 1 $arrExtraParam= array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); //Ligne 2 $pdo = new PDO($connStr, 'Utilisateur', 'Mot de passe', $arrExtraParam); //Ligne 3; Instancie la connexion $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//Ligne 4 }
La ligne marquée 3 en commentaire devrait donc être
Code : Sélectionner tout - Visualiser dans une fenêtre à part $pdo = new PDO($strConnection, 'Utilisateur', 'Mot de passe', $arrExtraParam); //Ligne 3; Instancie la connexion
wow, super tuto !
Tout est si clair, j'ai beaucoup apprécié de pouvoir comparer les codes MySQL et PDO, ça aide énormément à la compréhension.
J'avais du mal a vraiment comprendre solidement PDO avec les autres tutos que j'ai pu lire sur le WEB. Pas avec celui-ci !
Un grand merci !
PS : bien vu maildeseb
merci pour l'article je me met à PDO mais y une chose que j'ai pas compris dans cet article
on a initialisé la variable $arrExtraParam
Code : Sélectionner tout - Visualiser dans une fenêtre à part $arrExtraParam = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); //Ligne 2
mais jamais utilisée, comment l'utiliser ?
peut être comme ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION, $arrExtraParam); //Ligne 4
$arrExtraParam est utilise la ligne suivante :
http://fmaz.developpez.com/tutoriels...re-pdo/#LIII.a
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $arrExtraParam= array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); //Ligne 2 $pdo = new PDO($connStr, 'Utilisateur', 'Mot de passe', $arrExtraParam); //Ligne 3; Instancie la connexion
N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP
Bonjour,
Je reconnais le sujet commence à dater un peux, mais j'ai quelques remarques à faire dessus :
1.Il me semble constater une erreur dans le paragraphe V.a :
Dans la partie sans préparation de la requêteLa ligne 2 devrait s'écrire comme ça $statement = $pdo->query($query);. (Sauf erreur de ma part)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $query = 'SELECT * FROM foo;'; $statement = $pdo->query(); echo $statement->rowCount() . ' résultat(s)';
2.Toujours dans le paragraphe V.a La fonction rowCount() est utilisé sur une requête de type SELECT.
Il est indiqué dans la documentation PHP que cette utilisation n'est pas recommandée.
Peut-on donc vraiment utiliser cette fonction pour avoir le nombre de ligne sélectionné ?
Bonjour,
Ce tuto date un peu, néanmoins c'est une bonne base pour l'introduction à pdo (notamment pour ceux qui viennent de mysql puisque les syntaxes sont comparées au début) et il est encore assez visité c'est pourquoi je me permet quelques précisions :
1/ la connexion chapitre III.a
2/ Explication du faux bug de la clause limit chapitre V.c
3/ le nombre de paramètres dynamique chapitre IV.b.
1/ Depuis quelques années on peut passer le charset dans la chaine de connexion ce qui évite d'ajouter une option de configuration.
Plus important il est très recommandé de désactiver l'émulateur pdo de php pour laisser travailler celui du sgbdd. Si le sgbdd n'a pas de gestionnaire pdo alors celui de php se remettra en marche même avec l'option désactivée. Le gros avantage est que le gestionnaire pdo du sgbdd est plus performant (car optimisé pour le sgbdd) et surtout vous ne serez plus contraints de formater vos variables en entiers pour les passer dans la clause limit (cf chapitre V.c). En effet le gestionnaire interne du sgbdd saura retourner le bon type en fonction des besoins de la requête.
En suivant ces principes on peut donc faire une connexion de ce type :
Avec ce type de connexion, la problématique du chapitre V.c disparaît. Cela ouvre également la perspective de pouvoir passer une clause limit dans un tableau passé en paramètre à la fonction execute(). Autrement ce ne serait pas possible car les éléments des tableaux passés dans la fonction execute() sont formatés en string.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 try { $connStr = 'mysql:host=localhost;dbname=ma_base;charset=utf8'; // Désactive l'émulateur pdo de php pour utiliser celui du sgbdd si disponible $arrExtraParam[PDO::ATTR_EMULATE_PREPARES] = false; $arrExtraParam[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; // Si l'on souhaite utiliser le mode objet par défaut pour récupérer les données // $arrExtraParam[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ; $pdo = new PDO($connStr, 'Utilisateur', 'Mot de passe', $arrExtraParam); } catch(PDOException $e) { $msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage(); exit($msg); }
Ce qui m'amène au chapitre IV.b qui est codé de manière un peu alambiquée (comme le confirme le commentaire à la fin du paragraphe).
On pourrait faire plus simplement :
Maintenant si je souhaite ajouter une clause limit également dynamique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 $arr = array(12, 62, 61, 36, 92); // Le nombre d'éléments est variable. $count_arr = is_array($arr)? count($arr) : 0; if($count_arr > 0) { $strPH = implode(',', array_fill(0,$count_arr,'?')); $query = "SELECT * FROM membres WHERE id IN(" .$strPH. ")"; $prep = $pdo->prepare($query); $prep->execute($arr); $arrAll = $prep->fetchAll(); }
Notez que si je n'avais pas désactivé l'émulateur pdo de php dans les options de connexion, cette requête ne fonctionnerait pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 $arr = array(12, 62, 61, 36, 92); //Le nombre d'éléments recherchés est variable. $limite = 2; $count_arr = is_array($arr)? count($arr) : 0; if($count_arr > 0) { $strPH = implode(',', array_fill(0,$count_arr,'?')); $query = "SELECT * FROM membres WHERE id IN(" .$strPH. ") LIMIT ?"; $prep = $pdo->prepare($query); array_push($arr,$limite); $prep->execute($arr); $arrAll = $prep->fetchAll(); }
Bonjour à tous.
Merci pour vos commentaires constructif. Ce tutoriel était mon premier (et seul ici je crois). Depuis sa publication, j'ai changé de carrière donc je n'ai pas été très actif sur ce forum (pas dutout en fait). Donc par rapport à vos commentaires:
ABCIWEB:
- pour ce qui est de la méthode SGBDD, honnêtement je ne connais pas. Les choses ont peuvent avoir changées, mais j'ai probablement oublié depuis le temps.
- En ce qui concerne l'exemple des place holders dynamique, je ne cherchais pas à démontrer la meilleure méthode, ni la plus compacte, ni la plus rapide. Mais la plus facile à comprendre. En ce sens, je trouve que l'exemple que j'ai proposé est plus facile à suivre et à comprendre que le (probablement meilleur) code que tu présente.
Loup Solitaire:
- semble avoir raison au sujet de la petite erreur, il faudrait que quelqu'un corrige $statement = $pdo->query(); -> $statement = $pdo->query($query); -
maildeseb
- Même chose, bien vu, il y a une erreur dans le code qui établi la connexion.
Bref, je n'ai plus les outils de publication, ni les connaissances pour mettre à jour le tuto par rapport aux nouvelles pratiques ou aux nouvelles versions de PHP. Si quelqu'un est capable de reprendre la gouverne de ce tutoriel, j'offre mon accord à Developpez.net de le ré-attritrer le tutorial à un auteur capable de faire les modifications nécéssaires. Je souhaite seulement que mon nom demeure comme étant l'auteur original de l'article.
Ps.: Je recois encore les emails de notification...
Encore une fois merci à tous pour vos commentaires ! (Et désolé de ne pas pouvoir effectuer les corrections moi-même )
En fait PDO n'est pas Mysql !! tout vient de là !
Il y a en résumé : Mysql (Périmé), Mysqli conservé et PDO_Mysql qui a mon sens reste la roll's.
Regardes ceci http://php.net/manual/fr/mysqlinfo.api.choosing.php
Je ne peux pas me proposé à reprendre ton article, mais ça pourrait se faire à la rentrée.
Amitiées
C'est pas vraiment meilleur, c'est surtout plus pratique. Quand tu mentionnes à la fin du paragraphe IV.b. que "la perfection n'est pas de ce monde" c'est qu'effectivement le code devient un peu lourd avec des marqueurs dynamiques si l'on veut binder individuellement les variables.
Tu ne pouvais guère faire mieux sauf en utilisant "array_fill" pour créer la chaine de marqueurs (mais ça reste une amélioration anecdotique), mais ce que je voulais surtout dire est que dans le cas de marqueurs dynamiques le passage du tableau de variables dans le execute() est la voie la plus pratique et du coup le code devient plus fluide Après on est bien d'accord que c'est pour optimiser le visuel et l'écriture du code, sinon c'est pas les foreach en plus qui vont changer significativement les performances pures.
Pour le reste, l'histoire de désactiver l'émulateur pdo de php est une information que je ne vois pas assez à mon sens et pourtant c'est super pratique et plus performant donc dommage de s'en priver. D'autant plus qu'aujourd'hui tous les sgbdd ont leur propre gestionnaire pdo. Mais bon à l'époque de l'écriture du tuto cette info n'était peut être pas pertinente.
Pour conclure, je te remercie de ce tuto car c'est celui dont je me suis servi en premier quand j'ai voulu passer à pdo après une longue période mysql puis mysqli. Je l'ai trouvé très bien fait, efficace, et il m'a permis d'acquérir rapidement de bonnes premières bases. Et c'est d'ailleurs parce que je continue à le recommander que j'ai voulu apporter ces quelques informations complémentaires pour l'actualiser
Je suis débutant en programmation et je n'aime pas suivre bêtement les tutos car le lendemain j'ai quasiment tout oublié! par contre le fait de comprendre le fonctionnement et les différences avec les autre méthodes me permettent de beaucoup mieux retenir les processus, de m'aider à trouver les erreurs que je fais, que du bon quoi!
C'est pour cela que je tiens à vous remercier pour le temps passé à créer cet article, à la pédagogie utilisée, c'est beaucoup plus clair pour moi et me permettra de mieux comprendre mon code pour repousser encore plus mes connaissances!!!
Merci et bonne continuation!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager