Partage
  • Partager sur Facebook
  • Partager sur Twitter

cannot execute queries while other unbuffered

cannot execute queries while other unbuffered queries are active

    15 août 2018 à 16:51:13

    Bonjour,

    Je ne comprends pas pourquoi cette erreur apparait, pouvez vous m'aider ?

    cannot execute queries while other unbuffered queries are active

    https://cdn.discordapp.com/attachments/295221108901281794/479061019658944513/unknown.png

    <?php
    session_start();
    include "../include/functions.php";
    
    $folderId = $_POST["folder"];
    $totalFolderSize = 0;
    
    $db = connectDb();
    $query = $db->prepare("SELECT target FROM FOLDER WHERE id=:id");
    $query->bindParam(':id', $folderId);
    $query->execute();
    $result = $query->fetch();
    
    $query = $db->prepare("SELECT size FROM FILE WHERE id_folder=:id_folder");
    $query->bindParam(':id_folder', $folderId);
    $query->execute();
    $fileSize = $query->fetchAll();
    foreach ($fileSize as $size) {
      $totalFolderSize = $totalFolderSize + $size["size"];
    }
    
    $query = $db->prepare("SELECT id FROM FOLDER WHERE id_folder=:id_folder");
    $itemsFolderList = [];
    folderList($query, $folderId, $itemsFolderList);
    
    $queryDeleteItem = $db->prepare("DELETE FROM FILE WHERE id_folder=:id_folder; DELETE FROM FILE_SHARE WHERE id_folder=:id_folder; DELETE FROM FOLDER WHERE id_folder=:id_folder; DELETE FROM FOLDER_SHARE WHERE id_folder=:id_folder");
    $queryFileSize = $db->prepare("SELECT size FROM FILE WHERE id_folder=:id_folder");
    
    foreach ($itemsFolderList as $item) {
      $queryFileSize->bindParam(':id_folder', $item["id"]);
      $queryFileSize->execute();
      $fileSize = $queryFileSize->fetchAll();
      $queryFileSize->closeCursor();
      foreach ($fileSize as $size) {
        $totalFolderSize = $totalFolderSize + $size["size"];
      }
      $queryDeleteItem->bindParam(':id_folder', $item["id"]);
      $queryDeleteItem->execute();
    }



    -
    Edité par Lolopy 15 août 2018 à 16:51:41

    • Partager sur Facebook
    • Partager sur Twitter
      16 août 2018 à 13:12:24

      Salut,

      Quand tu mets le MYSQL_ATTR_USE_BUFFERED_QUERY  à false, il faut t'assurer au niveau de tes SELECT d'avoir récupérer tous les résultats avant de passer une requête (SELECT ?) suivante.

      PS: tu as SUM en MYSQL pour faire la somme des colonnes.

      • Partager sur Facebook
      • Partager sur Twitter
      le bienfait n'est jamais perdu
        16 août 2018 à 13:55:42

        Quand tu mets le MYSQL_ATTR_USE_BUFFERED_QUERY  à false

        J'ai rien touché c'est par défaut ?

        Mais je fais fetchall donc il est sensé avoir tout pris ?

        • Partager sur Facebook
        • Partager sur Twitter
          16 août 2018 à 14:05:04

          Montres ta fonction connectDB(), sinon c'est à true par défaut et le plus souvent  quand on le passe à FALSE
          • Partager sur Facebook
          • Partager sur Twitter
          le bienfait n'est jamais perdu
            16 août 2018 à 14:48:31

            function connectDb() {
              try {
                $db = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8", DB_USER, DB_PWD);
                $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              } catch(PDOException $e) {
                die("Erreur de connection: " . $e->getMessage() );
              }
              return $db;
            }
            • Partager sur Facebook
            • Partager sur Twitter
              16 août 2018 à 15:21:01

              OK je viens de voir c'est à cause de ta multi-requête , il faut déplacer le closeCusor après ta ligne 38 dans le foreach
              • Partager sur Facebook
              • Partager sur Twitter
              le bienfait n'est jamais perdu
                16 août 2018 à 15:29:32

                $queryFileSize->closeCursor(); au lieux de mettre a 33 je met a 39
                • Partager sur Facebook
                • Partager sur Twitter
                  16 août 2018 à 15:40:25

                  Utilise plutôt $queryDeleteItem->closeCursor(); après le $queryDeleteItem->execute();
                  • Partager sur Facebook
                  • Partager sur Twitter
                  le bienfait n'est jamais perdu
                    17 août 2018 à 0:22:35

                    WillyKouassi a écrit:

                    OK je viens de voir c'est à cause de ta multi-requête , il faut déplacer le closeCusor après ta ligne 38 dans le foreach


                    Tu serais me dire pourquoi ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 août 2018 à 19:04:11

                      Je voudrais bien savoir aussi
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 août 2018 à 22:41:13

                        Lolopy a écrit:

                        Y a quelqu un ?

                        On dirait pas :(

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 août 2018 à 13:26:28

                          C'est le fonctionnement des requêtes multiples avec  MYSQL  https://dev.mysql.com/doc/refman/8.0/en/c-api-multiple-queries.html , vous pouvez aussi jeter un coup d'oeil à mysqli_multi_query  (je ne dis pas que c'est la même chose mais c'est dans l'esprit)

                          PS: Je n'utilise pas les requêtes multiples qui ne fonctionnent pas avec des vraies requêtes préparées et bon une requête foireuse au milieu de toutes ses requêtes et aucune erreur généré (DELETE FROM foo WHERE bar = 1;DELETE; SELECT;XXXX;) va simplement ignorer le reste des requêtes.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          le bienfait n'est jamais perdu

                          cannot execute queries while other unbuffered

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown