Probleme avec mon code jquery, text affiché est data

Résolu
Bonjour,
J'ai un petit soucis avec mon code jquery (enfin je pense que c'est lui qui pose problème). J'ai un formulaire avec un champ destinataire qui renvoie dynamiquement si le membre précisé existe ou nous dans la base de donné. Le problème c'est qu'il existe ou non il m'affiche "data" La dernière fois que j'ai eu ce problème c'était à cause de simples guillemets mais la je suis un peu perdu :s Pour mieux vous orienter, voici mon code:

Mon formulaire:
<?php
        if(isset($_GET['emetteur'])){
         $emetteur = htmlentities($_GET['emetteur']);
         echo '<td><input type="text" name="destinataire" id="destinataire" value="'.$emetteur.'"/><span class="feedback"></span></td>';
        } else {
         echo '<td><input type="text" name="destinataire" id="destinataire" value="" /><span class="error"></span></td>';
        }
       ?>

(J'ai bien implémenté mon fichier JS à la fin)

le code js:
$(document).ready(function(){
 $('#destinataire').keyup(function(){
 var destinataire = $('#destinataire').val();
 if(destinataire != ""){
  $.post('verifmembre.php',{destinataire:destinataire},function(data){
  $('.feedback').text(data); 
 });
 } else {
  $('.feedback').text('Veuillez inscrire un membre');
 }
 });
 
});


Et verifmembre.php
<?php 
 include '..connection.php'; 
 //Partie pour le jquery
 $destinataire = $_POST['destinataire'];
 $query = $bdd-prepare('SELECT COUNT() as nb FROM membres WHERE pseudo = ? ');
 if ($query == false) {
   echo 'Erreur prepare';
   print_r($bdd-errorInfo());
   die();
 }
 $res = $query-execute(array($destinataire));
 if ($res == false) {
   echo 'Erreur execute';
   print_r($query-errorInfo());
   die();
 }
 $row = $query-fetch();
 if ($row['nb']  0) {
   echo 'Ce user est déjà utilisé';
 } else {
   echo 'Ce user est dispo';
 }
 //Fin
?>


Une petite idée ? Merci

15 réponses

Résumé de la discussion

La vérification asynchrone du destinataire renvoie systématiquement 'data' plutôt que le statut attendu, ce qui empêche d’afficher si le membre est disponible ou déjà utilisé. La cause identifiée réside dans verifmembre.php où COUNT() est mal écrit et où les méthodes PDO ne sont pas utilisées correctement, notamment avec $bdd->prepare, $query->execute et $query->fetch. La correction consiste à remplacer COUNT() par COUNT(*) et à utiliser correctement l’objet PDO pour préparer, exécuter et récupérer le résultat, puis à tester si nb est supérieur à 0 pour répondre. En parallèle, restreindre l’affichage du message au span lié au champ destinataire évite que d’autres éléments .feedback soient modifiés, et permet d’obtenir une réponse claire et instantanée.

Bobot (l’IA à votre service)
  1. Tu avais effectivement raison, ce sont les span de mon autre classe qui posent problèmes. J'ai modifié le nom du chemin d'acces de mon autre fichier js et je n'ai plus de problème donc je vais mettre des id partout. Merci pour ta patience Jordane45 !
    0
    1. Contributeur
      Bonjour Aymeric,
      ravi que tu aies pu résoudre ton problème.
      N'oublie pas de marqué "résolu" dans ce cas (je l'ai fait pour cette fois).
      0
  2. J'ai modifié les pages avec tes lignes de code ainsi que mes span et il n'y a pas de changement ..

    Le problème est d'office au niveau de l'ajax, avec mon code on voit une fraction de seconde la réponse de verifpseudo.php et directement après il est de nouveau affiché "data". J'ai à peine le temps de voir si le membre est dispo ou non.
    0
    1. Modérateur
      Tu as d'autres sript js non ??
      Tu en as un qui écrit sûrement dans tes span !
      0
    2. Oui un, mais si c'était le cas je n'aurais pas de problème grace à l'id du span, si ?
      0
    3. Modérateur
      @AaymericSi ... car ton autre code n'écrit surement pas sur un ID précis ... mais sur tous les éléments de la class feedback
      0
    4. Les span de l'autre fichier sont tous de class ="error", ca ne change rien ?
      0
    5. Modérateur
      @AaymericLe souci ne se trouve pas au niveau des éléménts de class ERROR ... mais feedback .....
      ... dans le code de ta page (et uniquement là ! ) modifie cette ligne :
         <td><label for="destinataire">Destinataire</label>: </td><span id="destinataireFeedBack"  class="feedback"></span>
      

      par :
         <td><label for="destinataireFeedBack">Destinataire</label>: </td><span id="destinataireFeedBack"  class="feedback_2"></span>
      

      ... testes à nouveau ton code... et regardes ce que ça donne
      0
  3. J'ai changé mon fichier verifmembre.php avec ces lignes de code:

    <?php 
    	include '../connection.php';	
    	//Partie pour le jquery
    	if(isset($_POST['destinataire']) && !empty($_POST['destinataire'])){
    		$destinataire=$_POST['destinataire'];
    		$query=$bdd->query('SELECT * FROM membres WHERE pseudo ="'.$destinataire.'" ');
    		$rows= $query->rowCount();
    		if($rows == 1){
    			echo 'Pas dispo';
    		} else {
    			echo 'Dispo';
    		}
    	}
    ?>		
    


    et il renvoie la bonne réponse dans l'alert mais le texte affiché sur la page est toujours "data", une idée ?
    0
    1. Modérateur
      Testes ce que je t'ai répondu juste avant
      0
  4. Modérateur
    Le souci c'est que tu n'as pas mis d' ID à tes span...(et que tu en as plusieurs...)
    donc déjà.. mets y des ID
    par exemple :
    <span id="destinataireFeedBack" class="feedback"></span>
    


    Ensuite.. modifie le code js ainsi :
    $(document).ready(function(){
      $('#destinataire').keyup(function(){
      var destinataire = $('#destinataire').val();
      if(destinataire != ""){
       $("#destinataireFeedBack").html();
       var urlPagePhpAjx = "verifmembre.php";
        $.ajax({ 
            type: "POST",
                url:urlPagePhpAjx,
                data: { destinataire:destinataire },
                async: false,
                dataType: "html",
                success: function(reponse){
                   $("#destinataireFeedBack").html(reponse);
             //Le temps des tests :
            alert("success ! " + reponse);
                },
                error:function (xhr, ajaxOptions, thrownError) {
                  alert("Error ! \n Status:"+xhr.status + "\n Error:"+thrownError);
                } 
             });
      }else{
        $("#destinataireFeedBack").html('Veuillez inscrire un membre');
      }
     });
    });
    
    


    Et pour le PHP :
    <?php 
     include '../connection.php'; 
    
     $destinataire = isset($_POST['destinataire'])?$_POST['destinataire']:NULL;
     if($destinataire){
      $sql="SELECT *  
         FROM membres 
         WHERE pseudo = '?' ";
     
       try{ 
           $query = $bdd->prepare($sql);
           $query->execute(array($destinataire));
       }catch (PDOException $e) {
           echo 'Erreur ! ' . $e->getMessage();
        }
      $nb = $query->rowCount();
      if ($nb>0) {
       echo 'Ce user est déjà utilisé';
      } else {
       echo 'Ce user est dispo';
      }
     }else{
      echo "Error : Aucun user envoyé en POST...!";
     }
     //Fin
    ?>
    
    0
    1. C'est curieux mais ca marche à moitié ^^
      Le texte affiché est toujours "data" mais dans le message d'erreur il m'indique toujours que l'user est déjà utilisé qu'il existe vraiment ou non dans ma BDD. J'ai modifié simplement le if en: if ($row == 0) { ... Mais du coup il m'indique toujours que l'user est dispo (qu'il existe vraiment ou non dans la bdd)
      0
      1. Décidément ... Toujours le même problème ...
        J'ai ce message d'erreur maintenant:

        Erreur executeArray
        (
        [0] => 42000
        [1] => 1064
        [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') as nb

        FROM membres

        WHERE pseudo = '?'' at line 1
        )
        0
        1. Modérateur
          Manque un * dans le count...
          0
      2. Et mon verifmembre.php ressemble à ceci:
        <?php 
        	include '..connection.php';	
        	//Partie pour le jquery
        	$destinataire = $_POST['destinataire'];
        	$query = $bdd->prepare('SELECT COUNT() as nb FROM membres WHERE pseudo = ? ');
        	if ($query == false) {
        	  echo 'Erreur prepare';
        	  print_r($bdd->errorInfo());
        	  die();
        	}
        	$res = $query->execute(array($destinataire));
        	if ($res == false) {
        	  echo 'Erreur execute';
        	  print_r($query-errorInfo());
        	  die();
        	}
        	$row = $query->fetch();
        	if ($row['nb'] == 0) {
        	  echo 'Ce user est déjà utilisé';
        	} else {
        	  echo 'Ce user est dispo';
        	}
        	//Fin
        ?>
        
        0
        1. Modérateur
          Il manque encore un ">" à la ligne 14 !!

          Essayes donc ce code :
          <?php 
          	include '../connection.php';	
          
          	$destinataire = isset($_POST['destinataire'])?$_POST['destinataire']:NULL;
          	if($destinataire){
          		$sql="SELECT COUNT() as nb 
          					FROM membres 
          					WHERE pseudo = '?' ";
          		
          		$query = $bdd->prepare($sql);
          		if ($query == false) {
          			echo 'Erreur prepare';
          			print_r($bdd->errorInfo());
          			die();
          		}
          		$res = $query->execute(array($destinataire));
          		if (!$res) {
          			echo 'Erreur execute';
          			print_r($query->errorInfo());
          			die();
          		}
          		$row = $query->fetch();
          		if ($row) {
          			echo 'Ce user est déjà utilisé';
          		} else {
          			echo 'Ce user est dispo';
          		}
          	}else{
          	 echo "Error : Aucun user...!";
          	}
          	//Fin
          ?>
          
          0
      3. Avec ton code j'ai ce message d'erreur:

        <br />
        <font size='1'><table class='xdebug-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
        <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Parse error: syntax error, unexpected T_LNUMBER in C:\wamp\www\Swap-it\message\verifmembre.php on line <i>18</i></th></tr>
        </table></font>

        Mais je ne vois pas ou est l'erreur de parenthèse, tout me semble correcte :\
        0
        1. Modérateur
          Le message est clair. .le souci est sur la ligne 18.... il manque des == dans ton if non ??
          0
      4. Biens sur:
        mondossierprincipal/message/nouvmessage.php
        <?php 
         include '../connection.php';
         /* il faut demarrer la session*/
         session_start();
         if(isset($_SESSION['id'])){
        ?> 
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
          <link href="../css/main2.css" rel="stylesheet" type="text/css"> 
          <link href="../css/message.css" rel="stylesheet" type="text/css"> 
          <link href="../css/menumembre.css" rel="stylesheet" type="text/css">
          <link href="../css/sousmenu.css" rel="stylesheet" type="text/css"> 
          
          <title>Swap-it.com</title>
            </head>
            <body>
          <div id="header"> 
           <span class="titre"> Swap-it </span>
           <div id="menumembre">
            <?php 
             include 'menumembre.php';
            ?>
           </div>
          </div>
          <div id="centre">
           <div id="message">
             <div id="menumessage">
              <ul><!--
              --><li><a href="message.php">Boite à réception</a></li><!--
              --><li><a href="messageenvoye.php">Message envoyé</a></li><!--
              --><li><a href="nouvmessage.php">Nouveau message</a></li>
              </ul>
             </div>
             <span class="titremessage">Nouveau message</span>
             <form id="contact" action="verifmessage.php" method="post" name="formulaire">
              <table>
               <tr>
               <td><label for="destinataire">Destinataire</label>: </td><span class="feedback"></span>
        
               <?php
                if(isset($_GET['emetteur'])){
                 $emetteur = htmlentities($_GET['emetteur']);
                 echo '<td><input type="text" name="destinataire" id="destinataire" value="'.$emetteur.'"/><span class="feedback"></span></td>';
                } else {
                 echo '<td><input type="text" name="destinataire" id="destinataire" value="" /><span class="error"></span></td>';
                }
               ?>
                
               </tr>
               <tr>
                <td><label for="titre">Titre:</label></td>
                <td><input type="text" id="titre" name="titre" size="60px"></input><span class="error"></span><td>
                
               
               <tr>
                <td><label for="message">Message:</label></td>
                <td><textarea id="mess" name="message" rows="6" cols="60"></textarea><span class="error"></span><td>
               </tr>
              </table>
               <input type="submit" value="Envoyer" id="submit"/>
             </form>
           </div>
          </div>
          <div id="footer">
          </div>
          <script type='text/javascript' src='../js/jquery.js'></script>
          <script type='text/javascript' src='../js/message.js'></script>
          <script type='text/javascript' src='../js/verifpseudo.js'></script>
         </body>
        </html>  
        <?php
         }
        ?>
        


        mondossierprincipal/js/verifpseudo.js
        $(document).ready(function(){
          $('#destinataire').keyup(function(){
          var destinataire = $('#destinataire').val();
          if(destinataire != ""){
           var urlPagePhpAjx = "verifmembre.php";
            $.ajax({ 
                type: "POST",
                    url:urlPagePhpAjx,
                    data: { destinataire:destinataire },
                    async: false,
                    dataType: "html",
                    success: function(reponse){
                       $('.feedback').text(reponse);
                 //Le temps des tests :
                alert(reponse);
                    },
                    error:function (xhr, ajaxOptions, thrownError) {
                      alert("Status:"+xhr.status + "\n Error:"+thrownError);
                    } 
                 });
          }else{
            $('.feedback').text('Veuillez inscrire un membre');
          }
         });
        });
        
        0
        1. Non plus, j'ai toujours comme réponse "data" :s
          0
          1. Modérateur
            Pas possible. ...
            tu peux nous montrer ton code html égalementet le code mmodifié basé sur MON code ?
            0
        2. Afin d'être sûr de ne pas faire d'erreur, j'ai mon dossier principal ou il y a entre autre un dossier message qui contient mon formulaire (le cheminement vers mon fichier js est correct) et un autre dossier JS ou il y a mon fichier js.
          Dans ce fichier js il y a la ligne de code:
          $.post('verifmembre.php',

          Du coup, et n'étant pas sur de l'endroit ou je dois mettre mon fichier verifmembre.php, j'ai mis ce dernier dans le dossier JS et dans le dossier message mais il est censé se trouvé ou sans changer le code ?
          0
          1. Modérateur
            Tu as testé MON code ?
            0
        3. Ah bha oui qu'est-ce qui m'ait arrivé ? :s J'ai changé mais le problème est toujours là ..
          0
          1. Modérateur
            Perso .. j'ai du mal avec cette écriture simplifiée de l'ajax...
            Je préfère utiliser la syntaxe plus "complète"

            Que te donne ceci ?:
            $(document).ready(function(){
              $('#destinataire').keyup(function(){
              var destinataire = $('#destinataire').val();
              if(destinataire != ""){
               var urlPagePhpAjx = "verifmembre.php";
                $.ajax({ 
                    type: "POST",
                        url:urlPagePhpAjx,
                        data: { destinataire:destinataire },
                        async: false,
                        dataType: "html",
                        success: function(reponse){
                           $('.feedback').text(reponse);
            	        //Le temps des tests :
            	       alert(reponse);
                        },
                        error:function (xhr, ajaxOptions, thrownError) {
                          alert("Status:"+xhr.status + "\n Error:"+thrownError);
                        } 
                     });
              }else{
                $('.feedback').text('Veuillez inscrire un membre');
              }
             });
            });
            
            
            
            
            

            0
            1. Modérateur
              Au passage ... il manque les signes ">" dans ton code PHP ...
              $bdd-prepare
              // A changer par : 
              $bdd->prepare
              


              Idem pour $query-execute , $query-errorInfo , $query-fetch ..
              0
          2. Je les avais enlevé à la base mais le problème est toujours la :)
            0
            1. Modérateur
              Bonjour
              des quotes en trop autour e ta variable data
              0