Affichage date dans un tchat

Résolu
sunev -  
jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Dans la page d’un tchat qui devrait s’afficher avec la date des post
Il m’est renvoyé cette erreur :

Fatal error: Call to a member function fetch() on a non-object in C:\EasyPHP-12.1\www\01_esais\mini_tchat.php on line 222 -
--- -> qui est: while($msg = $allmsg->fetch()){

Je n’arrive pas a trouver cette erreur, si qu’elqu’un a une idée, merci de vos suggestions .

Le post

try{
$bdd = new PDO('mysql:host=127.0.0.1;dbname=chatmini;charset=utf-8','root', '');
}catch (Exception $e){
die('Erreur : ' . $e->getMessage());
}
if (isset($_POST['pseudo']) AND isset($_POST['message']) AND !empty($_POST['pseudo']) AND !empty($_POST['message'])) {
$pseudo = htmlspecialchars($_POST['pseudo']);
$message = htmlspecialchars($_POST['message']);
$insertmsg = $bdd->prepare('INSERT INTO chat (pseudo, message, date_creation) VALUES(?, ?, NOW())');
$insertmsg->execute(array($pseudo,$message));



L’affichage

<div id="messages" class="vert">
<?php
$allmsg = $bdd->query('SELECT pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y a %Hh%i\')
AS date_creation FROM chat ORDER BY ID DESC LIMIT 0, 10');
while($msg = $allmsg->fetch()){
?>
<p>< <b><?php echo $msg['date_creation']; ?> : </b>
b><?php echo $msg['pseudo']; ?> : </b>
<?php echo $msg['message']; ?> <hr><br/></p>
<?php
}
?>
</div>


14 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    1 - Ta question concerne le PHP ... alors pourquoi la poster dans le forum JAVASCRIPT ?? ( je la déplace au bon endroit ! )

    2- Lorsque tu postes du code.. merci d'indiquer, dans les balises de code, le langage ... histoire d'avoir la coloration syntaxique.
    Explications disponibles ici: https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

    3 - Pour voir les éventuelles erreurs PDO .. tu dois ACTIVER l'affichage des erreurs PDO : voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

    4 - Ton message d'erreur semble indiquer que ta requête contient une erreur ou ne retourne aucun résultat ou que la connexion à la bdd n'a pas été faite

    5 - Au lieu d'utiliser le "query" il est préférable d'utiliser les requêtes préparées... même pour du SELECT ...

    Déjà on commence par placer le code de connexion à la bdd dans un fichier
    à part qu'on aura qu'à inclure dans nos différentes pages.
    AU passage... on y active la gestion des erreurs PDO (voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs )
      <?php
      //Fichier : cnxbdd.php
      // connexion à la bdd
      try{
        $bdd =new PDO('mysql:host=localhost;dbname=chatmini; charset=utf8', 'root', '');
        // Activation des erreurs PDO
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
        $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      } catch(PDOException $e) {
        die('Erreur : ' . $e->getMessage());
      }
    
      ?>
     
     


    Ensuite.. on place le MAXIMUM de code PHP .. AVANT le html.
    .. et on n'utilise pas les fonctions comme htmlspecialchar pour l'insertion en bdd .. uniquement pour l'affichage !

    <?php
    //-----------------------------------------------------------//
    //Affichage des erreurs
    //-----------------------------------------------------------//
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //-----------------------------------------------------------//
    //connexion à la bdd
    //-----------------------------------------------------------//
    require_once "cnxbdd.php";
    
    //-----------------------------------------------------------//
    //traitement du submit
    //-----------------------------------------------------------//
    
      //récupération PROPRE des variables AVANT de les utiliser :
      $message = !empty($_POST['message']) ? $_POST['message'] : NULL;
      $pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
      
      //Insertion en bdd si non vide
      if ($pseudo && $message) {
        $sql = "INSERT INTO chat (pseudo, message, date_creation) VALUES(?, ?, NOW())";
        $datas = array($pseudo,$message);
        try{
          $prep = $bdd->prepare($sql);
          $prep->execute($datas);
        }catch(Exception $e){
          echo " Erreur : ".$e->getMessage();
        }    
      }
    
     
     
    //-----------------------------------------------------------//
    //Liste des messages
    //-----------------------------------------------------------//
      $sql = "SELECT pseudo, 
                     message, 
                     DATE_FORMAT(date_creation, \'%d/%m/%Y a %Hh%i\') AS date_creation 
              FROM chat 
              ORDER BY ID DESC LIMIT 0, 10'";
    
      try{
        $prep = $bdd->prepare($sql);
        $prep->execute();
        $allmsg = $prep->fetchAll(); // on stocke les résultats dans un array
      }catch(Exception $e){
        echo " Erreur : ".$e->getMessage();
      }
    
    
     
    ?>
    
    <!-- Et ensuite...le reste de ton code html -->
    <!-- ...  -->
    
    <div id="messages" class="vert">
    <?php
     if(!empty($allmsg)){
      foreach($allmsg as $smg){
        echo "<p>
              <b>". $msg['date_creation'].": </b> 
              <b>".htmlspecialchars($msg['pseudo'])." : </b> 
              ".htmlspecialchars($msg['message'])."<hr><br/>
             </p> "; 
      }
    } 
    ?>
    </div>
    


    Cordialement, 
    Jordane                                                                 
    0
  2. sunev
     
    salut jordane45 et merci de ta réponse

    j'ai mis le code que tu m'a envoyé et il me renvoie l'erreur suivante:

    Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr�s de '\'%d/%m/%Y a %Hh%i\') AS date_creation FROM chat ORDER ' � la ligne 3

    sur la ligne:

    $sql = "SELECT pseudo,
    message,
    DATE_FORMAT(date_creation, \'%d/%m/%Y a %Hh%i\') AS date_creation
    FROM chat
    ORDER BY ID DESC LIMIT 0, 10'";


    juste aprés 10 il y aurait un ' de trop, mais c'est pareil en l'enlevant, j'ai essayé d'autres rajout de ' et de () mais ça renvoie toujours la méme erreur
    0
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Bonjour,

      Il n'est pas nécessaire d'échapper les ' à l'intérieur des "
      Essaie ça :
      $sql = "SELECT pseudo, 
                       message, 
                       DATE_FORMAT(date_creation, '%d/%m/%Y à %Hh%i')  AS date_creation 
                FROM chat 
                ORDER BY ID DESC LIMIT 0, 10";

      Xavier
      0
  3. sunev
     
    Merci Reivax962

    Mais avec ton code une nouvelle erreur qui s'affiche, le casse tête chinois continue

    Erreur : SQLSTATE[42S22]: Column not found: 1054 Champ 'date_creation' inconnu dans field list

    j'ai simplifié le code du mini tchat au plus simple: 2 pages (3 avec la bdd)

    Page d’ouverture:
    essaitchat.php
    <?php
    //connection a la BDD
     include("mini_tchat_inc_connect_bdd.php"); 
    ?>
    <!DOCTYPE html>
    <html><head>
    <title>TChat</title>  <meta charset="utf-8">
    	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    </head><body>
    <?php
    //-----------------------------------------------------------//
    //traitement du submit
    //-----------------------------------------------------------//
    //récupération PROPRE des variables AVANT de les utiliser :
      $message = !empty($_POST['message']) ? $_POST['message'] : NULL;
      $pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
     //Insertion en bdd si non vide
      if ($pseudo && $message) {
        $sql = "INSERT INTO chat (pseudo, message, date_creation) VALUES(?, ?, NOW())";
        $datas = array($pseudo,$message);
        try{
          $prep = $bdd->prepare($sql);
          $prep->execute($datas);
        }catch(Exception $e){
          echo " Erreur : ".$e->getMessage();
        }    
      }
    //-----------------------------------------------------------//
    //Liste des messages
    //-----------------------------------------------------------//
     $sql = "SELECT pseudo, message, DATE_FORMAT(date_creation, '%d/%m/%Y à %Hh%i')  AS date_creation FROM chat  ORDER BY ID DESC LIMIT 0, 10";
      try{
        $prep = $bdd->prepare($sql);
        $prep->execute();
        $allmsg = $prep->fetchAll(); // on stocke les résultats dans un array
      }catch(Exception $e){
        echo " Erreur : ".$e->getMessage();
      }
    ?>
    <!-- Et ensuite...le reste de ton code html -->
       <form name="" method="post">
           <p><input class="text" type="text" placeholder="PSEUDO" name="pseudo" value="<?php
           if (isset($pseudo)) { echo $pseudo; } ?>" /></p>
          <p><textarea type="text"  name="message"></textarea></p>
    	   <p><input type="submit"  value="Envoyer"></p>
    </form>
    
    //affichage des messages
    <div id="messages">
    <?php
     if(!empty($allmsg)){
      foreach($allmsg as $smg){
        echo "<p>
              <b>". $msg['date_creation'].": </b> 
              <b>".htmlspecialchars($msg['pseudo'])." : </b> 
              ".htmlspecialchars($msg['message'])."<hr><br/>
             </p> "; 
      }
    } 
    ?>
    </div>
    <script>
    setInterval('load_messages()', 2000);
    function load_messages(){
    $('#messages').load('essai_mini_tchat_load_messages.php');
    }
    </script>
    </body></html>
    


    Page de réactualisation:
    essai_mini_tchat_load_messages.php
    //connection a la BDD
     include("mini_tchat_inc_connect_bdd.php"); 
    //-----------------------------------------------------------//
    //Liste des messages
    //-----------------------------------------------------------//
     $sql = "SELECT pseudo, message, DATE_FORMAT(date_creation, '%d/%m/%Y à %Hh%i')  AS date_creation FROM chat 
              ORDER BY ID DESC LIMIT 0, 10";
      try{
        $prep = $bdd->prepare($sql);
        $prep->execute();
        $allmsg = $prep->fetchAll(); // on stocke les résultats dans un array
      }catch(Exception $e){
        echo " Erreur : ".$e->getMessage();
      }
    ?>
    
    <div id="messages">
    <?php
     if(!empty($allmsg)){
      foreach($allmsg as $smg){
        echo "<p>
              <b>". $msg['date_creation'].": </b> 
              <b>".htmlspecialchars($msg['pseudo'])." : </b> 
              ".htmlspecialchars($msg['message'])."<hr><br/>
             </p> "; 
      }
    } 
    ?>
    </div>
    


    Mon premier minitchat fonctionné trés bien avec la date mais l'actualisation ne fonctionnée pas,
    j'ai donc utilisé jquery pour l'actualisation qui a fonctionné avec
    mais la date elle ne fonctionné plus?
    Si on enleve la date et son affichage ce code marche trés bien et le minitchat fonctionne avec son actualisation automatique.
    On peut voir ça sur
    http://siteartpeinture.free.fr/mini_tchat.php
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Le message d'erreur est on ne peut plus clair ....
      Erreur : SQLSTATE[42S22]: Column not found: 1054 Champ 'date_creation' inconnu dans field list 

      Visiblement : Champ 'date_creation' inconnu ... cela signifie que dans ta table ... aucun champ ne porte le nom de : date_creation (attention aux majuscules/minuscules !!! )
      0
  4. sunev
     
    LE COPIER COLLER de la table chat de la BDD chatmini
    ( je sais il manque un T devant chat)

    4 date_creation datetime
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sunev
     
    donc pas de probleme de ce côté là
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Tu pourrais nous faire un DUMP (structure + quelques données) de ta BDD ?

      De plus .. dans ta requête .. tu as mis un ALIAS portant le même nom que le champ
      SELECT pseudo, message, DATE_FORMAT(date_creation, '%d/%m/%Y à %Hh%i')  AS date_creation FROM chat 
      ORDER BY ID DESC LIMIT 0, 10
      

      Evite !
      Essaye :
      SELECT pseudo, message, DATE_FORMAT(date_creation, '%d/%m/%Y à %Hh%i')  AS DATECREATION 
      FROM chat 
      ORDER BY ID DESC LIMIT 0, 10";
      
      0
  7. sunev
     
    la srtucture de la table;
    1 id int(11) Non Aucune AUTO_INCREMENT
    2 pseudo varchar(25) latin1_swedish_ci NonAucune
    3 message text latin1_swedish_ci Non Aucune
    4 date_creation datetime Non Aucune

    fichier: mini_tchat_inc_connect_bdd.php
    <?php
    //Affichage des erreurs
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    //connexion à la bdd
     try{
        $bdd =new PDO('mysql:host=localhost;dbname=chatmini; charset=utf8', 'root', '');
        // Activation des erreurs PDO
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
        $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      } catch(PDOException $e) {
        die('Erreur : ' . $e->getMessage());
      }
     ?>
    0
  8. sunev
     
    dans le champ 1 il n'est pas en PRIMARY
    je le met peut être que ça vient de là
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Non.
      Mais as tu modifié la requête comme je te l'ai dit ??
      0
  9. sunev
     
    j'ai changé date_creation pour creation
    j'ai mis le champ id en Primary

    les nouvelles erreurs qui s'affichent:

    Notice: Undefined variable: msg in C:\EasyPHP-12.1\www\01_esais\essai_mini_tchat_load_messages.php on line 24

    Notice: Undefined variable: msg in C:\EasyPHP-12.1\www\01_esais\essai_mini_tchat_load_messages.php on line 25

    Notice: Undefined variable: msg in C:\EasyPHP-12.1\www\01_esais\essai_mini_tchat_load_messages.php on line 26
    0
  10. sunev
     
    oui pour la requête

    SELECT pseudo, message, DATE_FORMAT(date_creation, '%d/%m/%Y à %Hh%i') AS DATECREATION
    FROM chat
    ORDER BY ID DESC LIMIT 0, 10";

    a la place de DATECREATION j'ai mis creation au lieu de date_creation, et et mis mon champ id en PRIMARY maintenant j' ai ces nouvelles erreurs/

    Notice: Undefined variable: msg in C:\EasyPHP-12.1\www\01_esais\essai_mini_tchat_load_messages.php on line 24

    Notice: Undefined variable: msg in C:\EasyPHP-12.1\www\01_esais\essai_mini_tchat_load_messages.php on line 25

    Notice: Undefined variable: msg in C:\EasyPHP-12.1\www\01_esais\essai_mini_tchat_load_messages.php on line 26
    0
  11. sunev
     
    if(!empty($allmsg)){
    foreach($allmsg as $smg){
    echo "<p>
    24 <b>". $msg['creation'].": </b>
    25 <b>".htmlspecialchars($msg['pseudo'])." : </b>
    26 ".htmlspecialchars($msg['message'])."<hr><br/>
    </p> ";
    0
  12. sunev
     
    L'erreur
    Erreur : SQLSTATE[42S22]: Column not found: 1054 Champ 'date_creation' inconnu dans field list
    venait bien de la requête avec date_creation puisque en changeant avec
    creation ça fonctionne, mais maintenant les messages ne veulent plus s'afficher, la variable $msg n'est pas reconnue et affiche les erreurs :

    Notice: Undefined variable: msg in C:\EasyPHP-12.1\www\01_esais\essai_mini_tchat_load_messages.php on line 24 25 26
    pour le code
    21        if(!empty($allmsg)){
    22        foreach($allmsg as $smg){
    23       echo "<p>
    24     <b>". $msg['creation'].": </b>
    25     <b>".htmlspecialchars($msg['pseudo'])." : </b><br/>
    26 "   .htmlspecialchars($msg['message'])."
             </p> ";
    


    pourtant dans: foreach($allmsg as $smg) elle devrait être prise en compte?
    0
  13. sunev
     
    ça y est les mecs
    ça marche avec:
    if(!empty($allmsg)){
      foreach($allmsg as$donnees){
      echo 
      '<P> '
      . $donnees['DATECREATION']. ':<strong> ' 
      . htmlspecialchars($donnees['pseudo']) .'</strong> : '
      . htmlspecialchars($donnees['message']) 
      . '</p>';
    }
    }
    ?>


    il ne reste plus qu'à habiller le code avec du css
    Merci a toi jordane45 et à Reivax962 de votre aide, je vais mettre le code en entier pour ceux que ça interresse.
    0
  14. sunev
     
    3 fichiers:
    la connection a la bdd:
    mini_tchat_inc_connect_bdd.php
    <?php
    //Affichage des erreurs
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    //connexion à la bdd
     try{
        $bdd =new PDO('mysql:host=localhost;dbname=chatmini; charset=utf8', 'root', '');
        // Activation des erreurs PDO
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
        $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      } catch(PDOException $e) {
        die('Erreur : ' . $e->getMessage());
      }
     ?>


    la page principale que l'on peut renommée en index.php ou autre:

    essaitchat.php

    <?php
    //connection a la BDD
     include("mini_tchat_inc_connect_bdd.php"); 
    ?>
    <!DOCTYPE html>
    <html><head>
    <title>TChat</title>  <meta charset="utf-8">
    	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    </head><body>
    <?php
    //-----------------------------------------------------------//
    //traitement du submit
    //-----------------------------------------------------------//
    //récupération PROPRE des variables AVANT de les utiliser :
      $message = !empty($_POST['message']) ? $_POST['message'] : NULL;
      $pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] : NULL;
     //Insertion en bdd si non vide
      if ($pseudo && $message) {
        $sql = "INSERT INTO chat ( pseudo, message, creation) VALUES(?, ?, NOW())";
        $datas = array($pseudo,$message);
        try{
          $prep = $bdd->prepare($sql);
          $prep->execute($datas);
        }catch(Exception $e){
          echo " Erreur : ".$e->getMessage();
        }    
      }
    //-----------------------------------------------------------//
    //Liste des messages
    //-----------------------------------------------------------//
     $sql = "SELECT pseudo, message, DATE_FORMAT(creation, '%d/%m/%Y à %Hh%i')  AS DATECREATION 
    FROM chat 
    ORDER BY ID DESC LIMIT 0, 10";
      try{
        $prep = $bdd->prepare($sql);
        $prep->execute();
        $allmsg = $prep->fetchAll(); // on stocke les résultats dans un array
      }catch(Exception $e){
        echo " Erreur : ".$e->getMessage();
      }
    ?>
    <!-- Et ensuite...le reste du code html -->
       <form name="" method="post">
           <p><input class="text" type="text" placeholder="PSEUDO" name="pseudo" value="<?php
           if (isset($pseudo)) { echo $pseudo; } ?>" /></p>
          <p><textarea type="text"  name="message"></textarea></p>
    	   <p><input type="submit"  value="Envoyer"></p>
    </form>
    
    <div id="messages">
    <?php
     if(!empty($allmsg)){
      foreach($allmsg as$donnees){
      echo 
      '<P> '
      . $donnees['DATECREATION']. ':<strong> ' 
      . htmlspecialchars($donnees['pseudo']) .'</strong> : '
      . htmlspecialchars($donnees['message']) 
      . '</p>';
    }
    }
    ?>
    
    </div>
    
    <script>
    setInterval('load_messages()', 2000);
    function load_messages(){
         $('#messages').load('essai_mini_tchat_load_messages.php');
    }
    </script>
    
    </body>
    </html>


    La page d'actualisation automatique:

    essai_mini_tchat_load_messages.php

    
    <?php
    //connection a la BDD
     include("mini_tchat_inc_connect_bdd.php"); 
    //-----------------------------------------------------------//
    //Liste des messages
    //-----------------------------------------------------------//
    
     $sql = "SELECT pseudo, message, DATE_FORMAT(creation, '%d/%m/%Y à %Hh%i')  AS DATECREATION 
    FROM chat 
    ORDER BY ID DESC LIMIT 0, 10";
    //"SELECT  pseudo, message, DATE_FORMAT(creation, '%d/%m/%Y à %Hh%i')  AS creation FROM chat 
              //ORDER BY ID DESC LIMIT 0, 10";
      try{
        $prep = $bdd->prepare($sql);
        $prep->execute();
        $allmsg = $prep->fetchAll(); // on stocke les résultats dans un array
      }catch(Exception $e){
        echo " Erreur : ".$e->getMessage();
      }
    ?>
    
    <div id="messages">
    <?php
    
    if(!empty($allmsg)){
      foreach($allmsg as$donnees){
      echo 
      '<P> '
      . $donnees['DATECREATION']. ':<strong> ' 
      . htmlspecialchars($donnees['pseudo']) .'</strong> : '
      . htmlspecialchars($donnees['message']) 
      . '</p>';
    }
    }
    ?>
    </div>


    Il ne reste plus qu'à habiller tout ça avec du css.
    0
  15. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Tu penseras à mettre le sujet en RÉSOLU.
    Pour le css... on te laisse faire.
    0