Between et order by desc

Eléphant du PHP | 172 Messages

31 mars 2006, 22:08

Bonsoir,

J'ai un petit problème avec une requête sql que je n'arrive pas à résoudre.
$sql = "SELECT * FROM table WHERE id BETWEEN $selection_id_min AND $selection_id_max ORDER BY id DESC";
Avec cette requête, j'obtiens bien un affichage par ordre décroissant mais seulement sur chaque page et non sur la table entière.
C'est à dire, que par exemple avec 10 entrées dans ma table, sur mes 2 premières pages, j'obtiens :

page 1 : 5 4 3 2 1
et
page 2 : 10 9 8 7 6

Alors que je voudrais le contraire.

J'ai donc essayé avec limit, mais ça bug et je sais pas pourquoi :?
$sql = "SELECT * FROM news ORDER BY id DESC LIMIT $selection_id_min, $selection_id_max";
Avec 17 entrées et 5 id par page, j'obtiens :

page = 1
selection_id_min = 1
selection_id_max = 5

16 15 14 13 12 => Problème, l'id max est 17 et non 16

page = 2
selection_id_min = 6
selection_id_max = 10

11 10 9 8 7 6 5 4 3 2 => Je ne comprends pas...

page = 3
selection_id_min = 11
selection_id_max = 15

6 5 4 3 2 1 => Bizarre...

page = 4
selection_id_min = 16
selection_id_max = 17

1 => encore plus bizarre.......

Vu qu'avec le between, je n'ai pas ce problème, y'a t-il une façon de faire ceci avec, c'est à dire d'abord l'ordre décroissant de la table et ensuite le between ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 mars 2006, 22:26

Salut,

As tu regardé comment on utilise LIMIT surtout le 2eme paramètre.

Et il y a un excellent tuto pour la pagination dans la FAQ :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

31 mars 2006, 22:50

Et tu peux aussi avancer pas mal en faisant afficher ta requete avant exécution, c'est parfois très instructif, surtout quand on découvre qu'une des variables est vide... :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 172 Messages

01 avr. 2006, 12:46

Merci,

Mais comme je n'arrivais pas à modifier mon code pour faire une requête avec LIMIT, je n'arrivais pas à comprendre le bug, je l'ai modifier en prenant appui sur le nombre total d'entrée dans ma table et en partant de la fin.

Ce qui me donne.
// Table news : id, titre, date, news, auteur

$sql = 'SELECT max(id) FROM news';
$req = mysql_query($sql);
$nbre_news = mysql_result($req, 0);

$nbre_news_par_page = 5;
$nbre_page = ceil($nbre_news / $nbre_news_par_page);
$nbre_news_derniere_page = $nbre_news % $nbre_news_par_page;   // nbre de news pour la dernière page
      
if(isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] != 1 && $_GET['page'] <= $nbre_page)
{
    $page = $_GET['page'];
    $id_max = $nbre_news - ($nbre_news_par_page * ($page - 1));
}
else
{
    $page = 1;
    $id_max = $nbre_news;
}

if($page == $nbre_page && $nbre_news_derniere_page != 0)  // si c'est la dernière page et que le nbre de news ne tombe pas juste
{
    $id_min = $id_max - $nbre_news_derniere_page + 1;
}
else
{
    $id_min = $id_max - $nbre_news_par_page +1;
}

$sql = "SELECT * FROM news WHERE id BETWEEN $id_min AND $id_max ORDER BY id DESC";  
$req = mysql_query($sql);

for($i=1; $i!=$nbre_page + 1; $i++)   // affichage des liens vers les pages
{
    echo '<a style="text-align: center" href="news.php?page=' . $i . '">' . $i . '</a>';
    echo "\n";
}

while($donnees = mysql_fetch_array($req))
{
    $id = $donnees['id'];
    $titre = $donnees['titre'];
    $date = date('\L\e d\ M\ Y', $donnees['date']);
    $news = $donnees['news'];
    $auteur = $donnees['auteur'];
    echo '<div class="news">';
    echo "\r\n";
    echo '<h2><a name="news-' .$id . '"></a><a href="#news-' . $id . '">' . $titre . '</a></h2>';
    echo "\r\n";
    echo '<p>';
    echo "\r\n";
    echo '<span class="auteur_news">Par ' . $auteur . '</span>';
    echo $news;
    echo "\r\n";
    echo '</p>';
    echo "\r\n";
    echo '<span class="date_news">' . $date . '</span>';
    echo "\r\n";
    echo '</div>';
}

for($i=1; $i!=$nbre_page + 1; $i++)   // affichage des liens vers les pages
{
    echo '<a class="liens_page_news" href="news.php?page=' . $i . '">' . $i . '</a>';
    echo "\n";
}
?>
Et ça fonctionne :D

Merci de votre aide

:wink: