VIVEZ LE
FOOTBALL !

Posez votre question Signaler

Php:afficher résultat requête sql sans while [Résolu]

Alphatrion 10Messages postés 5 mai 2009Date d'inscription 28 juin 2011Dernière intervention - Dernière réponse le 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 ?
Lire la suite 

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

11 réponses
Réponse
+0
moins plus
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?
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
ç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
Ajouter un commentaire
Réponse
+0
moins plus
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 !
Ajouter un commentaire
Réponse
+0
moins plus
ça commence bien...
une parenthèse de trop à droite de $BeerPasFini
while ( $NewsPasFini || $BeerPasFini) {
Ajouter un commentaire
Réponse
+0
moins plus
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 !
Ajouter un commentaire
Réponse
+0
moins plus
Ç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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Ce document intitulé « php:afficher résultat requête sql sans while » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?