récupérer le contenu d'une base de données avec PDO

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] récupérer le contenu d'une base de données avec PDO

    Bonjour,
    Comment récupérer les objets de ma base de données.
    Sur mon site précédent j’utilisais "mysqli" qui n’est plus compatible avec PHP 8.
    J’ai donc opté pour la méthode procédurale avec "PDO". Mon problème est qu’avec PDO, je patine et je progresse très lentement. J’ai beaucoup de mal à trouver dans la documentation les informations dont j’ai besoin.
    Avec PDO, j’ouvre ma base, j’arrive à lire l’article que je désire, j’obtiens bien à l’écran, le contenu de chaque colonne par la boucle "foreach". Mais je n’arrivais pas à trouver la méthode PDO pour extraire le contenu de chaque colonne comme je le faisais avec les instructions suivantes sous "mysqli" :
    $result= $db->query($requete);
    $nbart = $result->rowCount();;

    if ( $nbart == 0) {
    $OnDoitCreer =1;
    }
    else {

    $ligne = $result->fetch_object();
    $feuille = $ligne->vsd_page;
    $datedernlectur = $ligne->vsd_d_date;
    $occurence =$ligne->vsd_occurences;
    $action =$ligne->vsd_objet;

    C’est la section en rouge "$ligne = $result->fetch_object();" que je n’arrive pas à transposer sous mode PDO.

    Comme je le disais en absence de documentation complète, c'est fastidieux et lent? J'ai fini par trouver c'est :
    "$ligne = $result->fetchObject();"​ avec PDO.

    Du coup se sont les instructions suivantes qui plantent :
    $feuille = $ligne->vsd_page;
    $datedernlectur = $ligne->vsd_d_date;
    $occurence =$ligne->vsd_occurences;
    ​ en fatal error.

    Bien cordialement.
    Dernière édition par SousLeSoleil à 12/11/2023, 20h06

  • #2
    Bonjour,

    Je ne comprends pas. MySQLi fonctionne toujours, sauf bien sûr si ça a été désactivé dans les paramètres PHP.

    Sinon, j'utilise par exemple dans le plugin LazyDbBackup version PDO fetch>All() ou
    Code:
    $stmt = $this->handler->query('SELECT * FROM '.$tableName);
     $q = $stmt->fetchAll(PDO::FETCH_ASSOC);
    ​
    Dernière édition par RobertG à 13/11/2023, 08h35
    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

    Commentaire


    • #3
      Bonjour RoberG et merci de ta réponse.
      Je précise le code que j'ai écris , cela sera plus clair pour la compréhension de la difficulté devant la quelle je me trouve :
      Code:
      [FONT="Calibri"]                if ($userIP = "127.0.0.1"){[/FONT]
      [FONT="Calibri"]                               $db = connexSQL("Data_Base","mylocalparam");[/FONT]
      [FONT="Calibri"]                               }[/FONT]
      [FONT="Calibri"]                else {[/FONT]
      [FONT="Calibri"]                               $db = connexSQL(Data_Base ","myparam");[/FONT]
      [FONT="Calibri"]                               }[/FONT]
      [FONT="Calibri"]                if (!$db){[/FONT]
      [FONT="Calibri"]                               echo " base non ouverte<br>";[/FONT]
      [FONT="Calibri"]                               }[/FONT]
      [FONT="Calibri"]                else {[/FONT]
      [FONT="Calibri"]                                $requete="SELECT vsd_id, vsd_page, vsd_objet, vsd_p_date, vsd_d_date, vsd_action, vsd_occurences[/FONT]
      [FONT="Calibri"]                                                FROM vsd_consultations WHERE vsd_page= '$code' ";[/FONT]
      [FONT="Calibri"]                               $result= $db->query($requete);[/FONT]
      [FONT="Calibri"]                               if ( !$result) { [/FONT]
      [FONT="Calibri"]                                               $mes_erreur =  $db->errorInbfo();[/FONT]
      [FONT="Calibri"]                                               echo "la lecture a échouée, code" . $db->errorCode().$mes_erreur[2] . "<br>";[/FONT]
      [FONT="Calibri"]                                               return FALSE;[/FONT]
      [FONT="Calibri"]                                               }[/FONT]
      [FONT="Calibri"]                               else {[/FONT]
      [FONT="Calibri"]                                               $OnDoitCreer = 0;[/FONT]
      [FONT="Calibri"]                                               $nbart = $result->rowCount();;[/FONT]
      [FONT="Calibri"]                                               if ( $nbart == 0) { // si $nbart = 0 il faut créer l'article[/FONT]
      [FONT="Calibri"]                                                               $OnDoitCreer =1;                                                          [/FONT]
      [FONT="Calibri"]                                                               }[/FONT]
      [FONT="Calibri"]                                               else {[/FONT]
      [FONT="Calibri"]                                                               $titres= $result->fetch(PDO::FETCH_NUM);[/FONT]
      [FONT="Calibri"]                                                               foreach($titres as $colonne) {  // cette boucle n’est que pour vérifier que le bon article de la base est bien lu. Ce qui est le cas[/FONT]
      [FONT="Calibri"]                                                               echo "Vérification =  " . $colonne . "&nbsp;<br>";[/FONT]
      [FONT="Calibri"]                                                               }             [/FONT]
      [FONT="Calibri"]                                               $ligne = $result->fetchObject();[/FONT]
      [FONT="Calibri"]// Jusqu’ici tout marche bien. C’est à partir de la prochaine ligne que j’ai "fatal error"[/FONT]
      [FONT="Calibri"]                                              [COLOR=#e74c3c] $feuille = $ligne->vsd_page;[/COLOR][/FONT]
      [FONT="Calibri"]                                               $datedernlectur = $ligne->vsd_d_date;[/FONT]
      [FONT="Calibri"]                                               $occurence =$ligne->vsd_occurences;[/FONT]
      [FONT="Calibri"]                                               $action =$ligne->vsd_objet;[/FONT]
      ​
      Quelle erreur ai-je commise ?
      Bien cordialement.

      Commentaire


      • #4
        Bonjour,
        Comme Robert, je ne comprends pas pourquoi vous passez par PDO, mais ce n'est pas la question.
        Sauf erreur de ma part, juste avant votre erreur, vous faites un fetch, ce qui "bouge" le curseur, donc, je pense que votre 2eme fetch (le fecthObject) n'est plus au bon endroit.
        Essayez de mettre votre 1er fetch (avec sa boucle) en commentaire pour voir.
        D'autre part, pour voir plus clair (qui était l'objectif initial de votre message), merci de supprimer les FONT.
        Pascal
        If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

        Commentaire


        • #5
          Bonjour RoberG et pmleconte ;
          suivant vos conseils j'ai neutralisé la boucle "foreach", le code est devenu ce qui suit :

          ......$db = connexSQL("data_base","mylocalparam");
          ......if (!$db){
          ............return FALSE ;
          ............}
          ......$requete="SELECT vsd_id, vsd_page, vsd_objet, vsd_p_date, vsd_d_date, vsd_action, vsd_occurences FROM vsd_consultations WHERE vsd_page= '$code' ";
          ......$result= $db->query($requete);
          ......if ( !$result) { // ce test ne marche pas
          ............$mes_erreur = $db->errorInfo();
          ............return FALSE;
          ............}
          ......$OnDoitCreer = 0;
          ......$nbart = $result->rowCount();;
          ......if ( $nbart == 0) {
          ............$OnDoitCreer =1;
          ............}
          ......else {
          ............$ligne= $result->fetch(PDO::FETCH_NUM);
          /*......Cette boucle mise en comment, m’a permis de constaté que j’obtiens bien l’enregistrement voulu.
          foreach($titres as $colonne) {
          echo "line 1210" . $colonne . "&nbsp;<br>";
          }
          ............}
          */
          //..................$result->data_seek(0); cette instruction semble ne fonctionner pas. Neutralisée
          ............$ligne = $result->fetchObject();
          ............$feuille = $ligne->vsd_page;
          ............$datedernlectur = $ligne->vsd_d_date;
          ............$occurence =$ligne->vsd_occurences;
          ............$occurence =$ligne->vsd_occurences;

          ( ! )( ! ) Warning: Attempt to read property "vsd_page" on bool in D:\wamp64\www\www-V6\trains\trains.inc.php on line 1331
          :
          Les variables $feuille, $datedernlectur, $occurence, $occurence ne sont pas chargées.
          je ne sais pas ce que donne la méthode "fetchObject()
          ​" en absence d'une documentation explicite de moteur PDO.
          j'ai aussi supprimé la ligne .$ligne = $result->fetchObject();
          Le résultat est le même.

          Quels objets sont obtenus par $result->
          ​​fetch(PDO::FETCH_NUM) ou $result->fetchObject()​ ?

          Commentaire


          • #6
            Bonjour,
            Je conseillais de supprimer le 1er fetch et non le fetchObject.
            Pascal
            If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

            Commentaire


            • #7
              Bonjour Pascal,

              J’ai réglé le problème avec les outils que je domine.

              Je verrai plus tard à fait des essais avec les protocoles de PDO. Je vais progresser dans la transposition de mes programmes.
              Ce que j’ai fait, n’est pas très joli, mais cela marche, ce qui est important pour moi.
              :
              ..........$titres = $result->fetch(PDO::FETCH_NUM);

              ..........$i = 0;
              ..........foreach($titres as $colonne) {

              ...............switch ($i) {
              ....................case 0:
              .........................$id = $colonne;
              .........................break;

              ....................case 1:
              .........................$feuille = $colonne;
              .........................break;

              ....................case 2:
              .........................$objet = $colonne;
              .........................break;

              ....................case 3:
              .........................$datedernlectur = $colonne;
              .........................$p_date = $colonne;
              .........................break;

              ....................case 4:
              .........................$p_date = $colonne;
              .........................break;

              ....................case 5:
              .........................$action = $colonne;
              .........................break;

              ....................case 6:
              .........................$occurence = $colonne;
              .........................break;

              ....................default ;
              ...............}
              ...............$i = $i + 1;
              ...............if ($i > 6) {
              ....................break;
              ....................}
              ...............}

              ..........}

              J’obtiens le résultat escompté. C’est le principal.
              Merci et bien cordialement.

              Commentaire

              Annonce

              Réduire
              Aucune annonce pour le moment.

              Partenaire de l'association

              Réduire

              Hébergeur Web PlanetHoster
              Travaille ...
              X