IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

passage à mysql pdo


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut passage à mysql pdo
    Bonjour,

    J'essaie de passer à mysql pdo, avec quelques difficultés.
    Je pars de ce morceau de code qui fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	$reponse = mysql_query("SELECT *  FROM `vocabulaire_anglais` WHERE `Francais` LIKE '%$requete_F%'") or die(mysql_error());
    	while ($donnees = mysql_fetch_array($reponse) )
    	{
    		$id = $donnees['id'];
    		$anglais = $donnees['Anglais'];
    		$francais = $donnees['Francais'];
    	echo "$anglais se traduit $francais";
           }
    J'essaie le plus simple !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse = $bdd->query("SELECT *  FROM `vocabulaire_anglais` WHERE `Francais` LIKE  '%$requete_F%'");
    Mais ça ne fonctionne pas.
    Je cherche un peu et je trouve ce genre de syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $reponse = $bdd->query("SELECT *  FROM `vocabulaire_anglais` WHERE `Francais` LIKE  ?");
    $reponse->execute(array("%$requete_F%"));
    Qu'est-ce qui peut y avoir qui ne va pas ?

    Cordialement,

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Je rectifie un peu ma demande:
    en fait ma deuxième tentative fonctionne, mais ce qui la fait foirer, c'est que j'essaie de compter le nombre de lignes que me donne ma requête avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $count = $reponse->rowCount();
    Comment faire ce décompte ?
    Cordialement,

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    tu ne prépares jamais tes requêtes ?
    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $stmt = $bdd->prepare($sql);
    Je t'invite à lire la doc, car $stmt est un PDOStatement et il y a une petite info sur l'utilisation de rowCount() avec un SELECT ici

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    désolé, mais je n'y comprends vraiment rien!
    J'ai essayé de transposer l'exemple 2 de la page que vous m'indiquez, mais ça ne marche pas !

  5. #5
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    "préparer la requête" ça veut dire que tu donnes ta requête à analyser à ta base de donnée pour que celle-ci prépare le plan d’exécution de la requête, cad la façon optimale de récupérer les données.

    La préparation de la requête se fait sans donner les valeurs littérales par exemple au lieux d'écrire toto LIKE '%literal' on fait toto LIKE :value ou value représente une variable nommée qui sera évaluée (bind) au moment de l’exécution de la requete.

    D'ou les fonctions prepare et execute de l'api PDO.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Merci d'avoir cette patience
    Oui, je pensais avoir compris cela, mais je n'arrive pas à le refaire:

    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
    18
    19
    20
    21
    22
    23
    <?php
    try
    {
     
     
    $bdd = new PDO('mysql:host=localhost;dbname=loupiote', 'root', '*******', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
    	$bdd->query("set character set 'utf8'");//for using utf-8
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    $requete_F=$_POST['requete_F'];
    echo "#$requete_F#<br>";
    /* Exécute une requête préparée en passant un tableau de valeurs */
    $reponse = $bdd->prepare("SELECT *  FROM `vocabulaire_anglais` WHERE `Francais` LIKE :requete_F");
    $reponse->execute(array(':requete_F' => "%$requete_F%"));
    while ($donnees = $reponse->fetchAll());
    {		$anglais = $donnees['Anglais'];
    		$francais = $donnees['Francais'];
    echo "$anglais se traduit par $francais";
    }
    ?>
    Il doit y avoir quelque chose qui cloche, parce que ça ne marche pas

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    C'est normal, remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($donnees = $reponse->fetchAll())
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
    PS : quand tu dis "ça ne marche pas" c'est pas très instructif, il vaut mieux poster un éventuel message d'erreur ou dire que j'obtiens une page blanche ou ce que tu veux du moment que ça décrit plus précisément le problème auquel tu es confronté.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Oui excusez-moi
    Quand je disais que ça ne marchait pas, c'est que ça ne donnait pas le résultat que j'attendais: la variable $requete_F est récupérée par un formulaire et le test par echo montre qu'elle arrive bien au début du script.
    Mais, si le script marchait, il devrait me donner plusieurs réponses avec les mots que je teste. Or le second echo ne m'indique que "se traduit par"

    Mais bonne nouvelle, ça va beaucoup mieux avec votre suggestion

    Il ne me reste plus qu'à comprendre ce que veut dire :
    À la place, utilisez PDO::query() pour faire une requête SELECT COUNT(*), puis utilisez PDOStatement::fetchColumn() pour récupérer le nombre de lignes retournées. Votre application peut ainsi effectuer la bonne action.

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ça veut juste dire qu'il est conseillé de compter les enregistrements en utilisant la syntaxe propre à chaque moteur de base de données que de le faire en PHP.

    Pour coller à ta problématique : suppose que tu cherches à compter le nombre d'enregistrements correspondant à WHERE `Francais` LIKE :requete_F.

    Tu as deux manières pour y parvenir :
    Si tu sais que le volume des données ne sera pas important alors il est possible de rapatrier les données filtrées et les compter après coup.
    Cela donnerait quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $nb = 0;
    while ($donnees = $reponse->fetchAll())
    {
        $nb += 1;
        $anglais  = $donnees['Anglais'];
        $francais = $donnees['Francais'];
        echo "$anglais se traduit par $francais";
    }
    echo "<br />Nombre total d'enregistrements : {$nb}";
    Maintenant suppose que ta requête soit susceptible de rapatrier un volume conséquent de données, tu n'afficheras pas par exemple 5000 enregistrements sur la même page, tu utiliseras probablement un système de pagination. Dans ce cas, tu n'as absolument aucun intérêt à rapatrier les 5000 enregistrements mais juste le nombre d'enregistrements que tu vas afficher.
    Par contre, pour compter le nombre de pages, tu auras l'obligation de connaitre le nombre total d'enregistrements que la requête devrait retourner.
    Tu feras dans ce cas, une requête supplémentaire de comptage comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "SELECT COUNT(*) AS nb_rec FROM vocabulaire_anglais WHERE `Francais` LIKE :requete_F";
    $stmt = $bdd->prepare($sql);
    $qry  = $stmt->execute(array(':requete_F' => "%$requete_F%"));
    $nb   = $qry->fetchColumn();
     
    echo "<br />Nombre total d'enregistrements : {$nb}";
    Ici la requête ne revoit qu'un seul et unique enregistrement, le ->fetchColumn() te permet de faire l'économie d'une boucle.
    En espérant avoir été clair

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Bah c'est pas compliqué, puisque rowCount() ne fonctionne pas avec toutes les bases, l'exemple indique qu'on peut faire deux requêtes, la première servant uniquement à compter le nombre de lignes.
    Une autre alternative possible dans de nombreux cas est d'utiliser fetchAll pour récupérer le tableau des résultats, de compter ce tableau pour avoir le nombre de lignes et de lister le tableau. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $tab_donnees = $reponse->fetchAll();
     
    $nb_lignes = count($tab_donnees);
     
    foreach ($tab_donnees as $donnees);
    {		$anglais = $donnees['Anglais'];
    		$francais = $donnees['Francais'];
    echo "$anglais se traduit par $francais";
    }
    Cela dit si tu utilise mysql, normalement rowCount() devrait fonctionner.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Tu feras dans ce cas, une requête supplémentaire de comptage comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "SELECT COUNT(*) AS nb_rec FROM vocabulaire_anglais WHERE `Francais` LIKE :requete_F";
    $stmt = $bdd->prepare($sql);
    $qry  = $stmt->execute(array(':requete_F' => "%$requete_F%"));
    $nb   = $qry->fetchColumn();
     
    echo "<br />Nombre total d'enregistrements : {$nb}";
    Ici la requête ne revoit qu'un seul et unique enregistrement, le ->fetchColumn() te permet de faire l'économie d'une boucle.
    En espérant avoir été clair
    Oui, c'est quelque chose dans ce genre là que je cherche, mais cet exemple ne fonctionne pas mieux que mes autres tentatives.
    Si j'essaie cela, plus rien ne s'affiche après le test de reception de la requete
    (#mon_test#)

    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
    18
    19
    20
    21
    22
    23
    24
     
    <?php
    try
    {
     
     
    $bdd = new PDO('mysql:host=localhost;dbname=loupiote', 'root', '*******', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
    	$bdd->query("set character set 'utf8'");//for using utf-8
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    $requete_F=$_POST['requete_F'];
    echo "#$requete_F#<br>";
     
    $sql = "SELECT COUNT(*) AS nb_rec FROM vocabulaire_anglais WHERE `Francais` LIKE :requete_F";
    $stmt = $bdd->prepare($sql);
    $qry  = $stmt->execute(array(':requete_F' => "%$requete_F%"));
    $nb   = $qry->fetchColumn();
     
    echo "<br />Nombre total d'enregistrements : {$nb}";
     
     ?>

  12. #12
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 10
    Points
    10
    Par défaut
    Faudrait pas sortir les variables genre echo 'il y a '.$nb.' enregistrements' ?

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Black_Layer Voir le message
    Faudrait pas sortir les variables genre echo 'il y a '.$nb.' enregistrements' ?
    J'ai l'impression que c'est plus compliqué que cela.
    Bon, j'ai trouvé une autre solution pour faire ce que je voulais faire, mais si quelqu'un a une idée sur ce truc, je veux bien quand même.
    Sinon, je vous remercie tous de votre attention et de vos conseils.
    J'y ai passé la journée sur ce truc, mais j'ai l'impression d'avoir progressé. Le problème est que je n'ai pas très souvent l'occasion de me plonger dans ce genre d'exercice et, à chaque fois, il faut pratiquement que je reprenne tout depuis le début. OUF
    Encore un GRAND MERCI,

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Tu devrais utiliser des blocs try/catch pour visualiser les éventuelles erreurs ou utiliser l'option PDO::ERRMODE_WARNING. Ensuite si une requête ne donne pas le résultat attendu on exécute son équivalent (en ayant remplacé les variables par des valeurs évidemment) dans une fenêtre mysql de phpmyadmin pour vérifier le résultat.

    Sinon rawsrc et moi t'avons donnés un exemple pour éviter d'avoir à faire une première requête et il semble que cela devrait pouvoir fonctionner dans ton cas.
    La méthode de rawsrc est plus économe en terme de ressource, la mienne nécessite un count mais permet de connaître le nombre de ligne avant d'avoir fait la boucle.

Discussions similaires

  1. [PHP 5.4] passage Mysql à Sql Serveur
    Par gilles_906 dans le forum Langage
    Réponses: 18
    Dernier message: 24/10/2012, 16h33
  2. Problème scriptella passage Mysql à SQLServer
    Par jocqfd dans le forum Administration
    Réponses: 7
    Dernier message: 18/01/2010, 14h59
  3. [PHP 5.3] SQL MySQL PDO
    Par éric1 dans le forum Langage
    Réponses: 8
    Dernier message: 20/08/2009, 11h20
  4. [PDO] MySQL, PDO et serialize()
    Par juJuv51 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/02/2008, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo