Affichage de commentaires en utilisant json

Mammouth du PHP | 725 Messages

15 nov. 2011, 05:45

Bonjour,

Je trouvais une difficulte a affiche mon dernier commentaire par la methode append, j'utilise json qui joue le role entre jQuery et PHP:

index.php:
$('.SubCom').click(function(){
        
        // load image
        $('.loading').show();
        
        var commentaire = $('.commentaire').val();
        var comLen =  commentaire.length;
        
        var dataString = 'commentaire='+ commentaire;

        $.ajax({
        type: "POST",
		url: "Forms/formCommentsCheck.php",
        data: dataString,
        dataType: "json",
        success: function(data) {
        
        // moins de caracteres
        if(data.comCheck == "lessChars"){
            $('.loading').hide();
                $(".comErrors").html("<div>Veuillez entrer plus de caracteres</div>");
            } else {
                $('.loading').hide();
                
                // append le dernier commentaire
				$('.displayNewCom').fadeIn().append(data);
  
                $(".comErrors").html("<div>Merci pour votre commentaire!</div>");
                    }
        
            
        }
  });
  
  return false;
  });
formCommentsCheck.php:
<?php

$commentaire = strip_tags($_POST['commentaire'], '<a>');

$date_posted = time();

if(mb_strlen($commentaire, 'utf8') < 10)
{
    $comCheck = 'lessChars';
}
else
{
    $comCheck = 'goodChars';
  
$sql = 'INSERT INTO commentaires VALUES (\'\', "'.$commentaire.'")';
$req = $connexion->query($sql);
}

// encodage json
$return_arr["comCheck"] = $comCheck;

echo json_encode($return_arr);

// append data
$sql = 'SELECT * FROM commentaires WHERE ORDER BY idcom DESC LIMIT 1';
//echo $sql;
$req = $connexion->query($sql); 
$result = $req->fetchAll();

foreach($result as $kArr=>$vArr)
{
		$comments = stripslashes(strip_tags($vArr['comments'], '<a>'));
        
        echo '<div style="background-color:#a5a5f0; overflow:hidden; width:500px;">';
echo '<div style="float:left; width:450px; background-color:#7171e7;">';
echo $comments;
echo '</div>';
echo '<div style="float:left; width:50px; background-color:#3838db;">';
echo '<img src="'.$path2imgs.'noProfile.png" width="50" height="50" />';
echo '</div>';
echo '</div>';

echo '<hr style="width: 500px; color: green;">';
}
?>


alors quand je valide le formulaire l'icone de loading reste afficher, sur la console j'ai ce bout de code:

Code : Tout sélectionner

{"comCheck":"lessChars"}<div style="background-color:#a5a5f0; overflow:hidden; width:500px;"><div style="float:left; width:450px; background-color:#7171e7;">fsdf fsdfsdf</div><div style="float:left; width:50px; background-color:#3838db;"><img src="Images/noProfile.png" width="50" height="50" /></div></div><hr style="width: 500px; color: green;">
normalement "comCheck":"lessChars" doit afficher le message d'erreur, alors en ajoutant:

Code : Tout sélectionner

console.log(data.comCheck);
ca donne rien, du vide

merci a vous

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 nov. 2011, 13:27

Dans ce que tu nous montres, le JSON ne contient que la variable "comCheck" dont la valeur est "lessChars"
Ton HTML est en dehors de la chaine JSON.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 725 Messages

16 nov. 2011, 08:01

Dans ce que tu nous montres, le JSON ne contient que la variable "comCheck" dont la valeur est "lessChars"
Ton HTML est en dehors de la chaine JSON.
j'ai mis le contenu commentaire dans une variable array, alors lorsque je clique sur "afficher plus de commentaires", il affiche seulement 1 seul, autrement dit: j'affiche seulement 2 commentaires, je clique sur "afficher plus de commentaires", il doit afficher la totalite des commentaires:

le code index:
$('.moreComs').click(function(){
        	
        	var level1 = $('#IDlevel1').val();
			var level2 = $('#IDlevel2').val();
        	var level3 = $('#IDlevel3').val();
        	var num = $('#IDnum').val(); 
        	
        	var dataString = 'level1=' + level1 + '&level2=' + level2 + '&level3=' + level3 + '&num=' + num;
        
        $.ajax({
        type: "POST",
		url: "Forms/displayCommentsMore.php",
        data: dataString,
        dataType: "json",
        success: function(data) {
        	
        	$('.loadingComs').show();
			$('.appendComs').fadeIn().append(data.commFull); 			
			$('.loadingComs').hide();
        	
        	}
        	});
code displayCommentsMore:
<?php

$return_arr = array();

include '../Included_Files/Connect.php';
include '../Included_Files/paths.php';

$level1 = $_POST['level1'];
$level2 = $_POST['level2'];
$level3 = $_POST['level3'];
$num = $_POST['num'];

$maxComsPerPage = '99';
$sqlq = 'SELECT * FROM commentaires WHERE level1 = "'.$level1.'" AND level2 = "'.$level2.'" AND level3 = "'.$level3.'" AND num = "'.$num.'" ORDER BY idcom DESC';

echo $sqlq;

$req = $connexion->query($sqlq); 
$result = $req->fetchAll();
$total_com = count($result);
echo $total_com;

foreach($result as $kArr=>$vArr)
{
                $idcom = strip_tags($vArr['idcom']);
                $id_pseudo = strip_tags($vArr['id_pseudo']);
                $date_posted = strip_tags($vArr['date_posted']);
                $commentaire = strip_tags($vArr['commentaire'], '<a>');
                
        $commFull = '<div style="background-color:#a5a5f0; overflow:hidden; width:500px;">';
		$commFull .= '<div style="float:left; width:450px; background-color:#7171e7;">';
		$commFull .= $commentaire;
		$commFull .= '</div>';
		$commFull .= '<div style="float:left; width:50px; background-color:#3838db;">';
		$commFull .= '<img src="'.$path2imgs.'noProfile.png" width="50" height="50" />';
		$commFull .= '</div>';
		$commFull .= '</div>';

		$commFull .= '<hr style="width: 500px; color: green;">';
		
}
		
  	$return_arr["commFull"] = $commFull;
	
  echo json_encode($return_arr);		
	

?>
resultat sur firebug, j'ai pas mis d'affichage, j'ai mis des echos pour voir le resultat de la requete ainsi que le total:
requete => SELECT * FROM commentaires WHERE level1 = "6" AND level2 = "43" AND level3 = "7" AND num = "89" ORDER BY idcom DESC
total => 7

Mammouth du PHP | 725 Messages

17 nov. 2011, 02:42

est ce que la methode utilisee par json ne permet pas d'afficher plus qu'un message?

Eléphant du PHP | 60 Messages

20 nov. 2011, 12:23

Bonjour,

as-tu remarqué que dans ton bout de code suivant :

[php]foreach($result as $kArr=>$vArr)
{
[...]
$commFull = '<div style="background-color:#a5a5f0; overflow:hidden; width:500px;">';
[..]
$commFull .= '<hr style="width: 500px; color: green;">';
}

$return_arr["commFull"] = $commFull;[/php]

la ligne [php]$return_arr["commFull"] = $commFull;[/php]

se trouve hors de ta boucle ?

Résultat : Tu ne mets jamais qu'un et un seul commentaire dans $return_arr...
Un var_dump($return_arr) pourra éventuellement te confirmer cela.

Affiche aussi la chaîne json que tu récupères de "Forms/displayCommentsMore.php" pour vérifier.
Après cela tu devrais savoir e qu'il te reste à faire.
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.

Mammouth du PHP | 725 Messages

20 nov. 2011, 12:59

j'ai mis le code:

Code : Tout sélectionner

foreach() { $return_arr["commFull"] = $commFull; echo json_encode($return_arr); }
il me retourne rien dans la page, par contre au niveau firebug, il affiche tous les resultats, en mettant:

Code : Tout sélectionner

foreach() { $return_arr["commFull"] = $commFull; } echo json_encode($return_arr);
il affiche un seul resultat comme auparavant