Php:afficher résultat requête sql sans while

Résolu/Fermé
Alphatrion Messages postés 12 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 17 février 2014 - 26 janv. 2010 à 19:13
Alphatrion Messages postés 12 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 17 février 2014 - 27 janv. 2010 à 18:09
Bonjour à tous,

je voudrais savoir comment faire pour afficher les résultats d'une requête sql sans utiliser de bouche while.
La finalité est de faire deux requêtes sur deux tables distinctes et d'afficher les résultats ensembles, classés par date.
Donc je voudrais faire (pour afficher par exemple dix enregistrements) :
$i=0
while ($i<11) do {
if ($row_table1['date'] > $row_table2['date'])
{echo $row_table1['contenu'] ; $i++}
else
{echo $row_table2['contenu'] ; $i++}
}

comment faire pour que, après chaque l'affichage du contenu du premier enregistrement, l'enregistrement qui sera testé lors de la prochaine exécution soit l'enregistrement du deuxième enregistrement ? En gros, il faudrait que dans la parenthèse au niveau de l'incrément de $i, je rajoute une instruction "hop la, maintenant on considère l'enregistrement suivant"

J'ai beau le retourner dans tous les sens, je ne vois pas comment faire ?
A voir également:

11 réponses

zcrew Messages postés 231 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 26 février 2010 25
27 janv. 2010 à 12:44
Salut,

Avant tout remplace
$i=0
while ($i<11) do {

par
for ($i = 0 ; $i < 11 ; $i++)

c'est plus joli. Ensuite là tu affiches 11 lignes et non 10.

Après tu peux faire un truc comme
for ($i = 0 ; $i < 10 ; $i++)
{
if ( ($i%2) == 0) // Si $i est pair
{
$row_table1 = mysql_fetch_row(...) ;
echo $row_table1['contenu'] ;
}
else
{
$row_table2 = mysql_fetch_row(...) ;
echo $row_table2['contenu'] ;
}
}

Ca n'affichera que 5 lignes de chaque tableau, donc un total de 10 lignes
1
Ça ne va marcher que si tu es sûr d'avoir plus de valeurs que le nombre que tu veux afficher. Mais sur un système nouvellement installé, ou tu as peu de News et de Beer, erreur assurée...
Dans le programme que je t'ai proposé, je n'ai pas mis de limitation du nombre d'infos affichées. un petit $i=0 en initialisation, $i++; dans la boucle et une condition de plus dans le while devraient faire l'affaire
1
Alphatrion Messages postés 12 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 17 février 2014 10
27 janv. 2010 à 18:09
En effet, dans ce cas là, ça aurait été problématique, mais là, le but n'est que d'afficher une dizaine d'enregistrements (cette page va générer un flux rss) et chacune des deux tables est beaucoup plus grande ;)
Du coup, ta solution aurait été bien pratique... Par contre, je pense qu'en faisant
$row_News = mysql_fetch_array($News, MYSQL_BOTH);
$row_Beer = mysql_fetch_array($Beer, MYSQL_BOTH);
dès le début, tu zappes les deux premiers enregistrements (c'est ce que j'avais fait au début)


en tout cas, ma solution marche bien donc c'est cool, merci pour ton temps

bonne soirée
1
Archeus01 Messages postés 1567 Date d'inscription mercredi 3 octobre 2007 Statut Membre Dernière intervention 9 juin 2022 447
27 janv. 2010 à 11:44
Bonjour,

pourquoi tu ne met pas tout dans le même tableau et après tu tries avec une fonction php faite pour trier les tableaux avant de les afficher?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alphatrion Messages postés 12 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 17 février 2014 10
27 janv. 2010 à 14:29
Bonjour et merci de vos réponses

-> Archeus, le coup du tableau, ça me semble une bonne idée seulement je ne sais pas vraiment comment m'y prendre pour créer un trier un tel tableau. Je peux chercher mais je pense que ça ne marchera pas car mes deux tables n'ont en fait pas les mêmes colonnes. Quand j'ai écrit echo $row_table1['contenu']; c'était simplifié, j'affiche différentes colonnes à cet endroit...

-> Zcrew, je sais pas si c'est moi qui ne comprends pas ton code, mais il me semble que ça affiche une ligne sur deux pour chacune des tables, ce n'est pas ce que je recherche puisque je veux faire un tri sur la date.

Pour le if à la plus du while, tu as complètement raison, j'étais perdu dans mes idées, voilà ce que je pensais faire à la base (mes tables s'appellent News et Beer) :
$i=0;
$j=0;
do {
if ($row_News["date_post"] > $row_Beer["date_post"]) {
echo $row_News["titre"];
$i++;
//.. amener le pointeur sur le ième enregistrement de News
}
else {
echo $row_Beer["nom"];
$j++;
//.. amener le pointeur sur le jème enregistrement de Beer
}
} while ((i+j)<8) ;

Je pensais qu'il était possible de trouver une fonction qui face pointer sur l'enregistrement suivant (n° i ou j ici) mais je ne trouve pas... Si quelqu'un a eu idée, ou alors une solution entièrement différente, je reste preneur...

merci beaucoup
0
Bonjour
Je pensais qu'il était possible de trouver une fonction qui face pointer sur l'enregistrement suivant
Cette fonction existe, c'est mysql_fetch_array(). Elle sert très exactement à ça !

Mais je pense que tu vas avoir un autre problème, c'est de gérer qu'une des deux listes est épuisée avant L'autre. Tu peux t'en sortir de deux manières, l'une d'elles est de forcer une valeur bidon (très grand ou très petite, à toi d'y réfléchir...) quand une des listes de réponses est épuisée (mysqlèfetch_array te rend false)
0
Alphatrion Messages postés 12 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 17 février 2014 10
27 janv. 2010 à 15:19
Ok, merci le père, l'espoir renait...
j'ai lu un peu la doc sur mysql_fetch_array et je n'ai apparemment pas compris exactement comme s'en servir puisque tout ce que j'ai réussi à faire, c'est planter mon navigateur :-s

De ce que j'ai compris (arrêtez moi si je me trompe), ce n'est pas la peine de lui donner mon entier $j ou $i : il incrémente tout seul à la ligne suivante ?

et cette fonction retourne un tableau que je stock et interroge ensuite...

voici mon code pour le moment (et qui ne marche pas, j'ai laissé les i et j et le while pour que ça ressemble à l'exemple au dessus, mais je peux à priori avoir juste un i et un if comme conseillé par zcrew... :
do {
if ($row_News["date_post"] > $row_Beer["date_post"]) {
$row = mysql_fetch_array($News, MYSQL_BOTH);
echo $row["titre"];
$i++;
}
else {
$row = mysql_fetch_array($Beer, MYSQL_BOTH);
echo $row["nom"];
$j++;

}
} while ((i+j)<9) ;

où est mon erreur ??!

Sinon, pas de problème prévu d'épuisement de liste ;) : je ne veux afficher qu'une dizaine d'enregistrement en tout, donc mes requetes sql récupèrent 10 enregistrement dans chaque liste, et j'affiche uniquement les 10 plus récentes parmi ces 20...

merci
0
ça manque de logique...
tu compares $row_News[..] et $row_Beer[..]
mais quand tu passes à l'enregistrement suivant tu appelles tout le monde $row !
De plus, tu fais le 'echo' après être passé à l'enregistrement suivant alors qu'il faudrait le faire avant
Et comme je l'ai déjà évoqié dans ton message précédent, une de tes listes va s'épuiser avant l'autre. Dans ce cas, mysql_fetch_array va te rendre FALSE, donc l'un de tes $row ne sera plus un tableau et donc $row_News["date_post"] ou $row_Beer ["date_post"] ne voudront plus rien dire, pas question de faire une comparaison avec.
Je me penche un peu plus en détail et je re-poste
0
Je ne sais pas si c'est volontairement que tu affiches le champ "titre" pour une de tes requêtes et le champ "nom" pour l'autre, mais j'ai respecté.
<?php

// initialisation avant balayage
$row_News = mysql_fetch_array($News, MYSQL_BOTH);
$row_Beer = mysql_fetch_array($Beer, MYSQL_BOTH);
$NewsPasFini=($row_News !== false);
$BeerPasFini=($row_Beer !== false);

while ( $NewsPasFini || $BeerPasFini)) {

// prise de décision
  $AfficherNews=False;

  if ($NewsPasFini && $BeerPasFini) {                    // si les 2 listes pas finies
    if ($row_News["date_post"] > $row_Beer["date_post"]) 
      AfficherNews=True;
  } else if ($NewsPasFini) $AfficherNews=True;          // s'il ne reste que des news

// affichage
  if ($AfficherNews) {
    echo $row_News["titre"];
    $row_News = mysql_fetch_array($News, MYSQL_BOTH);
    $NewsPasFini=($row_News !== false);
  } 
  else {
    echo $row_Beer["nom"];
    $row_Beer = mysql_fetch_array($Beer, MYSQL_BOTH);
    $BeerPasFini=($row_Beer !== false);
  } 
} // while 

?>

Je n'ai pas testé. Et ça suppose que tes deux requêtes trient déjà les dates dans le bon ordre !
0
ça commence bien...
une parenthèse de trop à droite de $BeerPasFini
while ( $NewsPasFini || $BeerPasFini) {
0
Alphatrion Messages postés 12 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 17 février 2014 10
27 janv. 2010 à 17:25
En effet, j'avais du oublier mon cerveau tout à l'heure (d'ailleurs ce ne sont pas mes tables qui s'appellent News et Beer mais les résultats de ma requete)...
J'ai changé deux trois trucs et ça a l'air de bien marcher... je vais quand même regarder ton code le père et voir s'il faut que je change des trucs

voici mon code qui a l'air de marcher :

$row_beer=$row_Beer;
$row_news=$row_News;
for ($i = 0 ; $i < 10 ; $i++) {
if ($row_news["date_post"] > $row_beer["date_post"]) {
echo row_news["titre"];
$row_news = mysql_fetch_array($News, MYSQL_BOTH);

}
else {
echo row_beer["nom"];
$row_beer = mysql_fetch_array($Beer, MYSQL_BOTH);
}
} ;
je vais essayer de réimplanter ça avec tous les affichages et fonction à la place du echo simple en espérant que ça reste ok... je vous tiens au jus
merci bien à tous et sur au père !
0