PHP, besoin d'un petit cout de pouce

Discussion dans 'Web, design' créé par DeScH, 1 Avril 2007.

Statut de la discussion:
Fermée.
  1. Offline
    DeScH AstaLaVista
    Merci merci, j'aurai encore appris qqch aujourd'hui lol

    J'ai essayé cette requete:

    Code:
    SELECT * FROM News WHERE id=(SELECT id FROM News WHERE id<$id ORDER BY id DESC LIMIT 1) OR id>=$id ORDER BY id DESC LIMIT 3
    Mais elle ne marche pas comme il faut. Elle me sélectionne l'id +1 et -1 d'une news qui n'a rien avoir avec ce que je veux. L'autre requete ne fonctionne pas.

    Code:
    $q=" SELECT * FROM $tbl_news WHERE id=(SELECT id FROM $tbl_news WHERE id>$id_article ORDER BY id DESC LIMIT 1) OR id<=$id_article ORDER BY id DESC LIMIT 3";
    Si je fais cette requete la, j'ai la news précédente en 3e position(+1). une news qui n'a rien a en 1ere et la bonne au milieu.
    DeScH, 8 Avril 2007
    #41
  2. Offline
    oNi- Elite
    Ceci fonctionne :
    Code:
    SELECT * 
    FROM News
    WHERE 
      id=(SELECT id FROM News WHERE id <$id_article ORDER BY id DESC LIMIT 1) OR
      id=(SELECT id FROM News WHERE id =$id_article LIMIT 1) OR
      id=(SELECT id FROM News WHERE id >$id_article ORDER BY id LIMIT 1)
    ORDER BY id
    LIMIT 3;
    Cas général = news pour laquelle on peut trouver une news précédente ainsi que la suivante.
    exemple pour la news 15 : ça nous donne bien les 14, 15 et 16 (ou 13, 15 et 16, par exemple, si la 14 n'existe plus dans ta DB).

    Qu'obtiens-tu quand ton $id_article est le 1 ?
    Comme il n'y a pas de news précédente tu auras : 1 et 2 (donc 2 lignes)
    et pour la dernière news : news précédente et news actuelle (donc celle qui correspond à $id_article).

    Il faudra donc tester si le champ id de la ligne de ton $result est :
    inférieur à $id_article : dans ce cas tu as la news précédente
    égal à $id_article : l'article actuel
    supérieur à $id_article : news suivante
    Donc un truc dont l'ossature devrait se rapprocher de ça :
    Code:
    $result = mysql_query('');
    while($row = mysql_fetch_assoc($result))
    {
        if($row['id']<$id_article)
        {
            $news_prec['id'] = $row['id'];
            // etc.
        }
        elseif($row['id']=$id_article)
        {
            $news_cour['id'] = $row['id'];
            // etc.
        }
        else
        {
            $news_suiv['id'] = $row['id'];
            // etc.
        }
    }
    Mais bon... ça me semble être beaucoup de chipotage et je me demande pourquoi tu n'as pas pris en considération la remarque de guslinux lorsqu'il parlait de faire 3 SELECT séparés... Car de toute manière quand on analyse le premier code de ce message on fait de toute façon 3 SELECT (en fait 4) et ensuite on se fait ch*** avec les tests en sortie :/
    Alors qu'avec sa méthode, tu sais ce que tu attends et soit tu l'obtiens soit c'est null.

    A toi de voir ;)
    oNi-, 8 Avril 2007
    #42
  3. Offline
    DeScH AstaLaVista
    Merci merci, j'y vois bcp plus clair.
    Oui en fait je pense que je vais faire ces 3 requetes séparément. J'ai voulu trouver un système pour faire les 3 requetes en une car je me disais que ca prendrait moins de ressources sur le server mais ca revient au meme finalement.
    Je vais donc tester tt ca.

    Code:
    	
    $q=" SELECT * FROM $tbl_news WHERE id= $id_article LIMIT 1";
    $reqd = mysql_query($q);
    $nb_art = mysql_num_rows($reqd);
    
    $q=" SELECT * FROM $tbl_news WHERE id < $id_article ORDER BY id DESC LIMIT 1";
    $reqd = mysql_query($q);
    $news_avant = mysql_fetch_assoc($reqd);
    $news_prec_nb = mysql_num_rows($reqd);
    
    $q=" SELECT * FROM $tbl_news WHERE id > $id_article LIMIT 1";
    $reqd = mysql_query($q);
    $news_apres = mysql_fetch_assoc($reqd);
    $news_suiv_nb = mysql_num_rows($reqd);
    
    ....
    
    if ($news_prec_nb !=0){
    //afficher news précédente
    }
    if ($news_suiv_nb !=0){
    //afficher news suivante
    }
    
    
    DeScH, 9 Avril 2007
    #43
Statut de la discussion:
Fermée.