Passer a l'enregistrement suivant

Répondre
ragui
le 10/08/2008 à 12:53
ragui
Bonjour,

J'ai une base de donnée mysql ou j'ai des annonces classées par categorie et sous catégorie.
Je souhaiterai quand je visualise une annonce de pouvoir passer a l'annonce suivante de la meme categorie avec un tri non pas sur l'index mais sur le Titre de l'annonce.

Voila ce que j'ai fait :

$rep= mysql_query("select id_annonce from annonce where id_categorie = '".$donnee['id_categorie']."' order by annonce.titre ASC LIMIT ".$donnee['id_annonce'].",1")or die (mysql_error());

J'affiche ensuite mon lien :

while ($don = mysql_fetch_array($rep))
{
echo '<p align="center"><a href="index.php?n='.$don['id_annonce'].'">Next</a></p> ';
}

Mais ca ne marche pas on dirait que ca m'envoit vers d'autres annonces aleatoirement.

Si quelqu'un a une idée de comment faire ce serait super.

Merci
LupusMic
le 10/08/2008 à 20:37
LupusMic
Trier sur l'identifiant unique (et non l'index) est quelque chose de mal. Premièrement parce qu'il n'a aucune signification pour tes données. C'est essentiellement une clé de convenance pour faire des liens entre les tables.

Il n'y a aucune garantie que la donnée suivante soit identifiée par id + 1.

L'offset de la clause limit ne correspond en aucun cas à id. L'offset utilisé est la position dans l'ensemble de résultats obtenus par ta clause select.

Tu as trois solutions qui s'offrent à toi.
1 - y aller à la bourrin (comme toute les applications PHP que j'ai pu voir)
3 - y aller un peu plus finement, en gérant un « pointeur » vers le précédent et le suivant selon l'ordre.
2 - y aller finement en utilisant les représentation intervalaires.

La première solution est assez triviale. tu fais une requête sur l'ensemble de tes annonces :
SQL_SELECT_ANNONCE_BY_CATID
select id_annonce as id
from annonce
where id_categorie = %d
order by annonce.titre


À ce moment là, il te suffira de parcourir l'ensemble des résultats :

<?php
$dbcon = new mysqli(/* ... */) ;
$result = $dbcon->query(sprintf(SQL_SELECT_ANNONCE_BY_CATID
, (int) $donnee['id_categorie'])) ;
if(!$result)
die($dbcon->error) ;

$next = null ;
$current = null ;
$previous = null ;
while($current = $result->fetch_object())
{
if($current->id == $donnee['id_annonce'])
{
$next = $result->fetch_object() ;
break ;
}

$previous = $current ;
}

$result->close() ;
// À présent tu as la triade nécessaire pour faire tes liens
?>


Comme tu peux t'en douter, tu risque d'avoir des problèmes de
performance si tu as trop d'annonce. C'est pourquoi si cela s'avère
nécessaire, réfléchis à quelque chose de plus évolué.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
ragui
le 11/08/2008 à 14:24
ragui
Effectivement que ca peut vite devenir lourd pour le serveur si on doit a chaque fois parcourir tous les enregistrements.

Ca fait une semaine que je galere, et j'arrive pas à trouver de solutions.

Merci en tout cas pour ta réponse LupusMic.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours