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

PHP & Base de données Discussion :

Requête multiple PDO problème buffering [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 10
    Par défaut Requête multiple PDO problème buffering
    Bonjour, je suis débutant et j'utilise PDO, après avoir fait deux requêtes préparé en INSERT qui fonctionnes, J'aimerais faire ces deux autres requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $query3 = 'SELECT nom FROM categorie WHERE nom="' . $_POST["categorie"] . '"';
               $stmt3 = $dbh->exec($query3);
     
          if ($stmt3 == TRUE) {
          echo "deja une categorie similaire, ne generera pas une nouvelle categorie";
          } else {
          $query4 = 'INSERT INTO categorie (nom) VALUES (:nom)';
          $stmt4 = $dbh->prepare($query4);
          $stmt4->bindValue('nom', $_POST["categorie"]);
          $stmt4->execute();
     
          }
    Malheureusement j'obtiens ce code erreur:

    Error: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.



    Après deux jours de recherche et plusieurs essaies en fonction de la doc et d'autres forum je n'arrive toujours pas à conclure..

    Quelqu'un connaît-t-il ce problème et comment le résoudre svp?

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    En gros, le message d'erreur te dit qu'il ne peut pas parcourir le résultat d'une requête alors qu'il y a déjà le résultat d'une autre requête en mémoire. A priori, tu imbriques la lecture de données dans une autre lecture de données et PDO n'aime pas ça. Tu peux récupérer le résultat de la 1ere requête en appelant fetchAll ou la parcourir à la main et fermer le curseur par closeCursor.

    Au passage, il ne faut pas utiliser exec pour une requête SELECT. Utilise plutôt query ou une requête préparée.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 10
    Par défaut
    Bonjour Celira et merci pour cette réponse aussi rapide!

    J'ai réussi

    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
    $query3 = 'SELECT nom FROM categorie WHERE nom= :categorie';
        $stmt3 = $dbh->prepare($query3);
        $stmt3->bindValue(':categorie', $_POST["categorie"]);
        $stmt3->execute();
        //Récupérer toutes les données retournées
        $arrAll = $stmt3->fetchAll();
     
     
        if (empty($arrAll)) {
            $query4 = 'INSERT INTO categorie (nom) VALUES (:nom)';
            $stmt4 = $dbh->prepare($query4);
            $stmt4->bindValue(':nom', $_POST["categorie"]);
            $stmt4->execute();
            //Clore la requête préparée???
            $stmt4->closeCursor();
            $stmt4 = NULL;
        } else {
            echo "La categorie existe deja donc pas d'insert";
        }
    Une dernière petite question, faut-t-il fermer toute les requêtes préparé avec un closeCursor()? Merci

    ps: J'ai remarqué que ici le closeCursor ne sert à rien car fetchAll() s'occupe de fermer les anciennes requête SELECT.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    PDOStatement::closeCursor() libère la connexion au serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées, mais laisse la requête dans un état lui permettant d'être de nouveau exécutée.

    Cette méthode est utile pour les drivers de base de données qui ne supportent pas l'exécution d'objet PDOStatement lorsqu'un objet PDOStatement exécuté précédemment a encore des lignes non récupérées.
    En gros, si tu exécute la requête 1, que tu parcours entièrement le résultat (soit avec fetchAll, soit avec une boucle sur fetch), puis que tu exécutes la requête 2, il n'est pas nécessaire de fermer la requête 1.
    Par contre, si tu exécute la requête 1, que tu récupères uniquement la 1ere ligne du résultat parce que les autres lignes ne t'intéressent pas, là il faut fermer la requête 1 avant d'exécuter la requête 2.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 10
    Par défaut
    Merci beaucoup .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] problème variable dans requête select pdo
    Par solara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/01/2016, 19h02
  2. [MySQL-5.1] Problème avec requêtes multiples
    Par bronon dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/08/2014, 00h27
  3. [PDO] Problème de requête avec PDO
    Par methos1435 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2010, 02h39
  4. Problème requêtes multiples (moteur de recherche)
    Par kasey dans le forum Langage SQL
    Réponses: 7
    Dernier message: 27/08/2009, 23h31
  5. [PDO] Problème de requête préparée (à n'y rien comprendre?)
    Par waldo2188 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/03/2007, 21h53

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