Bonjour,
Alors voilà mon problème, je cherche à faire un espace commentaires en PHP/AJAX, sauf que les données rentrent très bien dans ma BDD mais ne s'affichent pas sur mon site, je précise que je suis débutant et que je manque de connaissances, soyez compréhensif merci :)

        <?php
        try
        {
            $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
            $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(Exception $e)
        {
            die('Erreur : '.$e->getMessage());
        }
        $task = "list";

        if(array_key_exists("task", $_GET))
        {
            $task = $_GET['task'];
        }
        if($task == "write")
        {
            postMessage();
        } 
        else 
        {
            getMessages();
        }
        function getMessages()
        {
            global $bdd;
            $req3 = $bdd->prepare('SELECT (poney_com.com) as coms, id_nom FROM poney_com INNER JOIN poney_nom ON poney_com.id_nom = poney_nom.id WHERE poney_nom.id = '.$_GET['id']);
            $req3->execute();
            $messages = $req3->fetchAll();
            echo json_encode($messages);        
            $req3->closeCursor();
        }
        function postMessage()
        {
            global $bdd;          
            if(!array_key_exists('content', $_POST))
            {
                echo json_encode(["status" => "error", "message" => "Un ou plusieurs champs n'ont pas ete envoyes"]);
                return;
            }
            $content = $_POST['content'];
            $id = $_POST['id'];
            $prep = $bdd->prepare('INSERT INTO poney_com (com, id_nom) VALUES (:com, :id_nom)');
            $prep->bindParam(':com', $content);
            $prep->bindParam(':id_nom', $id);
            echo json_encode(["status" => "Commentaire poste"]);
            $prep->closeCursor();
        }
        ?>       
var url = document.getElementById(id).value;

function getMessages()
{
  const requeteAjax = new XMLHttpRequest();
  requeteAjax.open("GET", "commentaires.php" + url);
  requeteAjax.onload = function()
  {
    const resultat = JSON.parse(requeteAjax.responseText);
    const html = resultat.reverse().map(function(message)
    {
      return `
        <div class="messages">
          <span class="content">${messages.content}</span>
        </div>
      `
    }).join('');

    const messages = document.querySelector('.messages');

    messages.innerHTML = html;
    messages.scrollTop = messages.scrollHeight;
  }
  requeteAjax.send();
}
function postMessage(event)
{
  event.preventDefault();
  const content = document.querySelector('#content');
  data.append('content', content.value);
  const requeteAjax = new XMLHttpRequest();
  requeteAjax.open('POST', 'commentaires.php?task=write$id='+ url); 
  requeteAjax.onload = function()
  {
    content.value = '';
    content.focus();
    getMessages();
  }
  requeteAjax.send(data);
}
document.querySelector('form').addEventListener('submit', postMessage);
const interval = window.setInterval(getMessages, 3000);
getMessages();

1 réponse


Hello,

Est-ce que tu a une ou plusieur(s) erreur(s) JS dans la console de ton navigateur ?
Est-ce que tu pourrais poster un exemple de JSon récupéré par la requête ?

Pour ma part, je ferais plutôt le reverse côté serveur puis une boucle for/in sur l'objet Json pour généré le Html à intégrer, voici un bon exemple de mon point de vue.

Sinon, je ne vois pas d'où tu sors ton "${messages.content}" ??

Petite remarque au niveau de la requête SQL, tu utilise prepare(), c'est bien, sauf que là, çà n'a aucun intérêt puisque tu met la valeur de "poney_nom.id" directement dans la requête.