Erreur affichage page par page

Bonjour,

j’ai integré l’affichage page par page dans mon moteur de recherche à l’aide du tuto de phpdebutant.
Lorsque je veux afficher les résultats suivant il y a cette erreur qui s’affiche:

Erreur : 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 ‘LIMIT 3,3’ at line 1

Que veut dire cette erreur et que faire… merci de votre aide…

Commence donc par donner la requête SQL.

Quand tu as une erreur SQL (“SQL Syntax” tout ça), c’est que ta requête n’est pas valide, que mySQL ne la comprend pas. En conséquence, tu fais mal une chose, et le code utilisé on ne pourra pas t’aider.

Merci voici le code que j’utilise…

<?php //Liste des conditions de la requete $whereReq = 'WHERE '; //Variable indiquant si on est sur la première clause du WHERE $fLig = 1; //Si le nom est renseigné, on l'ajoute à la recherche if(!empty($_POST['nom'])) { $tabNoms = explode(",", $_POST['nom']); //Dans l'exemple suivant, on considère que les noms sont séparés par une virgule $listNoms = ""; //Liste des noms $fNom = 1; //Variable indiquant si on est sur le premier nom //Pour chaque nom foreach($tabNoms as $nom) { //Si c'est le premier nom, on ne met pas de virgule, et on indique qu'on a passé le premier nom... if($fNom){$listNoms .= "'".trim($nom)."'"; $fNom = 0;} //Sinon on met une virgule else{$listNoms .= ",'".trim($nom)."'";} } //On fait un IN qu'on rajoute aux conditions $whereReq .= "`nom` IN(".$listNoms." ) "; $fLig = 0; } //Si le prénom est renseigné, on l'ajoute à la requete if(!empty($_POST['prenom'])) { //Si le prénom est le première condition (cas ou aucun nom n'est renseigné), on indique qu'on a passé la première condition... if($fLig != 0) {$fLig = 0;} //Sinon, on rajoute un AND else{$whereReq .= "AND ";} $whereReq .= "`prenom` = '".trim($_POST['prenom'])."' "; } if(!empty($_POST['age'])) { //Si l'age est le première condition (cas ou aucun nom ni aucun prénom n'est renseigné), on indique qu'on a passé la première condition... if($fLig != 0) {$fLig = 0;} //Sinon, on rajoute un AND else{$whereReq .= "AND ";} $whereReq .= "`age` = '".trim($_POST['age'])."'"; } //Si on en est toujours à la première ligne, cela signifie qu'aucun critère n'a été entré => Message d'erreur if($fLig == 1) {echo 'Vous devez preciser en moins un critére de recherche !!';} else { //========================================= // includes du fichier fonctions //========================================= require 'fonctions.php'; //Informations de connexion au serveur $host = '*****'; //Serveur $user = '*****'; //Nom d'utilisateur $pass = '****'; //Mot de passe utilisateur $db = '*****'; //Nom de la base $tables = 'personne'; //Liste des tables à parcourir //========================================= // initialisation des variables //========================================= // on va afficher 5 résultats par page. $nombre = 5; // si limite n'existe pas on l'initialise à zéro if (!$limite) $limite = 0; // on cherche le nom de la page. $path_parts = pathinfo($_SERVER['PHP_SELF']); $page = $path_parts["basename"]; //Connexion à la BDD mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() ); mysql_select_db($db) or die ('Erreur :'.mysql_error()); //========================================= // requête SQL qui compte le nombre total // d'enregistrements dans la table. //========================================= $sel = 'SELECT count(id) FROM personne'; $res = mysql_query($sel) or die ('Erreur : '.mysql_error() ); $row = mysql_fetch_row($res); $total = $row[0]; //========================================= // vérifier la validité de notre variable // $limite; //========================================= $verifLimite= verifLimite($limite,$total,$nombre); // si la limite passée n'est pas valide on la remet à zéro if(!$verifLimite) { $limite = 0; } $sel = "SELECT * FROM $tables $whereReq ORDER BY nom ASC LIMIT ".$limite.",".$nombre; $res = mysql_query($sel) or die ('Erreur : '.mysql_error()); if($total) { echo ''; while($row = mysql_fetch_array($res)) { echo ' '; } echo '

'.$row['prenom'].'

'.$row['age'].' '.$row['img'].'
'; } else {echo '
Aucun résulat ne correspond à votre recherche !!
';} mysql_free_result($res); mysql_close(); if($total > $nombre) { // affichage des liens vers les pages affichePages($nombre,$page,$total); // affichage des boutons displayNextPreviousButtons($limite,$total,$nombre,$page); } } ?>

$sel = ‘SELECT count(id) FROM personne’;

–> ceci est faux. Déjà, si tu veux bien paginer tu prend la requête que tu fais pour sélectionner les données - en gérant tes pages - en virant :

  1. Tout ce qu’il y a entre SELECT et FROM, et en le remplaçant par COUNT(*)
  2. En supprimant tout ce qu’il y a après LIMIT (y compris LIMIT)

Sinon, affiche la requête SQL générée :

$res = mysql_query($sel) or die ('Erreur : '.mysql_error() . ' : <pre>' . $sql . '</pre>');

Maintenant, quand tu utilises des données utilisateurs protèges les :

//Pour chaque nom
foreach($tabNoms as $nom)
{
//Si c'est le premier nom, on ne met pas de virgule, et on indique qu'on a passé le premier nom...
$nom = mysql_real_escape_string($nom);
if($fNom){$listNoms .= "'".trim($nom)."'"; $fNom = 0;}
//Sinon on met une virgule
else{$listNoms .= ",'".trim($nom)."'";}
}

(je te donne un exemple, corrige les autres cas et documente toi sur les injections SQL qui sont surement la cause de ton problème)

Merci pour ses conseils (difficile pour un débutant comme moi…), visiblement c’est ma requete qui pose problème
Lorsque j’enlève $whereReq ci dessous l’affichage par par page fonctionne mais il me faut une condition where alors comment faire?

$sel = "SELECT * FROM $tables $whereReq ORDER BY nom ASC LIMIT ".$limite.",".$nombre;

Affiche la requête SQL pour commencer. Sinon, c’est que $whereReq est un fragment de requête invalide (d’où l’utilité de l’afficher, comme ça je peux pas dire)

voici la requete:

SELECT * FROM personne WHERE ORDER BY prix ASC LIMIT 3,3

C’est qu’il manque quelque chose entre WHERE et ORDER. Il devrait t’afficher WHERE blabla=‘toto’ normalement (où blabla correspond à ton champ, et toto à sa valeur).
Regardes en ammont, comment est remplie ta variable, essayes de l’afficher avant ta requête avec un echo pour savoir ce qu’elle contient après sa création.

Le problème c’est que lors de l’affichage des résultats $whereReq me met bien la condition WHERE donc ça fonctionne et lorsque j’affiche la page suivante il n’y a plus la condition WHERE ce qui cause l’erreur.

Page 1:

SELECT * FROM personne WHERE nom IN ('toto','jean','')  LIMIT 0,3

page suivante: (plus de condition WHERE)

SELECT * FROM personne WHERE  LIMIT 3,3 

Pourquoi la condition WHERE disparait?

Bah.

Tu tires des données d’un formulaire envoyée avec la méthode POST. Or tes liens, envoient des données via la méthode GET. Si tu as cette erreur, c’est tout simplement que tu n’as plus les données de ton formulaire lorsque tu change de page.

Il faut au choix :

  1. faire la recherche, sauvegarder l’ensemble des identifiants en session/base/etc, et utiliser une clef que tu passe dans l’url de tes pages (genre foo.php?page=2&search=SJDLKJSD)
  2. passer tes variables POST dans l’url, et utiliser les variables GET après (pour initialiser les variables POST par exemple), comme foo.php?page=2&nom=XXX, YYY, ZZZ&etc=…

Bonjour,

Bon je commence à comprendre, les données doivent etre conservé sur le serveur. Il faut que je démarre une session session_start(); au début du fichier mais après je ne vois pas comment procèder pour que $whereReq conserve la condition WHERE de page en page…

Tu la stockes dans ta session?

Par exemple, dans la première page :

$key = substr(sha1(uniqid('', true)), 0, 16);
$_SESSION['search'][$key] = $whereReq;

Puis, dans tes liens tu passes la clef :

&key=<?php echo $key; ?>

Et dans ta seconde page :

if (isset($_GET['key'])) {
  $whereReq = $_SESSION['search'][$_GET['key']];
} elseif (isset($_POST['nom'])) {
  // regénérer $whereReq == première page
  $whereReq = 'WHERE ' . implode(...); // etc
}

if (!isset($whereReq)) {
  echo 'ERREUR!';
  exit;
}

// -- code normal --


Bon j’ai sauté deux trois trucs, et je suis pas censé t’aider à cette heure ci… Mais braiffe :smiley:

Merci Sans-Nom pour ton aide j’ai résolu mon problème en utilisant les sessions, j’ai un autre petit souci avec les numéros de page qui ne correspondent pas avec le nombre de résultat affiché… c’est à dire que c’est la table tout entiere qui est utilisé pour la pagination et pas le nombre de résultat, d’où peut provenir ce problème?

Surement, ta requête? :slight_smile:

Faut que tu t’assures que tu ai bien (en affichant la requête) LIMIT {page}*{elementParPages}, {elementParPages}, et ça devrait être ok.