Between et order by desc

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Between et order by desc

par spirou » 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:

par Cyrano » 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

par Truc » 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:

Between et order by desc

par spirou » 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 ?