Bonjour,
Je rencontre un problème avec l'utilisation de AJAX,
J'ai créer une fonction permetant de récupérer du texte dans ma base de données mais lorsque je l'execute je reçoit une erreur :

Erreur d’analyse XML : mal formé
Emplacement : http://localhost/includes/modif_initialisation.php?id=26
Numéro de ligne 1, Colonne 12 :

Oui je sais, mais je n'ai rien oublié il n'y a rien après le ( Colonne 12 : ) mais voilà mon problème.
Ce problème engendre aussi d'autre problème comme le fait de ne pas afficher le text dans le textarea dans mon fichier php :

<!-- Version TXT -->
    <div id="form_pub_txt" style="display:none;">
    <form method="POST" class="form_pub_text" enctype="multipart/form-data">
        <textarea name="content_publication" placeholder="Qu'avez-vous à raconter" class="text_area_txt" id="textareatext"></textarea><br>
        <input onclick="" id="submit" name="" value="Publier" class="submit_txt" style="cursor: pointer; margin-top: 25px;">
    </form>
    </div>

voici mon code pour récup le text dans la base de donnée :

<?php
include 'database.php';
        global $db;
if(isset($_GET['id']) AND !empty($_GET['id'])){
    if($_GET['id'] >= 1){
        $edit_id = htmlspecialchars($_GET['id']);
        $edit_publication = $db->prepare('SELECT * FROM publications WHERE id = :id');
        $edit_publication->execute([
        'id' => $edit_id
        ]);
            if($edit_publication->rowCount() ==1) {
            $edit_publication = $edit_publication->fetch();
            }
        else{
            die('Erreur ça n\'existe pas');
        }   
    }
}
?><?=htmlspecialchars_decode($edit_publication['content'])?>

Et mon JS pour la focntion avec AJAX :

function modif_art(id)
{
    var httpRequest = getHttpRequest()
     httpRequest.onreadystatechange = function () {
          var a = httpRequest
          if (httpRequest.readyState === 2){
               debugger
               hide_edit_panel_reverse();
               // affiche un truc de chargement
          }
          if (httpRequest.readyState === 4){
               debugger
               document.getElementById('content_text_area').innerHTML = httpRequest.responseText;
               // retirer le truc de chargement
               debugger
               document.getElementById('form_pub_txt').style.display = 'block';
               debugger
               document.getElementById('submit').onclick = function(){modif_proce_art(id);};
          }  
     }
     httpRequest.open('GET', 'includes/modif_initialisation.php?id=' + id, true)
     httpRequest.send()

Voilà si quelqu'un sait d'où vient le problème je le remercie d'avance
Merci d'avoir tout lu :)

3 réponses


Bonjour.
Pour commencer, le mot clé global ne s'utilise qu'à l'intérieur d'une fonction afin de pouvoir accéder à des variables qui n'existent qu'à l'extérieur de celle-ci, sauf que toi tu l'utilises sans même être dans une fonction.
Ensuite, inutile d'utiliser les fonctions isset et empty à la suite l'une de l'autre :

empty — Détermine si une variable est vide
Une variable est considérée comme vide si elle n'existe pas, ou si sa valeur équivaut à false. La fonction empty() ne génère pas d'alerte si la variable n'existe pas.

Par conséquent, tu peux largement remplacer la condition par:

if (!empty($_GET['id']) && $_GET['id'] >= 1) {
// ...

Au passage, inutile de fermer la balise php si c'est pour la rouvrir juste après.
Pour terminer, tu ne dois pas utiliser une variable ($edit_publication), en dehors du code dans laquelle elle peut être définie, tu devrais donc plutôt l'utiliser uniquement dans la condition dans laquelle tu utilise la méthode fetch.
Sans oublier que si ton code PHP peut être solicité via une requête ajax, tu devrais plutôt renvoyer un en-tête d'erreur au lieu de faire un die, car côté ajax tu ne pourras pas faire la différence entre un déroulement correct ou non.

Edit: Pour rappel, la méthode rowCount ne doit pas être utilisé pour une requête de type SELECT.
J'oubliais, d'où tu sors un élément HTML qui aurait comme id content_text_area ?
Il n'y en a aucun dans le formulaire que tu présentes.

Merci beaucoup, piero5679 !

J'ai testé est ça marche enfin !

Mais j'ai toujours des erreurs dans ma console :

Mais je pense savoir d'où vient le problème des 2 erreurs, la 2 ème erreur est surement dû à l'utilisation de :

httpRequest.responseText;

sachant que j'utilise :

httpRequest.responseType = "document";

et donc les deux sont incompatible comme il est très bien expliquer dans la console. Et je pense que la première erreur vient du fait que les données qu'on envoi au

responseText

ne sont pas bonne (mais je suis pas sur)

Donc je redemande quel est l'équivalent mais cette fois pour

responseText

avec le

responseType = "document";

car j'ai essayer de comprendre ce code :

var xhr = new XMLHttpRequest();
xhr.onload = function() {
  console.log(this.responseXML.title);
}
xhr.open("GET", "file.html");

xhr.responseType = "document"; // for response type: text/html

xhr.send();

mais je ne comprend pas la façon dont il affiche le résutat et surtout le mettre dans un :

document.getElementById("textareatext").value = ;

car si je ne passe pas en html ma réponse les

<br/>

ne sont pas pris en compte même en mettant dans mon php :

<?=htmlspecialchars_decode($edit_publication['content'])?>

AJAX doit surement reformater les données

Merci encore piero5673 et si tu peux répondre à cette question :)

Mais, qui est piero5679 ?
Je ne vois qu'une seule personne qui t'aies répondu, c'est moi et mon pseudo est Lartak.