Comment effectuer la requête preparee avec un select et un form

Résolu
flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   -  
flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   -
bonjour a tous

j avoues que j ai très dur avec ces requêtes préparées et pourtant je veux vraiment les comprendre
pourtant je lis pas mal d exemples ,mais dur de trouver un exemple pour chaque cas de figure

j ai bien compris pour l insertion des données
cela se passe ainsi sans la détection des erreurs

  //requete sans le guide des erreurs 
   $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (?, ?, ?)");
$STH->execute($data); 


mais lorsque on a un SELECT et un FROM

comme mon exemple
d après ce que j ai pu comprendre lorsque cela ne demande qu une seule ligne cela peux s effectuer avec query

  $pdo = new PDO('mysql:host=localhost;dbname=u43e', 'u43erle', '2');
$sql = 'SELECT COUNT(*) AS nb FROM commentaire';
$result = $pdo->query($sql);
$columns = $result->fetch();
$nb = $columns['nb'];
echo 'Il y a ' . $nb . ' commentaires(s).
<br/>';
} catch (PDOException $e) {
echo 'Erreur PDO : ' . $e->getMessage();
}
$nRows = $pdo->query('select count(*) from commentaire WHERE valider=\'1\'')->fetchColumn();
echo 'dont ' . $nRows . ' commentaires(s) publies.
<br/>';
$b = $nb - $nRows;
echo 'dont ' . $b . '    commentaires(s) en attendes de publications.
<br/>';

12 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonnour,
    Deux cas de figure : Soit tu utilises les variables "nommées" :
    //préparation de la requête et des variables
     $sql = "INSERT INTO matable (champ1,champ2)   VALUES (:valeur1,:autrevaleur)";
    
     $datas = array(':valeur1'=>$valeur1, ':autrevaleur'=>$valeur);
    
    //Execution de la requete
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    
    

    Soit tu utilises les variables "non" nommées ( c'est à dire les points d'interrogation )
    //préparation de la requête et des variables
     $sql = "INSERT INTO matable (champ1,champ2)   VALUES (?,?)";
    
     $datas = array($valeur1,$valeur);
    
    //Execution de la requete
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    


    Dans les deux cas, il n'y a que DEUX variables qui changent pour faire la requête....
    La variable $sql qui contient la requête SQL ( peu importe que ça soit un INSERT, un SELECT, un UPDATE, un DELETE .. )
    Par exemple :
    $sql = " SELECT *  FROM matable WHERE unchamp=? ";
    

    et la variable $datas qui contient, si il y en a dans ta requête, les variables à transmettre lors de l'exécution de la requête ( dans l'exemple, il y en a )
    donc:
    $datas = [ $unevariable ];
    


    NB: Si tu n'as pas de variables dans ta requêtes, dans ce cas tu peux mettre $datas à null :
    $datas = NULL;
    


    Voila, il ne faut rien toucher d'autre....

    1
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    comme il n'y a aucune variable impliquée dans la requête, et que tu n'exécutes la requête qu'une seule fois, il n'y a pas d'avantage à préparer la requête.

    par contre, je ne pense pas que le fetch() soit optionnel.

    quel est le type du champ
    valider
    ?
    0
  3. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    bonjour yg_be

    merci pour l aide
    j ai vraiment très dur avec des requêtes ...

    car lorsque j insère des donnes dans une table je n exécute la requête qu une seule fois aussi
    en fait il n y a pas de champ valider
    je question la base de donnée pour connaître le nombre de commentaires
    0
  4. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    bonjour jordane
    cela est plus clair a présent
    merci pour ce tuto est cette facilite déconcertante a expliquer les choses

    dans mon exemple comme je n ai pas de variable le code serait le suivant

     $pdo = new PDO('mysql:host=localhost;dbname=u43e', 'u43erle', '2');
    $sql = 'SELECT COUNT(*) AS nb FROM commentaire';
    $datas = NULL;
    
    try{
      $requete = $pdo -> prepare($sql) ;
      $requete->execute($datas) ;
      $result = $pdo->query($sql);
    $columns = $result->fetch();
    $nb = $columns['nb'];
    echo 'Il y a ' . $nb . ' commentaires(s).
    <br/>';
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Mais ... que vient faire la ligne de code
        $result = $pdo->query($sql);

      là dedans... alors que je t'ai dit que RIEN ne devait être modifié dans cette partie du code ???

      A la limite, le fetch et le echo peuvent se trouver dans le try .. mais perso, je te conseille de laisser le code que je t'ai donné tel quel .. et de placer tes autres instructions en dehors ..

      $sql = 'SELECT COUNT(*) AS nb FROM commentaire';
      $datas = NULL;
      
      // ------------------------------ //
      // CETTE PARTIE DU CODE NE CHANGE PAS //
      try{
        $requete = $pdo -> prepare($sql) ;
        $requete->execute($datas) ;
      }catch(Exception $e){
        // en cas d'erreur :
         echo " Erreur ! ".$e->getMessage();
         echo " Les datas : " ;
        print_r($datas);
      }
      // ------------------------------ //
      
      
      $columns =  $requete->fetch();
      $nb = !empty($columns) ? $columns['nb'] : 0;
      echo  "Il y a $nb commentaires(s) <br>";
      




      PS: pour la connexion à la bdd... ne pas oublier d'activer l'affichage des erreurs PDO et de placer son code également dans un TRY/CATCH
      https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    merci pour la correction jordane c est vraiment sympa

    j ai encore besoin de la ligne suivante pour obtenir la variable $result

    $result = $pdo->query($sql);


    concernant la connexion pas de soucis
    c est très bien rentre
    ainsi que la détection des erreurs a mettre au début du code
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       

      j ai encore besoin de la ligne suivante pour obtenir la variable $result

      Non.

      Il faut corriger le fetch par
      $columns =  $requete->fetch();
      
      0
  7. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    ah oui juste merci jordane j étais dans un autre code donc je suis ok avec la correction

    j ai encore une question

    je me retrouve dans mon code avec cet exemple ou je compte les lignes qui ont été validée dans ma base de donnée
    $nRows = $pdo->query('select count(*) from commentaire WHERE valider=\'1\'')->fetchColumn();


    je ne sais pas si je peux faire ainsi pour exécuter ma requête

    //$nRows = $pdo->query('select count(*) from commentaire WHERE valider=\'1\'')->fetchColumn();
    
    $nRows='select count(*) from commentaire WHERE valider=\'1\''->fetchColumn();
    $datas = NULL;
    // ------------------------------ //
    // CETTE PARTIE DU CODE NE CHANGE PAS //
    try{
      $requete = $pdo -> prepare($nRows) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    // ------------------------------ //
    echo 'dont ' . $nRows . ' commentaires(s) publies.
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Le prepare attend une string ...

      La methode fetchcolumn fonctionne comme le fetch ... Tu ne l'as donc pas mis au bonne endroit
      0
  8. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    merci jordane
    pour la correction par contre et c est vrai que cela me semblait bizarre mais le code fonctionnait

    voici la correction
    //$nRows = $pdo->query('select count(*) from commentaire WHERE valider=\'1\'')->fetchColumn();
    
    $sql='select count(*) AS nb from commentaire WHERE valider=\'1\'';
    //j utilise AS nb pour compter le nombre d enregistrement qui sont mis sur valider 1 
    $datas = NULL;
    // ------------------------------ //
    // CETTE PARTIE DU CODE NE CHANGE PAS //
    try{
      $requete = $pdo -> prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    // ------------------------------ //
    //echo 'dont ' . $nRows . ' commentaires(s) publies.
    
    $columns =  $requete->fetch();
    $nb = !empty($columns) ? $columns['nb'] : 0;
    echo  "Il y a $nb commentaires(s) <br>";
    0
  9. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    si cela est ok je vais pouvoir passer tout mon code en pdo et ne pas utiliser les deux codes

    car au début je ne connaissais pas la différence des deux
    0
  10. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    voila je viens enfin de trouver

    $pdo = new PDO('mysql:host=localhost;dbname=id15003105_test', 'root', '');
    
    $sql = 'select valider from commentaire WHERE valider=\'1\'';
    $datas = NULL;
    
    // ------------------------------ //
    // CETTE PARTIE DU CODE NE CHANGE PAS //
    try{
      $requete = $pdo -> prepare($sql) ;
      $requete->execute($datas) ;
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    // ------------------------------ //
    $rows = $requete->fetchAll();
    $num_rows = count($rows);
     echo  "Il y a $num_rows commentaires valider<br>";
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Les deux se valent.
      Par contre tu n'as pas conservé le ternaire que j'avais mis.. c'est dommage..
      0
  11. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    bonjour Jordanne
    merci pour la réponse
    oui je viens de faire des essais et cela fonctionne

    je ne comprends pas cette phrase
    peux tu m expliquer stp

    Par contre tu n'as pas conservé le ternaire que j'avais mis.. c'est dommage..

    parles tu de ceci

    $columns =  $requete->fetch();
    $nb = !empty($columns) ? $columns['nb'] : 0;
    echo  "Il y a $nb commentaires(s) <br>";
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      de ceci
      $nb = !empty($columns) ? $columns['nb'] : 0;
      


      Qui, dans ton nouveau code devient
      $num_rows = !empty($rows) ? count($rows) : 0;
      


      Et si tu ne sais pas ce qu'est un TERNAIRE ... ou .. l'écriture TERNAIRE en programmation ... https://www.google.com/search?q=php+ternaire
      0
  12. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    merci jordane
    je suis allé voir sur le lien et je viens de comprendre merci

    dans les deux codes que j ai poste et que tu as approuve il n y a pas de

    $num_rows = !empty($rows) ? count($rows) : 0;


    dans le premier code je fais ceci

    $nb = !empty($columns) ? $columns['nb'] : 0;


    sauf erreur
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       

      dans le premier code je fais ceci

      Tu n'as pas fait .... tu as juste copier/coller ce que je t'ai donné...

      Et dans le second.. tu n'as pas été en mesure de le remettre en place...
      Là encore, il te suffit de copier/coller ce que j'ai fait.
      Ce qui me rassure.. c'est que désormais tu as compris....7
      Tu sauras donc l'appliquer dans tous tes codes à l'avenir ... y compris dans la récupération "propre" des variables avant de les utiliser... tel que je te l'explique depuis plusieurs mois.
      Pour rappel :
      https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
      0
  13. flexi2202 Messages postés 3640 Date d'inscription   Statut Membre Dernière intervention   190
     
    merci pour le lien jordane
    oui en effet j ai compris le principe enfin ...
    y aura fallu du temps et de la patience de ta part

    mais cela rentre cette fois

    ma prochaine étape est de remplacer mon code mysqli en PDO
    0