8791 sujets

Développement web côté serveur, CMS

Bonsoir

Je viens d'installer un système commentaire. Malheureusement, je ne parviens pas avoir un système multi-pages, c'est-à-dire des commentaires différents sur chaque page (actuellement les mêmes commentaires s'affichent sur toutes les pages).

J'ai crée côté serveur une colonne supplémentaire page_id afin d'attribuer à chaque page un ID et de ne retourner que les commentaires ayant cet ID.

Voici le code php :

<?php

// Error reporting:
error_reporting(E_ALL^E_NOTICE);

include "connect.php";
include "comment.class.php";
$PageID = 1;

/*
/	Select all the comments and populate the $comments array with objects
*/

$comments = array();
$result = mysql_query("SELECT * FROM comments WHERE page_id = '.$PageID.' ORDER BY id ASC");

while($row = mysql_fetch_assoc($result))
{
	$comments[] = new Comment($row);
}

?>


Le submit.php :

<?php

// Error reporting:
error_reporting(E_ALL^E_NOTICE);

include "connect.php";
include "comment.class.php";

/*
/	This array is going to be populated with either
/	the data that was sent to the script, or the
/	error messages.
/*/

$arr = array();
$validates = Comment::validate($arr);

if($validates)
{
	/* Everything is OK, insert to database: */
	
	mysql_query("	INSERT INTO comments(name,url,email,body)
					VALUES (
						'".$arr['name']."',
						'".$arr['url']."',
						'".$arr['email']."',
						'".$arr['body']."'
						'".$PageID."'
					)");
	
	$arr['dt'] = date('r',time());
	$arr['id'] = mysql_insert_id();
	
	/*
	/	The data in $arr is escaped for the mysql query,
	/	but we need the unescaped variables, so we apply,
	/	stripslashes to all the elements in the array:
	/*/
	
	$arr = array_map('stripslashes',$arr);
	
	$insertedComment = new Comment($arr);

	/* Outputting the markup of the just-inserted comment: */

	echo json_encode(array('status'=>1,'html'=>$insertedComment->markup()));

}
else
{
	/* Outputtng the error messages */
	echo '{"status":0,"errors":'.json_encode($arr).'}';
}

?>


L'affiche des commentaires et le champs :

<?php

/*
/	Output the comments one by one:
*/

foreach($comments as $c){
	echo $c->markup();
}

?>

<div id="postcom"></div>
<div id="addCommentContainer">
	<p>Ajouter un commentaire</p>
	<form id="addCommentForm" method="post" action="">
    	<div>
        	<label for="name">Nom</label>
        	<input type="text" name="name" id="name" />
            
            <label for="email">Adresse courriel</label>
            <input type="text" name="email" id="email" />
            
            <label for="url">Site internet (facultatif)</label>
            <input type="text" name="url" id="url" />
            
            <textarea name="body" id="body" cols="90" rows="8"></textarea><br />

            <input type="submit" id="submit" value="Laisser un message" />

        </div>
    </form>
</div>


Je vous épargne le reste du code. Le problème, c'est que lorsque j'envoie un commentaire avec ce système la colonne "page_id" de la base de donnée reste à 0. Et il semble donc ignorer mon $PageID = 1; et mon HERE page_id = '.$PageID.'

L'erreur est-elle dans l'attribution d'un ID à la page ? Si oui, comment lui en attribuer un et faire en sorte de que cet ID passe dans la bdd ?

Merci pour votre aide.
Modifié par csm (18 Aug 2012 - 22:45)
Il faut enlever les points :

$result = mysql_query("SELECT * FROM comments WHERE page_id = '$PageID' ORDER BY id ASC");
J'ai espéré qu'une erreur aussi simple ait pu se glisser. Mais manifestement la colonne page_id reste désespérément à 0 après votre correction.

La colonne :

 # 	Colonne 	Type 	 Interclassement 	Attributs 	Null 	Défaut
7 	page_id 	int(11) 			                Non   Aucune


Et le commentaire :

ID 	name 		        mail                       	Body           	dt          page_id
20 	Germanicus 		Germain@icus.com 	Est-ce que... ?	2012-08-18 22:57:29    	  0

Modifié par csm (18 Aug 2012 - 23:04)
Hello,

Avant d'implémenter ta requête SQL dans le code, l'as-tu testée dans ton SGBD ?

Sinon, qu'est ce qui différencie tes pages ? Ou plutôt, qu'est-ce qui est commenté ? Car logiquement, c'est l'identifiant de l'objet commenté qui devrait se trouver en clé-étrangère dans la table des commentaires, et non celui de la page dans laquelle tu l'affiches.
Anymah a écrit :
Hello,

Avant d'implémenter ta requête SQL dans le code, l'as-tu testée dans ton SGBD ?

Sinon, qu'est ce qui différencie tes pages ? Ou plutôt, qu'est-ce qui est commenté ? Car logiquement, c'est l'identifiant de l'objet commenté qui devrait se trouver en clé-étrangère dans la table des commentaires, et non celui de la page dans laquelle tu l'affiches.


Bonjour.

Sur chaque page (par exemple index.php), j'ai ajouté un ID sous la forme :

<?php

........

$PageID = 1;

......

?>


Pour une autre page, on trouve


...
$PageID = 2;
...


Et ainsi de suite.

Lorsqu'un commentaire est envoyé, j'envoie également le PageID:

	mysql_query("	INSERT INTO comments(name,url,email,body)
					VALUES (
						'".$arr['name']."',
						'".$arr['url']."',
						'".$arr['email']."',
						'".$arr['body']."'
						'".$PageID."'
					)");


Puis je cherche à afficher les commentaire ayant uniquement le PageID de la page en question :

WHERE page_id = '.$PageID.'


Je n'ai pas testé la requête dans mon SGBD (?).
Modifié par csm (19 Aug 2012 - 17:13)
Bonsoir,

L'abréviation SGBD veut dire Système de Gestion de Base de Données. J'aurais pu dire phpmyadmin puisque la plupart d'entre nous utilisent celui-ci. En gros, teste ta requête la-dessus et vérifie qu'elle te retourne bien les résultats attendu. Ensuite seulement, cherche une erreur dans le code.

Pour le reste, j'ai compris comment tu procédais. Là ou je voulais en venir, c'est que tes commentaires ne sont pas censés être liés à tes pages, mais à ce qu'ils commentent.
La requête

$result = mysql_query("SELECT * FROM comments WHERE page_id = '$PageID' ORDER BY id ASC");


fonctionne correctement. Je ne l'avais pas testée dans phpmyadmin, mais j'avais fait le test de modifier manuellement la valeur de page_id pour un commentaire dans la BD, ce commentaire s'affichait correctement sur la page voulue. (les pages où se trouvent PageID = 2 affichent les commentaires ayant 2 dans la colonne page_id, etc.

Sans doute le problème vient-il du submit.php ?

	mysql_query("	INSERT INTO comments(name,url,email,body)
					VALUES (
						'".$arr['name']."',
						'".$arr['url']."',
						'".$arr['email']."',
						'".$arr['body']."'
						'".$PageID."'
					)");


Très honnêtement, je ne vois pas où le problème... Ou plutôt : je ne vois pas pourquoi la valeur "PageID" n'est pas transmise à la BD...
Modifié par csm (20 Aug 2012 - 21:21)
Bonsoir,

C'est effectivement ta requête d'insertion qui semble fausse, tu oublies de spécifier dans quelle colonne tu insère l'identifiant de ta page. Essaies donc ceci :

INSERT INTO comments(name,url,email,body,[b]page_id[/b]) VALUES (...)
Anymah a écrit :

L'abréviation SGBD veut dire Système de Gestion de Base de Données. J'aurais pu dire phpmyadmin puisque la plupart d'entre nous utilisent celui-ci.


Euh... le SGBD c'est MySQL, pas PHPMyAdmin. PHPMyAdmin c'est une application de gestion de SGBD.
Modifié par jb_gfx (20 Aug 2012 - 23:32)
Anymah a écrit :
Bonsoir,

C'est effectivement ta requête d'insertion qui semble fausse, tu oublies de spécifier dans quelle colonne tu insère l'identifiant de ta page. Essaies donc ceci :

INSERT INTO comments(name,url,email,body,[b]page_id[/b]) VALUES (...)


J'y avais pensé. Malheureusement lorsque je fais cette modification, rien n'est transmis à la BdD. Aucune information n'est insérée. Le commentaire n'apparaît pas dans la BdD...

Je n'ai d'ailleurs pas compris pourquoi l'ajout d'un paramètre empêchait la transmission du reste... mais passons.

Peut-être dois-je également le rajouter dans comment.class.php ?

<?php

class Comment
{
	private $data = array();
	
	public function __construct($row)
	{
		/*
		/	The constructor
		*/
		
		$this->data = $row;
	}
	
	public function markup()
	{
		$d = &$this->data;
		
		$link_open = '';
		$link_close = '';
		
		if($d['url']){
			
			$link_open = '<a href="'.$d['url'].'">';
			$link_close =  '</a>';
		}
		
		$d['dt'] = strtotime($d['dt']);
		
		$url = 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]).'/img/default_avatar.gif';
		
		return '
		
			<div class="comment">
				<div class="avatar">
					'.$link_open.'
					<img src="http://www.gravatar.com/avatar/'.md5($d['email']).'?size=50&amp;default='.urlencode($url).'" />
					'.$link_close.'
				</div>
				
				<div class="name">'.$link_open.$d['name'].$link_close.'</div>
				<div class="date" title="Added at '.date('H:i \o\n d M Y',$d['dt']).'">'.date('d M Y',$d['dt']).'</div>
				<p>'.$d['body'].'</p>
			</div>
		';
	}
	
	public static function validate(&$arr)
	{
		/*
		/	Validation des données envoyées en Ajax
		*/
		
		$errors = array();
		$data	= array();
		
		// Using the filter_input function introduced in PHP 5.2.0
		
		if(!($data['email'] = filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)))
		{
			$errors['email'] = 'Please enter a valid Email.';
		}
		
		if(!($data['url'] = filter_input(INPUT_POST,'url',FILTER_VALIDATE_URL)))
		{
			
			$url = '';
		}
		
		
		if(!($data['body'] = filter_input(INPUT_POST,'body',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
		{
			$errors['body'] = 'Please enter a comment body.';
		}
		
		if(!($data['name'] = filter_input(INPUT_POST,'name',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
		{
			$errors['name'] = 'Please enter a name.';
		}
		
		if(!empty($errors)){
			
			$arr = $errors;
			return false;
		}
		
		
		foreach($data as $k=>$v){
			$arr[$k] = mysql_real_escape_string($v);
		}
		
		
		$arr['email'] = strtolower(trim($arr['email']));
		
		return true;
		
	}

	private static function validate_text($str)
	{
		
		if(mb_strlen($str,'utf8')<1)
			return false;
		
		$str = nl2br(htmlspecialchars($str));
		
		$str = str_replace(array(chr(10),chr(13)),'',$str);
		
		return $str;
	}

}

?>

Modifié par csm (20 Aug 2012 - 23:59)