Erreur requete SQL

Zoom2mlk
Invité n'ayant pas de compte PHPfrance

31 janv. 2010, 01:06

Bonjour a tous :) ,
J'ai un probleme avec mon script de commentaire, dans la partie qui affiche les commentaire, la voici :
$reponse = mysql_query("SELECT * FROM commentaires WHERE id_page="' . $_GET['id_page'] . '" ORDER BY ID DESC LIMIT 0,10");
A l'affichage de ma page, on me dit qu'il y a une erreur dans cette ligne, mais quel est cet erreur ? Aidez moi svp :cry: !

A noter qu'avant je n'utilisais pas le $_GET['id_page'], j'ecrivais l'id_page manuellement et ca marchait tres bien !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

31 janv. 2010, 01:21

Et quel est ce message d'erreur ? (on a encore rien trouvé de mieux pour identifier l'origine d'un problème :))

As-tu vérifié ce que contenait ta variable $_GET['id_page'] ? (vu qu'avec une valeur saisie manuellement ça marchait, y a de grande chance que le problème vienne de là ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Zoom2mlk
Invité n'ayant pas de compte PHPfrance

31 janv. 2010, 01:26

Tout d'abord merci de repondre =), voici le message d'erreur :
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /homepages/8/d314637936/htdocs/includes/commentairesv2.php on line 36

Et pour la variable $id_page, je suis sur de ce qu'elle contient car je l'utilise egalement pour enregistrer le commentaire dans la BDD.

ViPHP
ViPHP | 5462 Messages

31 janv. 2010, 03:09

simple erreur de syntax
$reponse = mysql_query("SELECT * FROM commentaires WHERE id_page='" . $_GET['id_page'] . "' ORDER BY ID DESC LIMIT 0,10");

Mammouth du PHP | 881 Messages

31 janv. 2010, 04:59

Simple erreur de syntaxe: vérifie tes guillemets ( ") et apostrophes ( ' ), rectifie leurs positions et ça devrait fonctionner
Soyez artisans de paix

ViPHP
ViPHP | 1996 Messages

31 janv. 2010, 13:19

Petit conseil : protège ton $_GET['id_page'] sinon attention aux injections sql...
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

ViPHP
ViPHP | 1996 Messages

31 janv. 2010, 13:25

Moi ce que je fais souvent c'est de tester la valeur avant :
<?php
$requete = "SELECT id_page FROM commentaires";
$resultat_sql = mysql_query ($requete);
$tab_id_page = array();
while ($resultat = mysql_fecth_row($resultat_sql))
{
  array_push($tab_id_page,$resultat[0]);
}

if (in_array($_GET['id_page'],$tab_id_page))
{
  //ok suite du script
}
else
{
 // pas Ok (essai de piratage ou erreur de l'utilisateur) : message d'erreur ou script par défaut
}
?>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

31 janv. 2010, 13:49

Moi ce que je fais souvent c'est de tester la valeur avant
Personnellement, je ne suis pas convaincu de l'intérêt de ce test... en effet, plus le nombre d'enregistrements de la table va être important, plus ce test va être lourd et long (bon ok, ça se compte en milisecondes ;)), alors que protéger ta variable se fait simplement et si l'info n'existe pas, tu le sais très rapidement :
<?php
if (isSet($_GET['id_page'])) {
   // traitement pour protéger la variable avec real_escape, htmlentities et tout ce dont vous avez besoin
   $idPage = protegeMaVariable($_GET['id_page']);

   // Nota : si le champ id_page est numérique, il ne faut pas d'apostrophes pour délimiter la valeur
   // mysql les tolèrera, mais pas les autres base de données. C'est donc une bonne habitude à prendre
   $requete = "SELECT ... FROM commentaires WHERE id_page=" . $idPage . " ORDER BY ID DESC LIMIT 0,10";
   $resultat_sql = mysql_query ($requete);
   while ($resultat = mysql_fecth_assoc($resultat_sql)) { // on peut aisément tester s'il y a un résultat
      //ok suite du script
   }
   else {
      // pas Ok (essai de piratage ou erreur de l'utilisateur) : message d'erreur ou script par défaut
   }
}
?>
Ca ne reste qu'un avis personnel :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 199 Messages

31 janv. 2010, 14:52

La ta variable d'après le nom est un entier, donc on peut utiliser is_int() qui vérifiera si la valeur saisit est un entier.
<?php

if(is_int($val))
 {
//il se passe ca

}
else
{
//il se passe ca
}
?>
Ainsi on éviter les injections.

ViPHP
ViPHP | 1996 Messages

31 janv. 2010, 18:33

Moi ce que je fais souvent c'est de tester la valeur avant
Personnellement, je ne suis pas convaincu de l'intérêt de ce test... en effet, plus le nombre d'enregistrements de la table va être important, plus ce test va être lourd et long (bon ok, ça se compte en milisecondes ;)), alors que protéger ta variable se fait simplement et si l'info n'existe pas, tu le sais très rapidement :
D'abord tu fais que toujours m'embetter |(X
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

ViPHP
ViPHP | 5462 Messages

31 janv. 2010, 18:39

et puis array_push c'est pas bien de l'utilisé pour une seule valeur, c'est plus otimisé d'utilisé $array[]

sinon pour la valeur, un coup de sprintf (avec %d) est c'est reglé pas besion de faire de fonction, sauf si on veux un message spécial