IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Voir le flux RSS

Dendrite

PDO une soupe et au lit !

Note : 7 votes pour une moyenne de 3,29.
par , 20/05/2018 � 13h33 (10039 Affichages)
  1. Introduction
  2. Exemple pratique : structure de la table SQL
  3. PDO Script de connexion � la base de donn�es
  4. Le bloc try & catch : afficher les exceptions
  5. Requ�te SELECT sans filtre : lister tous les enregistrements
  6. Requ�te SELECT avec filtre : lister les enregistrements selon crit�res
  7. Requ�te INSERT : ajouter un enregistrement
  8. Requ�te UPDATE : modifier un enregistrement
  9. Requ�te DELETE : supprimer un enregistrement
  10. Astuces et erreurs courantes
  11. Pour aller plus loin
  12. Les participants � ce billet collaboratif


1 - Introduction

PDO est une classe d�objets tout particuli�rement d�di�e � g�n�rer des variables PHP dynamiques (ici nous ne traiterons que des tableaux associatifs) en acc�dant � la base de donn�es.
PDO permet d�utiliser des requ�tes pr�par�es, et utilis�es � bon escient, les requ�tes pr�par�es permettent d��viter une attaque de votre base par un navigateur client (injection SQL). Pour les m�mes raisons, PDO g�re proprement l��chappement.

Ici, vous ne verrez QUE la technique des requ�tes pr�par�es par marqueurs anonymes. Pour utiliser la technique des requ�tes pr�par�es par marqueurs nomm�s, sauter au paragraphe 11 !

Et si vous vous dites : elle est bien gentille, Dendrite, mais j'en fais quoi moi apr�s, de son tableau PHP hein ?
Ca me dit pas comment je vais le transformer en tableau HTML !
C'est par ici, la suite logique de ce billet...

De belles boucles sans frisottis

2 - Exemple pratique : structure de la table SQL

A - un identifiant unique

L'id ou identifiant, c'est une information unique pour reconna�tre facilement un enregistrement. Dans la r�alit�, �a peut �tre votre num�ro de S�cu, votre login sur Developpez ou le num�ro de ticket que vous prenez pour faire la queue chez le boucher.
La fa�on la plus simple d'avoir un identifiant unique, c'est d'utiliser un chiffre et de faire �+1� � chaque fois qu'une ligne est cr��e. Par d�faut, un champ entier (INT) peut aller jusqu'� 2 147 483 647 (oui, plus de 2 milliards), ce qui veut dire qu'on peut cr�er une ligne toutes les secondes pendant 68 ans avant d'�tre � court de nombres.

B � auto-incr�mentation

"auto-incr�ment�", �a veut tout simplement dire qu'on va demander � la base de faire le �+1� � notre place. Pas besoin de r�fl�chir et de chercher quel est le num�ro de la derni�re ligne enregistr�e, �a se fait automatiquement.

C � La table contact

Si vous n�avez pas de base disponible, cr�ez une base nomm�e ma_base dans votre PHPMYADMIN.
Et copiez-collez ce code SQL (dans la console SQL de PHPMYADMIN) qui vous construit et vous remplit une petite table de contacts.
Code SQL : 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
18
19
20
CREATE TABLE IF NOT EXISTS `contact` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(100) NOT NULL,
  `prenom` varchar(100) NOT NULL,
  `mail` varchar(200) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `nom` (`nom`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
INSERT INTO `contact` (`id`, `nom`, `prenom`, `mail`) VALUES
(1, 'ACCOYER', 'Alain', '[email protected]'),
(2, 'BRABOIS', 'Bernard', '[email protected]'),
(3, 'CHAZAL', 'Claire', '[email protected]'),
(4, 'DENDRITE', 'Daisy', '[email protected]'),
(5, 'CHAZAL', 'Etienne', '[email protected]'),
(6, 'CHAZAL', 'Chantal', '[email protected]'),
(7, 'CHAZAL', 'Kevin', '[email protected]'),
(8, 'ZANZIBAR', 'Zoé', '[email protected]'),
(9, 'CASERATI', 'Michel', '[email protected]'),
(10, 'FRIPON', 'Françoise', '[email protected]');

3a - PDO - Script de connexion � la base de donnees

A la racine de votre site, dans le r�pertoire www si vous �tes sous WAMP, vous cr�ez un fichier db_mysql.php.
Et vous collez le code suivant :
Bien s�r, vous changez ce qui a besoin de l��tre dans les valeurs de votre connexion.
Code PHP : 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
18
19
20
21
22
23
24
25
26
<?php
// @author : rawsrc - 2018 - Pour DVP
// on vérifie si la fonction de connexion a déjà été définie afin d'éviter de la redéfinir
if ( ! function_exists('db_connexion')) {
   function db_connexion() {
      // une fois ouverte, on renvoie toujours la même connexion
      static $pdo;
      // on vérifie si la connexion n'a pas déjà été initialisée
      if ( ! ($pdo instanceof PDO)) {
         // tentative d'ouverture de la connexion MySQL
         try {
            $pdo = new PDO('mysql:host=localhost;port=3306;dbname=ma_base;charset=utf8','root', '', [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES   => false
            ]);
         } 
         catch (PDOException $e) {
            throw new InvalidArgumentException('Erreur connexion à la base de données : '.$e->getMessage());
            exit;
         }
      }
      // renvoi de la ressource : connexion à la base de données
      return $pdo;
   }
}
return db_connexion();

Comment tester votre connexion maintenant ?
En mettant juste cette ligne, sur un fichier test.php au m�me niveau que votre fichier db_mysql.php :
Code PHP : S�lectionner tout - Visualiser dans une fen�tre � part
$db = include 'db_mysql.php';
S'il ne g�n�re rien, c'est � dire pas d'erreur : C'est que la connexion est bonne !
Vous pouvez supprimer le fichier test.php et passer � la suite...

3b - PDO - fermer la connexion, c'est bien.
Et c'est tout simple en plus !
L�, pour les exemples, j'ouvre et je ferme � chaque requ�te parce que je souhaite vous livrer un code directement fonctionnel.
Mais comprenez-bien que sur un script, vous ouvrirez la connexion, vous ferez peut-�tre dix requ�tes, de select, d'update, d'insert, toujours avec la m�me connexion et vous ne la fermerez qu'en fin de page.

4 � Le bloc try catch : afficher les exceptions

Maintenant, vous pouvez mettre ceci sur un nouveau fichier test.php, pour comprendre � quoi sert un bloc try and catch, et la gestion des exceptions (messages d'erreurs).
Code PHP : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
 
try{ 
   //ici vous écrivez tout votre script
   //jusqu’à la fin, s’il y a une exception, elle sera interceptée par le catch
   //on fait exprès d'écrire une bêtise ici
   //$i=0;
   echo $i;
} 
catch(Exception $e){
   //s'il y a un probleme PHP ou SQL, que ce soit un warning ou une erreur fatale, tout s'affichera ici
   print "Erreur ! " . $e->getMessage() . "<br/>";
}

5 - Requ�te SELECT sans filtre : lister tous les enregistrements

Testez bien la requ�te dans votre PHPMYADMIN d�abord !
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
SELECT *
FROM contact
ORDER BY nom, prenom;

Quand tout fonctionne, on cr�e une page "contact.php" que l'on positionne � la racine de notre site (toujours au m�me niveau que notre autre page "db_mysql.php". Elle contient ceci :
On n�a que la variable $sql � changer.
Code PHP : 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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
//pas de filtre
$sql='SELECT *
FROM contact
ORDER BY nom, prenom;';
//on initialise notre tableau PHP
$data=array();
$db = include 'db_mysql.php'; 
try{
   //la ligne qui lance la requête préparée
   $stmt = $db->prepare($sql);
   //pas de filtres donc pas de paramètres
   $stmt->execute();
   //$data est un tableau de tableaux associatifs directement exploitable ensuite dans une boucle foreach
   $data= $stmt->fetchAll(PDO::FETCH_ASSOC);
   unset($db);
   //$data est complet
   if(count($data)>0){
      echo '<pre>';
      print_r($data);
      echo '</pre>';
   }
   //ceci n'est pas une exception 
   //il n'y a peut-etre pas encore de donnees dans la table !
   else{
      echo 'Aucun resultat pour cette requete';
   }
} 
catch (Exception $e) {
   //s'il y a un probleme PHP ou SQL, tout s'affichera ici
   print "Erreur ! " . $e->getMessage() . "<br/>";
}

6 - Requ�te SELECT avec filtre : lister les enregistrements selon crit�res

Si par ailleurs, vous souhaitez introduire des filtres � votre requ�te, votre page contact.php devra �tre construite comme suit :
On veut faire remonter tous les contacts dont le nom est � CHAZAL � et dont le pr�nom commence par � C � et dont l�id est strictement sup�rieur � 2, ce qui doit nous retourner 2 enregistrements :
Testez bien la requ�te dans votre PHPMYADMIN d�abord !
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
SELECT id, nom, prenom, mail
FROM contact
WHERE nom="CHAZAL" and prenom like "C%" and id > 2
ORDER BY nom, prenom;

On positionne la page contact.php � la racine de notre site. Elle contient ceci :
On doit changer la variable $sql et la ligne $stmt->execute pour placer les valeurs pr�cises de filtres dans l�ordre.
Code PHP : 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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
//on supprime les guillemets d’une chaîne SQL, PDO s’en occupera
$sql='SELECT id, nom, prenom, mail
FROM contact
WHERE nom= ? and prenom like ? and id > ?
ORDER BY nom, prenom;';
//on initialise notre tableau PHP
$data=array();
$db = include 'db_mysql.php'; 
try {
   //la ligne qui lance la requête préparée
   $stmt = $db->prepare($sql);
   //on affecte les marqueurs précis sur les filtres
   //en vrai, vous aurez plutôt des variables de type POST envoyées par un formulaire
   $nom='CHAZAL';
   $prenom_debut='C%';
   $id_superieur_a=2;
   //Attention, bien mettre dans l'ordre de la requête ! nom puis prenom_debut puis $id_superieur_a
   $stmt->execute(array($nom,$prenom_debut,$id_superieur_a));
   //$data est un tableau de tableaux associatifs directement exploitable ensuite dans une boucle foreach
   $data= $stmt->fetchAll(PDO::FETCH_ASSOC);
   unset($db);
   //$data est complet
   if(count($data)>0){
      echo '<pre>';
      print_r($data);
      echo '</pre>';
   }
   //ceci n'est pas une exception 
   //il n'y a peut etre pas de CHAZAL avec un prénom qui commence par un C et dont l’id est strictement supérieur à 2
   else{
      echo 'Aucun resultat pour cette requete';
   }
} catch (Exception $e) {
   //s'il y a un problème PHP ou SQL, tout s'affichera ici
   print "Erreur ! " . $e->getMessage() . "<br/>";
}

7 - Requ�te INSERT : ajouter un enregistrement

Si par ailleurs, vous souhaitez ins�rer des donn�es dans votre table, votre page contact.php devra �tre construite comme suit.

On veut ins�rer un nouveau contact.
Testez bien la requ�te dans votre PHPMYADMIN d�abord !
Si la requ�te SQL fonctionne, pensez-bien � supprimer Mme GAILLARD de votre table via PHPMYADMIN, avant de passer � la suite.
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
INSERT INTO contact (id, nom, prenom, mail) VALUES (NULL, 'GAILLARD', 'Geneviève', '[email protected]');
On positionne la page contact.php � la racine de notre site. Elle contient ceci :
On doit changer la variable $sql et la ligne $stmt->execute pour placer les valeurs pr�cises de filtres dans l�ordre.
Code PHP : 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
18
19
20
21
22
23
24
<?php
//on supprime les guillemets d’une chaîne SQL, PDO s’en occupera
//on remplace l’id auto-increment par NULL, la table s’en chargera
$sql='INSERT INTO contact (id, nom, prenom, mail) VALUES (NULL, ?, ?, ?)';
$db = include 'db_mysql.php';
try { 
   //la ligne qui lance la requête préparée
   $stmt = $db->prepare($sql);
   //on affecte les marqueurs précis sur les filtres
   //en vrai, vous aurez plutôt des variables de type POST envoyées par un formulaire
   $nom='GAILLARD';
   $prenom='Geneviève';
   $mail='[email protected]';
   //Attention, bien mettre dans l'ordre de la requête ! Nom puis prenom puis mail
   $stmt->execute(array($nom,$prenom,$mail)) ;
   // on peut récupérer le nombre de lignes affectées 
   $nb_insert = $stmt->rowCount();
   echo $nb_insert.' insertion effectuée<br/>';
   unset($db);
} 
catch (Exception $e) {
   //s'il y a un problème PHP ou SQL, tout s'affichera ici
   print "Erreur ! " . $e->getMessage() . "<br/>";
}

8 - Requ�te UPDATE : modifier un enregistrement

Si par ailleurs, vous souhaitez modifier des donn�es existantes dans votre table, votre page contact.php devra �tre construite comme suit.

On veut corriger le mail de Mme ZANZIBAR, car on a mis .ocm au lieu de .com.
Testez bien la requ�te dans votre PHPMYADMIN d�abord !
Si la requ�te SQL fonctionne, pensez-bien ensuite � remette l�erreur �orange.ocm� via PHPMYADMIN, avant de passer � la suite.
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
UPDATE contact SET mail = '[email protected]' WHERE contact.id = 8;
On positionne la page contact.php � la racine de notre site. Elle contient ceci :
On doit changer la variable $sql et la ligne $stmt->execute pour placer les valeurs pr�cises de filtres dans l�ordre.
Code PHP : 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
18
19
20
21
<?php
//on supprime les guillemets d’une chaîne SQL, PDO s’en occupera
$sql='UPDATE contact SET mail = ? WHERE contact.id = ?;';
$db = include 'db_mysql.php';
try { 
   //la ligne qui lance la requête préparée
   $stmt = $db->prepare($sql);
   //on affecte les marqueurs précis sur les filtres
   //en vrai, vous aurez plutôt des variables de type POST envoyées par un formulaire
   $mail='[email protected]';
   $id=8;
   //Attention, bien mettre dans l'ordre de la requête !  mail puis id
   $stmt->execute(array($mail,$id)) ;
   // on peut récupérer le nombre de lignes affectées 
   $nb_update = $stmt->rowCount();
   echo $nb_update.' modif effectuée<br/>';
   unset($db);
} catch (Exception $e) {
   //s'il y a un problème PHP ou SQL, tout s'affichera ici
   print "Erreur ! " . $e->getMessage() . "<br/>";
}

9 - Requ�te DELETE : supprimer un enregistrement

Si par ailleurs, vous souhaitez supprimer des donn�es dans votre table, votre page contact.php devra �tre construite comme suit.

On veut supprimer l�enregistrement Chantal CHAZAL, car son mail n�existe pas.
Testez bien la requ�te dans votre PHPMYADMIN d�abord !
Si la requ�te SQL fonctionne, pensez-bien � remettre Chantal CHAZAL dans votre table via PHPMYADMIN, avant de passer � la suite, et rep�rez son nouvel id !
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
DELETE FROM contact WHERE contact.id = 6;
On positionne la page contact.php � la racine de notre site. Elle contient ceci :
On doit changer la variable $sql et la ligne $stmt->execute pour placer les valeurs pr�cises de filtres dans l�ordre.
Code PHP : 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
18
19
<?php
$sql='DELETE FROM contact WHERE contact.id = ?;';
$db = include 'db_mysql.php';
try {
   //la ligne qui lance la requête préparée
   $stmt = $db->prepare($sql);
   //on affecte le marqueur précis sur le filtre
   //en vrai, vous aurez plutôt des variables de type POST envoyées par un formulaire
   $id=6;
   $stmt->execute(array($id));
   // on peut récupérer le nombre de lignes affectées 
   $nb_delete = $stmt->rowCount();
   echo $nb_delete.' suppression effectuée<br/>';
   unset($db);
} 
catch (Exception $e) {
   //s'il y a un problème PHP ou SQL, tout s'affichera ici
   print "Erreur ! " . $e->getMessage() . "<br/>";
}

10 - Astuces et erreurs courantes

1 - A proscrire totalement et pour toujours
Code PHP : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
$sql='SELECT id, nom, prenom, mail
FROM contact
WHERE nom="'.$_POST['nom'].'" and prenom like "'.$_POST['prenom_debut'].'" and id > '.$_POST['id_min'].'
ORDER BY nom, prenom;';
Ceci est la porte ouverte aux injections SQL. PDO en soi ne pr�vient pas les injections SQL.
https://fr.wikipedia.org/wiki/Injection_SQL
Il vous faut utiliser PDO + les requ�tes pr�par�es telles qu�expos�es ci-dessus.

2 - PDO plus obscur ?
On peut se dire la chose suivante : Ce qui �tait bien avec la requ�te ci-dessus, c�est qu�un simple echo $sql; nous permettait de copier-coller et de tester dans phpmyadmin que tout �tait bon. Et �a, ce n�est plus possible avec PDO, le rendant plus obscur.
Pourtant, il faut juste inverser la d�marche, et �a reste aussi simple. Comme montr� dans cet article, on commence par une requ�te qui fonctionne dans phpmyadmin. Dans $sql, on met des points d�interrogation � la place des valeurs en dur� et enfin, on reporte les valeurs variables PHP dans le array() des param�tres.

11 � Pour aller plus loin

Ici nous avons fait le choix de n�utiliser QUE des marqueurs anonymes (points d�interrogation).
Pour utiliser des marqueurs nomm�s, car nombre de d�veloppeurs trouvent cette m�thode plus lisible, merci de lire ce tutoriel qui va bien plus loin que ce petit article d�initiation:
PDO niveau 2 (placeholders)
https://fmaz.developpez.com/tutoriel...omprendre-pdo/

12 � Les participants � ce billet collaboratif

Ceci est un billet collaboratif : Un grand merci donc � tous les participants !
Dans l�ordre alphab�tique :
- Andry.ayme
- Celira
- Dendrite
- Jreaux62
- MaitrePylos
- ProgElect
- Rawsrc
- Willy_k
Et merci � LaurentSc pour avoir test� les codes !

Envoyer le billet � PDO une soupe et au lit ! � dans le blog Viadeo Envoyer le billet � PDO une soupe et au lit ! � dans le blog Twitter Envoyer le billet � PDO une soupe et au lit ! � dans le blog Google Envoyer le billet � PDO une soupe et au lit ! � dans le blog Facebook Envoyer le billet � PDO une soupe et au lit ! � dans le blog Digg Envoyer le billet � PDO une soupe et au lit ! � dans le blog Delicious Envoyer le billet � PDO une soupe et au lit ! � dans le blog MySpace Envoyer le billet � PDO une soupe et au lit ! � dans le blog Yahoo

Mis � jour 01/11/2020 � 16h05 par Dendrite

Cat�gories
PHP , D�veloppement Web

Commentaires

  1. Avatar de Dendrite
    • |
    • permalink
    Bonjour !
    N'h�sitez pas � tester et commenter ici si vous rencontrez la moindre difficult� !
    C'est fait pour �a !
  2. Avatar de rawsrc
    • |
    • permalink
    Salut miss,

    le paragraphe 4 (Le bloc try catch : afficher les exceptions) est mal formul� :
    Code php : 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
    try{ 
       //ici vous écrivez tout votre script
       //On vérifie que notre connexion est bonne avant d'aller plus loin
       $pdo = include 'db_mysql.php';
       if($pdo instanceof PDO) {
          echo 'Connexion réussie ! On peut continuer !';
       }
       else{
          echo 'Connexion ratée ! Essaie encore !';
       }
       //jusqu’à la fin, s’il y a une exception, elle sera interceptée par le catch
    } 
    catch(Exception $e){
       //s'il y a un probleme PHP ou SQL, que ce soit un warning ou une erreur fatale, tout s'affichera ici
       print "Erreur ! " . $e->getMessage() . "<br/>";
    }
    Le code de connexion te renvoie obligatoirement une ressource PDO sinon il d�clenche une erreur fatale.
    Donc tout ce code est � remplacer simplement par :
    Code php : S�lectionner tout - Visualiser dans une fen�tre � part
    $pdo = include 'db_mysql.php';
    Apr�s quand tu pr�pares et ex�cutes du SQL, il est n�cessaire d'encapsuler ces bouts de code dans un try...catch car � l'ouverture de la connexion on indique express�ment qu'en cas de probl�me PDO doit nous avertir en d�clenchant une erreur PDOException avec PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    Mis � jour 15/09/2019 � 18h52 par rawsrc
  3. Avatar de Dendrite
    • |
    • permalink
    Salut Raw,

    Merci j'ai corrig� !
  4. Avatar de Willy_k
    • |
    • permalink
    Bonjour,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'Pour une version sup�rieure ou �gale � 5.3.6, il est conseill� de passer le ;charset dans le DSN http://php.net/manual/fr/mysqlinfo.concepts.charset.php
  5. Avatar de Dendrite
    • |
    • permalink
    Bonjour Willy !
    Ton lien me montre que c'est possible � partir de PHP 5.3.6. Tu as un lien qui me montre que c'est conseill� ?
  6. Avatar de Willy_k
    • |
    • permalink
    Il est marqu�

    Ci-dessous les exemples qui d�montrent la fa�on de modifier proprement le jeu de caract�res lors de l'ex�cution en utilisant chacune des APIs.
    Comme un conseil, non ?
  7. Avatar de Dendrite
    • |
    • permalink
    Ok willy. Merci, c'est corrig�.
  8. Avatar de Willy_k
    • |
    • permalink
    Sans filtre, il n y a vraiment aucun gain � pr�parer la requ�te, query aurait suffit, et les ; ne sont pas obligatoires.
  9. Avatar de Dendrite
    • |
    • permalink
    Le probl�me des d�butants, c'est qu'ils ne pr�parent JAMAIS les requ�tes quand il le faut. Alors je fais simple. Je leur montre comment TOUJOURS pr�parer leurs requ�tes. Ca manque totalement de nuances ? M'en fous. C'est PDO une soupe et au lit. Pour les nuances, on laisse ici, en commentaire... Donc pour ceux que �a int�resse, Willy a raison.
    Pour le chapitre 5, sans filtre, et celui-l� seulement, pas de risque d'injection SQL ! on peut donc se passer de requ�te pr�par�e, et gagner une ligne.
    en rempla�ant

    Code PHP : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    $stmt = $db->prepare($sql);
    $stmt ->execute();

    par

    Code PHP : S�lectionner tout - Visualiser dans une fen�tre � part
    $stmt = $db->query($sql);
  10. Avatar de Dendrite
    • |
    • permalink
    Ah oui, je r�ponds aussi � ceci. Willy dit � juste titre que les ';' ne sont pas obligatoires. On parle bien s�r des ';' du SQL.
    Pour la bonne raison que PDO ne g�re qu'une instruction SQL � la fois.
    Si vous souhaitiez cr�er une table puis la remplir via une requ�te PDO, vous ne pourriez pas mettre ces 2 instructions dans votre requ�te. Vous seriez oblig� de passer par 2 instructions PDO diff�rentes.
    Code SQL : 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
    18
    19
    20
    CREATE TABLE IF NOT EXISTS `contact` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` varchar(100) NOT NULL,
      `prenom` varchar(100) NOT NULL,
      `mail` varchar(200) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `nom` (`nom`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
     
    INSERT INTO `contact` (`id`, `nom`, `prenom`, `mail`) VALUES
    (1, 'ACCOYER', 'Alain', '[email protected]'),
    (2, 'BRABOIS', 'Bernard', '[email protected]'),
    (3, 'CHAZAL', 'Claire', '[email protected]'),
    (4, 'DENDRITE', 'Daisy', '[email protected]'),
    (5, 'CHAZAL', 'Etienne', '[email protected]'),
    (6, 'CHAZAL', 'Chantal', '[email protected]'),
    (7, 'CHAZAL', 'Kevin', '[email protected]'),
    (8, 'ZANZIBAR', 'Zoé', '[email protected]'),
    (9, 'CASERATI', 'Michel', '[email protected]'),
    (10, 'FRIPON', 'Françoise', '[email protected]');
  11. Avatar de laurentSc
    • |
    • permalink
    Merci de m'avoir cit� dans les remerciements !

    J'ai tout lu. N�anmoins, je n'ai pas accroch� sur le chapitre "introduction". Dr�le de fa�on de pr�senter PDO. Pour moi c'est un gestionnaire de base de donn�es, qui permet de faire abstraction du SGBD et je n'ai pas du tout retrouv� �a dans ton introduction.

    A part �a, tr�s int�ressant. Personnellement, comme toi, toutes mes requ�tes sont pr�par�es, m�me si �a sert � rien (une seule m�thode pour tout faire) ; par contre, je n'utilise que des marqueurs nomm�s pour plus de clart�.
  12. Avatar de rawsrc
    • |
    • permalink
    Salut Dendrite,

    juste un conseil, perd l'habitue de fermer tes fichiers.php avec le ?> final.

    Quand un fichier ne contient que du PHP, tu l'ouvres juste avec <?php et c'est tout.

    Au moins t'es s�r de ne pas avoir � chercher ou pourraient appara�tre des espaces intempestifs et autres joyeuset�s du m�me acabit.
  13. Avatar de Dendrite
    • |
    • permalink
    Bonjour rawsrc. Ok, merci du conseil. Je corrige pour ce billet.
  14. Avatar de Ciccillo
    • |
    • permalink
    Bonjour, dialogues entre connaisseurs... Moi je rame. Vous vous comprenez au quart de tour et le tuto semble �crit pour des initi�s. Par exemple, il faut deviner qu'� un moment donn� on parle de contacts.php � cr�er mais sans le nommer. Il faut s'imaginer qu'il y a une table � cr�er. Autre exemple, un peu avant les contacts (je crois), il y a un code o� l'utilisateur (du tuto) doit le copier-coller apr�s avoir cr�� la DB. Mais le coller o�? Par la suite le bouts de codes m'apparaissent comme des �lectrons libres... Ils sont reli�es par quoi, quelle logique, quel(s) cas? Il manque des exemples.

    Je termine sur un point positif. Ce tuto permet de se poser beaucoup de questions bien formul�es par ses divers ent�tes de chapitres. C'est bien bien que d'aller � la p�che d'infos sans savoir exactement quoi chercher. Merci.
  15. Avatar de Dendrite
    • |
    • permalink
    Bonjour Cicillo et merci de ton retour.
    Je vais tenir compte de tes remarques sur quelques points "Pr�ciser tout de suite que le script s'appelle contact.php" ou "Pr�ciser o� l'on colle le SQL"...
    Pour le reste, ce tuto ne s'adresse pas sp�cialement aux grands d�butants que tu sembles �tre en PHP-MYSQL, tu as raison, ce tuto essaie de s'adresser � un peu tout le monde. Sur mon blog, je me fais un peu plaisir et je ne reviens pas sempiternellement sur les bases suppos�es acquises. Beaucoup de gens ont d�j� une bonne habitude de d�veloppement avec d'autres librairies PHP d'acc�s aux bases, et surtout l'extension "mysql_" et veulent passer facilement � PDO. J'avoue que c'est d'abord � eux que j'ai pens�. Ce n'est pas une initiation � SQL pour les novices. C'est surtout une initiation simplifi�e � PDO.

    Ceci dit, quand je modifierai mon chapitre base de donn�es dans "PHP pour grands d�butants press�s", je le simplifierai encore et encore en tenant compte de tes remarques. Et notamment, je s�parerai l'initiation � SQL et l'initiation � PDO. Mais pas sur ce billet.
    Bonne continuation !
    Mis � jour 24/07/2018 � 11h55 par Dendrite
  16. Avatar de Xmael
    • |
    • permalink
    Extr�mement int�ressant.
    Merci
  17. Avatar de Dendrite
    • |
    • permalink
    Ravie que �a serve !
  18. Avatar de Dendrite
    • |
    • permalink
    Bonjour !

    Mise � jour importante (sur la recommandation de Jreaux), merci � toi.

    1) Bien pr�ciser t�t qu'on n'est pas cens� ouvrir et fermer une connexion � chaque requ�te, parce que �a va mieux en le disant !
    2) Ensuite, pour les requ�tes SELECT, �crire directement
    Code PHP : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    //$data est un tableau de tableaux associatifs directement exploitable ensuite dans une boucle foreach
    $data= $stmt->fetchAll(PDO::FETCH_ASSOC);
    Plut�t que de faire une boucle artificielle.
  19. Avatar de Dendrite
    • |
    • permalink
    Je voulais aussi ajouter quelque chose qui m'est souvent bien utile (mais seulement dans les commentaires cette fois), car c'est une notion un peu plus avanc�e.
    Souvent, je fais une table avec une cl� d'unicit�.
    Prenons une table contact('id','mail','pseudo').

    Mettons que 'id' soit auto-incr�ment�, que la colonne 'mail' soit le truc unique qu'on ne change jamais...
    J'ai donc pos� dans ma table contact une cl� d'unicit� sur mail. Pas possible de faire un doublon de mail.
    Que se passe-t-il ensuite si '[email protected]', t�te en l'air, est d�j� dans ma base, sous le pseudo 'dark_vador', et veut se r�inscrire, toujours avec le m�me mail donc, et le pseudo 'bisounours'... Eh oui, il a chang� avec l'�ge...

    Je r�gle �a ainsi en SQL :

    Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    INSERT INTO contact VALUES (NULL, '[email protected]', 'bisounours')
    ON DUPLICATE KEY UPDATE pseudo='bisounours';

    Comme VOUS avez pos� la cl� d'unicit� sur mail, il saura ce qu'est un doublon. Sinon, bien s�r, la db ne prend aucune initiative. Et miracle, dark_vador est devenu bisounours, sans changer de mail.
    Bien entendu, si le mail est absent de la table, c'est une simple insertion. Sinon, c'est une simple modif de pseudo.


    En PHP via PDO, c'est tout � fait possible aussi, avec cette m�thode :

    Code PHP : 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
    18
    <?php
    $sql='INSERT INTO contact VALUES (NULL, ?, ?)
    ON DUPLICATE KEY UPDATE pseudo=?;';
    $db = include 'db_mysql.php';
    try { 
       $stmt = $db->prepare($sql);
       $mail='[email protected]';
       $pseudo='bisounours';
       //c'est ici qu'il faut tilter : $pseudo doit être présent 2 fois ! Rappelez-vous, autant de valeurs que de points d'interrogation au dessus !
       $stmt->execute(array($mail, $pseudo, $pseudo)) ;
       // on peut récupérer une information assez précise (pour mysql du moins)
       $nb_insert = $stmt->rowCount();
       //si c'est 1, il y a eu une vraie insertion, si c'est 2, il y a eu une simple modification du pseudo...
       unset($db);
    } 
    catch (Exception $e) {
       print "Erreur ! " . $e->getMessage() . "<br/>";
    }

    Enjoy !