Page 1 sur 1

Envoyer l'ID d'une page dans la BdD

Posté : 21 août 2012, 15:02
par csm
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.

J'ai donc sur chaque page un
$PageID = 1;
avec un chiffre différent pour chaque page.

La requête d'affichage des commentaire ayant PageID = x fonctionne (si j'attribue manuellement dans la BdD un page_id à un post, celui-ci ne s'affiche que sur la page voulue):
$result = mysql_query("SELECT * FROM comments WHERE page_id = '$PageID' ORDER BY id ASC");
Ce qui ne fonctionne pas, c'est lorsque l'on envoie un commentaire, le page_id reste désespérément à 0.

Voici le submit.php (si je rajoute page_id à "mysql_query(" INSERT INTO comments(name,url,email,body)", alors rien n'est envoyé au serveur) :
<?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).'}';
}

?>
Et enfin le 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&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;
	}

}

?>
Je ne sais pas à quel niveau est l'erreur. J'ai cherché sans succès. Pourriez-vous me donner une piste ou une idée ? Comment faire en sorte que le PageID soit transmis à la BdD ? Merci !

Re: Envoyer l'ID d'une page dans la BdD

Posté : 21 août 2012, 17:17
par moogli
salut,

la requête SQL demande 4 champs tu en fournit 5 ça ne peux fonctionner :mrgreen:

je te conseil de revoir comment on créer une requête insert, il ne te manque pas grand chose.

est ce que la table contient bien un colonne prévue à cette effet ?

lorsque l'on developpe l'error_reporting DOIT être à E_ALL

avec ce code tu as des messages d'erreurs que tu ne vois à cause de la requete ajax (l'erreur SQL)

il faut absolument que tu traite le retour de mysql_query afin de pouvoir renvoyer un message d'erreur le cas échéant (avec mysl_error).

par exemple
<?php
$ret = mysql_query('ta requete de compète' );
if ($ret === false)
   echo json_encode( array('status'=>0,'error'=>mysql_error()));
else {
// reste du traitement que tu as déja
}
?>
je te conseil de ne pas utiliser cette classe et de te faire de fonction perso que tu comprend et d'utiliser une autre extension de php pour te connecter à MySQL celle ci est dépréciée (mysqli par exemple y a juste a ajouter un i dans les no de fonction :) ).

@+

Re: Envoyer l'ID d'une page dans la BdD

Posté : 21 août 2012, 21:32
par csm
salut,

la requête SQL demande 4 champs tu en fournit 5 ça ne peux fonctionner :mrgreen:

je te conseil de revoir comment on créer une requête insert, il ne te manque pas grand chose.

est ce que la table contient bien un colonne prévue à cette effet ?

lorsque l'on developpe l'error_reporting DOIT être à E_ALL

avec ce code tu as des messages d'erreurs que tu ne vois à cause de la requete ajax (l'erreur SQL)

il faut absolument que tu traite le retour de mysql_query afin de pouvoir renvoyer un message d'erreur le cas échéant (avec mysl_error).

par exemple
<?php
$ret = mysql_query('ta requete de compète' );
if ($ret === false)
   echo json_encode( array('status'=>0,'error'=>mysql_error()));
else {
// reste du traitement que tu as déja
}
?>
je te conseil de ne pas utiliser cette classe et de te faire de fonction perso que tu comprend et d'utiliser une autre extension de php pour te connecter à MySQL celle ci est dépréciée (mysqli par exemple y a juste a ajouter un i dans les no de fonction :) ).

@+

Je vous remercie pour ces corrections. Je ne savais pas que cette extension était dépréciée.

Concernant ma requête SQL, j'ai bien essayé :
        mysql_query("   INSERT INTO comments(name,url,email,body,page_id)
                                        VALUES (
                                                '".$arr['name']."',
                                                '".$arr['url']."',
                                                '".$arr['email']."',
                                                '".$arr['body']."'
                                                '".$PageID."'
                                        )");
Ici on a bien 5 champs et 5 valeurs, n'est-ce pas ? eh bien lorsque j'utilise ceci, rien n'est transmis à la BdD. Rien du tout. La table contient bien sûr une colonne page_id. Est-ce bien de cela que vous parlez ?

Re: Envoyer l'ID d'une page dans la BdD

Posté : 23 août 2012, 08:13
par moogli
Il faut tester le retour de mysql_query, comme dans mon exemple.

S'il n'y a pas d'insertion c'est qu'il y a une erreur, peut être bête mais pas flagrante ;)

La requête semble bonne. Qu'elle est la structure de la table ? (un show create table dans une console mysql permet de l'avoir).

Des extensions comme firebug ou l'outils développeur de chrome permette de suivre les requête Ajax et de voir ce qu'elles retourne.

@+

Re: Envoyer l'ID d'une page dans la BdD

Posté : 23 août 2012, 20:23
par schim59
Bonsoir,
Des caratères non échapés ? style " ou ' ?