Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction php de requete SQL

Sujet résolu
    24 août 2010 à 22:51:38

    Bonjour,

    Après m'être inspiré des excellents cours de M@téo sur le php/sql j'ai voulu me faire une petite fonction php qui s'occupe d'exécuter la requête SQL pour alléger le code de ma page source.
    Petit problème j'aimerais être propre et clôturer la communication avec la Bdd mais dans ma fonction impossible d'utiliser closeCursor();
    Je dois mal m'y prendre....
    Quelqu'un saurait éclairer ma lanterne??

    Voici la fonction:
    function Fct_Exec_SQL($Nom,$SQL)
      {
        $Rq['Nom']=$Nom;
        $Rq['SQL']=$SQL;
        $Bdd=Fct_Connect_BD();
        $Rq['Exec_SQL']=$Bdd->exec($Rq['SQL']) or $Rq['Erreur']=$Bdd->errorInfo();
        if ($Rq['Exec_SQL']==false)
            {
            print "\n<br>\n<br>";
            print "\n<u>Erreur Requete <b>".$Rq['Nom']."</b>:</u>";
            print "\n<br>";
            print $Rq['Erreur'][2];
            print "\n<br>";
            print "\n<br>";
            print "\n<u>Requete executee:</u>";
            print "\n<br>";
            print "\n<b>".$Rq['SQL']."</b>";
            exit;
            }
        //$Rq['Exec_SQL']->closeCursor();
        return ($Rq);
      }
    


    Voici comment je l'appelle:
    $Rq_ajout_ticket=Fct_Exec_SQL("Rq_ajout_ticket","
                                                      INSERT INTO
                                                         .......
                                                         )
                                                      ");
    



    Merci de m'avoir lu :-)

    Yann.


    PS:Fct_Connect_BD() est une fonction (oui j'adore les fonctions ^^) qui ouvre la connexion avec la Bdd:
    function Fct_Connect_BD()
      {
      try
          {
          $Base='----';
          $Bdd = new PDO("mysql:host=----;dbname=$Base", '----', '-----');
          }
      catch(Exception $Exception)
          {
          die('Erreur de connection Ó la base de donnÚes : '.$Exception->getMessage());
          }
      return ($Bdd);
    
    • Partager sur Facebook
    • Partager sur Twitter
      25 août 2010 à 9:16:46

      Salut,
      Je ne connais pas super bien les objets PDO (j'utilisais plutôt mysql_connect jusqu'à avoir lu les mises à jour du tuto de m@teo).

      Mais je vois ou est ton erreur. La méthode closeCursor doit être effectuée sur un objet de type PDOStatement. Or la méthode exec ne te retourne pas d'objet PDOStatement.

      Pour exécuter cette méthode, tu doit faire une requête préparée à l'aide de la méthode prepare.

      Sur la doc officiel de php.net, ils disent que pour exécuter une requête qui sera lancée qu'une seule fois, il faut plutôt utiliser la méthode query. Et si on souhaite exécuter une requête plusieurs fois, il est préférable d'utiliser la méthode prepare.

      http://ch2.php.net/manual/fr/pdo.exec.php

      J'espère que je ne te noie pas trop d'informations, et que cette réponse t'aidera quand même.
      • Partager sur Facebook
      • Partager sur Twitter
      http://www.kiwi-sarl.ch
        25 août 2010 à 20:35:44

        Merci pour ta réponse Dark Lemon !

        Donc si j'ai bien compris avec "exec" pas besoin de "closecursor"!

        J'utilisais également "mysql_connect" jusqu'à voir le cours de M@téo :-)

        Et pour l'ouverture de la BDD avec
        $Bdd = new PDO("mysql:host=----;dbname=$Base", '----', '-----');
        

        Pas non plus besoin de fermer la connexion?

        Grâce a ton lien je viens de m'apercevoir que je ne pourrai pas utiliser ma fonction pour un SELECT...
        Va falloir adapter tout ça pour que la fonction puisse faire les 2!

        Existe t-il plus simple que ce genre de fonction? Comment procèdes tu?
        (en fait je souhaite limiter le code de la page source, afficher l'erreur éventuelle et la requête associée)

        A+
        Yann


        Edit 22h25:
        Bon après plusieurs heures de recherches et d'essais je ne m'en sort pas avec ce fichu PDO !!! :colere2:
        C'est bien joli de vouloir s'adapter aux dernières nouveautés "top plus mieux" mais c'est pas simple quand même!
        Ce que je souhaiterais:
        - Afficher en clair pourquoi la connexion à la BD a échouée. (exception? ou simple test?)
        - Utiliser indépendamment du type de requête (SELECT, INSERT ...) le fameux PDO "->prepare" parce que c'est plus mieux contre les injections SQL.
        - Afficher en clair pourquoi la requête a échouée. (exception? ou simple test?)
        - Afficher la requête exécutée avec le contenu des variables !
        -> Le tout dans une fonction pour alléger le code de la page source...

        Est-ce possible? Y'a t-il mieux? PDO sait peut-être même faire tout ça très simplement :( !?
        En tout cas moi j'arrête pour ce soir sinon je sent que je vais passer la nuit dessus :lol::lol:
        • Partager sur Facebook
        • Partager sur Twitter
          27 août 2010 à 14:13:19

          Hello,

          Oui effectivement, la méthode exec ne doit pas pouvoir être utilisée avec un select, puisque cette méthode ne retourne qu'un int qui contient le nombre de lignes affectées (update / delete...).

          Pour que tu puisse récupérer ce qu'elle te retourne (toutes les news, tous les messages..), il faut qu'elle te donne un objet contenant toutes les lignes de ta requête. Il faut donc utiliser la méthode query.

          J'ai eu aussi pas mal de peine à me mettre à la technologie PDO. J'ai eu plusieurs fois des erreurs de syntaxe SQL, mais impossible d'avoir des détails sur la nature de mon erreur.
          Pour trouver quels étaient les problèmes, j'ai fais un echo de ma requête, et ensuite un <<copié - collé>> dans PHPMyAdmin, afin de comprendre pourquoi ça ne fonctionnais pas.


          Si quelqu'un peut expliquer comment en clair pourquoi une requête échoué, je suis également prenneur...
          • Partager sur Facebook
          • Partager sur Twitter
          http://www.kiwi-sarl.ch
            28 août 2010 à 23:13:15

            Merci pour tes réponses Dark Lemon



            Pour info, j'ai trouvé comment afficher les erreurs, j'ai créé un nouveau sujet dans la section PHP ICI



            A+
            • Partager sur Facebook
            • Partager sur Twitter

            fonction php de requete SQL

            × 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