LIMIT (recherche) HELP !

Petit nouveau ! | 3 Messages

25 mai 2012, 03:24

Bonsoir ! :)

J'ai un petit soucis, voilà j'ai un script qui me permet de faire une recherche en fonction de la valeur rentré dans le champs, la pagination est gérer via les SESSIONS !
J'ai juste un problème de LIMIT , j'ai toujours pas trouvé la solution, si quelqu'un peux m'aider !

Vous pouvez testé ici : http://www.project-heberg.fr/arcades_n [...] recherche.php
Par exemple en choisissant Maison j'ai cette erreur de LIMIT qui s'affiche ^^

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 '-10, 10' at line 1

En affichant ma requête :
SELECT * FROM arc_achat WHERE type = 'Location' AND (prix BETWEEN 0 AND 999999999) ORDER BY prix ASC LIMIT -10, 10
<?php 
session_start();

include('includes/haut.php'); 
include('includes/menu.php'); 
include('includes/menu_d.php'); 
?>

<div id="page_principale"> 

<img src="images/titre8.png"><br><br>

<?

if (empty($_SESSION['recherche'])) {
   // gestion du where
   $where = array();
 
   $filter = function($p) use (&$where) {
      if ((isset($_POST[$p]) && strlen($_POST[$p]))) {
         $where[] = "$p = '".mysql_real_escape_string($_POST[$p])."'";
         $_SESSION['recherche'][$p] = $_POST[$p];
      }
   };
 
   $filter('type');
   $filter('bien');
   $filter('ville');
   $filter('habimm');
 
   $prix_min = (isset($_POST['budget_min']) && ctype_digit($_POST['budget_min'])) ? $_POST['budget_min'] : 0;
   $prix_max = (isset($_POST['budget_max']) && ctype_digit($_POST['budget_max'])) ? $_POST['budget_max'] : 999999999;
 
   $_SESSION['recherche']['budget_min'] = $prix_min;
   $_SESSION['recherche']['budget_max'] = $prix_max;
 
   $where[]   = "(prix BETWEEN $prix_min AND $prix_max)";
   $sql_where = 'WHERE '.implode(' AND ', $where);
   $_SESSION['recherche']['sql_where'] = $sql_where;
 
   // gestion du tri
   $order_by     = (isset($_POST['tri']) && ($_POST['tri'] === 'DESC')) ? 'DESC' : 'ASC';
   $sql_order_by = "ORDER BY prix $order_by";
   $_SESSION['recherche']['tri'] = $order_by;
   $_SESSION['recherche']['sql_order_by'] = $sql_order_by;
 
}
else {
   // on récupère les morceaux de sql assemblés précédemment
   $sql_where    = $_SESSION['recherche']['sql_where'];
   $sql_order_by = $_SESSION['recherche']['sql_order_by'];
}
 
$target_page = "recherche_ok.php";
$result = mysql_query ("SELECT * FROM arc_achat $sql_where $sql_order_by $sql_limit") or die(mysql_errno().' :: '.mysql_error());

if ($anno==' ') {
echo'<table width="100%" border="0" bgcolor="#FFFFFF"><tr>
<td align="center"><i>Aucun résultat pour cette recherche.</i></td></tr></table>';
exit();
}	
// on compte le nombre total d'enregistrements renvoyés par la requête filtrée
$sql = 'SELECT COUNT(*) AS nbOfRec FROM arc_achat '.$sql_where;
$qry = mysql_query($sql) or die(mysql_errno().' :: '.mysql_error());
$nb_records = mysql_result($qry, 0, 0);
echo'&nbsp;<b><font size="5">Résultat de la recherche :<br><font color="#FF0000">&nbsp;'.$nb_records.' biens correspondant à vos critères de recherche ont été trouvés.</font><br><a href="form_recherche.php" style="color:ff40a0;text-decoration:none;">Faire une nouvelle recherche.</a></b><hr>';

// on vérifie si la page demandée est dans les limites fixées par la pagination
$nb_items_per_page = 10;
$nb_pages          = ceil($nb_records / $nb_items_per_page);
 
$asked_page = (isset($_GET['page']) && ctype_digit($_GET['page']) && ($_GET['page']))
                 ? (int) $_GET['page']
                 : 1;
 
if ($nb_records === 0) {
   $asked_page = 1;
}
else
if ($asked_page > $nb_pages) {
   // si la page demandée est supérieure au nombre total de pages alors
   // page demandée = dernière page
   $asked_page = $nb_pages;
}
// on détermine la clause LIMIT du sql à partir des données de pagination
if ($asked_page<0){ $asked_page = 1; } // au cas où (int) $_GET['page'] vaut 0
$offset =($asked_page - 1) * $nb_items_per_page;

$length    = $nb_items_per_page;
$sql_limit = "LIMIT $offset, $length";
// on extrait les données à afficher
$sql  = "SELECT * FROM arc_achat $sql_where $sql_order_by $sql_limit";
$data = mysql_query($sql) or die(mysql_error());
 
// PAGINATION //
// je suppose que ton index affiche 10 pages
$index_range = 10;
 
// détermination des bornes à afficher
if ($nb_pages <= $index_range) {
   $index_start = 1;
   $index_end = $nb_pages;
}
else
if ($asked_page === 1) {
   $index_start = 1;
   $index_end = $index_range;
}
else {
   $index_start = $asked_page;
   $index_end   = (($index_start + $index_range) > $nb_pages) ? $nb_pages : ($index_start + $index_range);
}
 
// affichage des liens spéciaux : Premier Précedent Suivant Dernier
$show_first = ($index_start > 1);
$show_prev  = ($asked_page > 1);
$show_next  = ($asked_page < $nb_pages);
$show_last  = ($index_end < $nb_pages);
 
// génération des la pagination
$paginate = array();
$paginate[] = '<div class="paginate">';
 
// lien Premier
if ($show_first) {
   $paginate[] = '<font size="5"><b><a href="'.$target_page.'?page=1" style="color:ff40a0;text-decoration:none;">First</font></b></a>';
}
 
// lien Précédent
if ($show_prev) {
   $paginate[] = '<font size="5"><b><a href="'.$target_page.'?page='.($asked_page - 1).'" style="color:ff40a0;text-decoration:none;">Page précédente <<</font></b></a>&nbsp;';
}
 
// affichage des numéros des pages
for ($i = $index_start; $i <= $index_end; ++$i) {
   $paginate[] = ($i === $asked_page)
                    ? '<span class="current"><font color="#ff40a0" size="5"><b>'.$i.'</b></font></span>&nbsp;'
                    : '<font size="5"><b><a href="'.$target_page.'?page='.$i.'" style="color:000000;text-decoration:none;">'.$i.'</font></b></a>&nbsp;';
}
 
// lien Suivant
if ($show_next) {
   $paginate[] = '&nbsp;<font size="5" color="#ff40a0"><b><a href="'.$target_page.'?page='.($asked_page + 1).'" style="color:ff40a0;text-decoration:none;">Page suivante >></font></b></a>';
}
 
// lien Dernier
if ($show_last) {
   $paginate[] = '<font size="5" color="#ff40a0"><b><a href="'.$target_page.'?page='.$index_end.'" style="color:ff40a0;text-decoration:none;">Last</a></font></b>';
}
 
$paginate[] = '</div>';

?>

<?
echo implode(null, $paginate);
?><br>

<?
      while($plus = mysql_fetch_assoc($data))
      {
      $ligne = $data["idA"];
//Affichage l'aannonce
?>

<center><div style="background-image:url('images/fond_bien.png');background-repeat:no-repeat; width:650px; height:308px;">          
<table width=650>
       <td width=320>

<?
        if ($plus['photo'] == true) {
echo '<br><center><img src="images/biens/'.$plus['photo'].'" width="300" height="260" /></center>';
?>
          <?php } else { ?>
<br><center><img src="images/biens/photo.png" width="300" height="260" /></center>
       <?php } ?>

</td>
       <td>
<?
echo '<center><b><font size="6">'.stripslashes(htmlspecialchars($plus['bien'])).'</font></b><br><font size="5">'.stripslashes(htmlspecialchars($plus['ville'])).'</font>';
?>

<?
        if ($plus['loc'] == true) {
echo '<font size="5">- '.stripslashes(htmlspecialchars($plus['loc'])).'</font><br>';
?>
          <?php } else { ?>
<BR>
       <?php } ?>

<?
echo '<font size="6" color="#ff40a0"><b>'.stripslashes(htmlspecialchars($plus['prix'])).' € AI
</font></b><br><br><font size="6"><b><a href="biens.php?id='.$plus['id'].'&action=consulter" style="color:000000;text-decoration:none;">> Détails</b></a></font><br><br>';
?>
<?
        if ($plus['exclu'] == true) {
echo '<img src="images/exclu.gif"/>';
?>
          <?php } else { ?>
       <?php } ?>

<?
echo '</center>';
?>
</td>
   </tr>
</table><br>
</div></center><br><br>
<?
      }
?>
</div>
Merci

ViPHP
ViPHP | 2577 Messages

25 mai 2012, 08:00

Je ne pense pas que limit puisse avoir des paramètres négatif. Le premier paramètre commence à 0 pour le premier enregistrement

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

26 mai 2012, 19:44

En effet, les arguments de l'instruction LIMIT sont la position de l'enregistrement de départ et le nombre d'enregistrement à retourner. Aucune de ces valeurs ne peut être négative (on ne peut pas avoir un enregistrement à la position -3 puisque l'on commence à afficher à partir de l'élément 0 ; et on ne peut pas non plus afficher -10 enregistrements).

Ton problème vient simplement du fait que quand la page demandée ($asked_page) est égale à 0, alors ton calcul :
$offset =($asked_page - 1) * $nb_items_per_page;
Renvoi -10 au lieu de 0.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...