Requête MySQL et affiche par boucle While (PHP)

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 : Requête MySQL et affiche par boucle While (PHP)

par NesheK » 03 août 2008, 18:58

Zeus -> Oui désolé, je vais m'inscrire ! En tous cas le forum est déjà dans mes favoris !! :D

par zeus » 03 août 2008, 18:21

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

par Berzemus » 03 août 2008, 18:06

Super, bravo :wink:

par NesheK » 03 août 2008, 15:43

J'ai réussi !!

Voici la source, si ça put servir à quelqu'un ! En fait il ferme le tableau avant d'afficher l'année de l'album suivant et non pas après avoir afficher le dernier titre de l'album en cour !
<?php 

require("../admin/dbconnect.php");

$requete = mysql_query('SELECT annee, album, numero, titre, artiste, image FROM lyrics ORDER BY annee, artiste, album, numero ASC') OR die('Erreur de la requête MySQL');
mysql_close(); 

//on lance la boucle
while($resultat = mysql_fetch_object($requete)) 
{ 

//si l'album est différent, on termine le tableau
if (isset($album_precedent) && $resultat->album!=$album_precedent)  
  { 
  echo '</td></tr></tbody></table><br><br>'; 
  }

//si l'année est différente, on l'affiche 
if ($resultat->annee!=$annee_precedente) { 
echo $resultat->annee.' : '; 
} 

//si l'album est différent du précédent, on l'affiche 
if ($resultat->album!=$album_precedent) { 
echo '<a onclick=\'switchMenu(\''.$resultat->album.'\');\'>'.$resultat->album.'</a><div id='.$resultat->album.'><br><table style=\'text-align: left; width: 100%;\' border=1 cellpadding=2 cellspacing=0><tbody><tr><td
 style=\'width: 200px; vertical-align: top;\'><div
 id="picture">'; 
} 

//si l'image est différente, on l'affiche 
if ($resultat->image!=$image_precedente) { 
echo'<a href='.$resultat->image.' rel=lightbox><img src='.$resultat->image.' /></a></div></td><td style=\'vertical-align: top;\'>';
}

//si le titre est différent, on l'affiche
if ($resultat->titre!=$titre_precedent) {
echo $resultat->numero.'. '.$resultat->titre.'<br>';
}


//on redéfinit les variables pour le prochain tour de boucle 
$annee_precedente=$resultat->annee; 
$image_precedente=$resultat->image;
$titre_precedent=$resultat->titre;
$album_precedent=$resultat->album; 

} 
?>
Bon voilà, le plus gros est fait, reste à peaufiner !! Merci à tous pour votre aide.

par NesheK » 03 août 2008, 15:32

Voilà ce que j'ai essayé ça n'a pas été concluant !
<?php 

require("../admin/dbconnect.php");

if (isset($album_precedent)) {
$complement='WHERE album='.$album_precedent;
}
else {
$complement='';
}

$text_req='SELECT annee, album, numero, titre, artiste, image FROM lyrics ORDER BY annee, artiste, album, numero ASC '.$complement;
$requete = mysql_query($text_req) OR die('Erreur de la requête MySQL');

$i=0;

//on lance la boucle
while($resultat = mysql_fetch_object($requete)) 
{ 

if (isset($album_precedent)) {
$nb_pistes=mysql_num_rows($requete);
}

//si l'année est différente, on l'affiche 
if ($resultat->annee!=$annee_precedente) { 
echo $resultat->annee.' : '; 
} 

//si l'album est différent du précédent, on l'affiche 
if ($resultat->album!=$album_precedent) { 
echo '<a onclick=\'switchMenu(\''.$resultat->album.'\');\'>'.$resultat->album.'</a><div id='.$resultat->album.'><br><table style=\'text-align: left; width: 100%;\' border=1 cellpadding=2 cellspacing=0><tbody><tr><td
 style=\'width: 200px; vertical-align: top;\'><div
 id="picture">'; 
} 

//si l'image est différente, on l'affiche 
if ($resultat->image!=$image_precedente) { 
echo'<a href='.$resultat->image.' rel=lightbox><img src='.$resultat->image.' /></a></div></td><td style=\'vertical-align: top;\'>';
}

//si le titre est différent, on l'affiche
if ($resultat->titre!=$titre_precedent) {
echo $resultat->numero.'. '.$resultat->titre.'<br>';
$i++;
}

$j = $i+2;

//si l'album est différent, on termine le tableau
if (isset($album_precedent) && ($j=$nb_pistes))  
  { 
  echo '</td></tr></tbody></table><br><br>'; 
  }


//on redéfinit les variables pour le prochain tour de boucle 
$annee_precedente=$resultat->annee; 
$image_precedente=$resultat->image;
$titre_precedent=$resultat->titre;
$album_precedent=$resultat->album;

if ($resultat->album!=$album_precedent) {
$i=0;
} 

} 
?>
En fait je ne sais pas comment faire pour qu'il compte tout seul le nombre de morceaux d'un album (correspond au nombre de résultat pour un album donné). Est-il possible de faire quelque chose comme :
<?php 
$requete='SELECT * FROM table ORDER BY xxx';
$sql=mysql_query($requete);
$nb_resu=mysql_num_rows($sql WHERE album = $resultat->album);

echo $nb_resu
?>
Sinon, HEEELP !! :S

Merci par avance,
@micalement,
NesheK. :D

par NesheK » 03 août 2008, 13:03

Effectivement, il faudrait que j'obtienne le nombre total de morceaux par album et que pour chaque album il ferme le tableau lorsqu'il a affiché le dernier morceau.

Mais je ne vois pas comment faire !! :S

Un exemple ? :oops:

Merci ! :D

par Berzemus » 03 août 2008, 11:18

Un truc simple est d'utiliser un compteur..
$i=0;
while (truc)
  {
  $i++;
  echo $i;
  }
c'est une façon de faire. Tu pourrais aussi obtenir le nombre total de morceaux par album dans ta requête SQL.

par NesheK » 03 août 2008, 10:47

Je pense que la solution résiderait dans quelque chose comme :
on compte le nombre de résultats pour un album donné et lorsque la ligne qui est affichée a un numéro égal à $total_resultats_pour_album_donne, on ferme le tableau.

Je ne sais pas si je me suis très bien expliqué, et je n'ai aucune idée de comment écrire cela ! :S

Comment récupérer le numéro de ligne du tableau qui est affichée dans la boucle while ?

Merci à vous pour votre aide.

@micalement,
NesheK.

par NesheK » 03 août 2008, 10:34

Bonjour,

Merci pour vos réponses. :D

Berzemus, effectivement cela marche pas mal mais le problème est le suivant : il ferme le tableau lorsque le nom de l'album change, autrement dit il me ferme le tableau après le premier titre du deuxième album, puis après le premier titre du troisième album, etc... logique ! Sauf qu'il faudrait qu'il ferme juste avant, c'est à dire juste après le dernier titre du premier album, juste après le dernier titre du second album, etc...

Le résultat ici : http://www.niktamere.fr/tests/test.php

Aurais-tu une idée ? :S

Merci par avance ! :D

@micalement,
NesheK.

par Berzemus » 03 août 2008, 10:12

Faire des variables vides, c'est tout à fait inutile.

Il te suffit d'améliorer un peu tes conditions, en vérifient d'abord l'existence de la variable, comme ceci:
if (isset($album_precedent) && $resultat->album!=$album_precedent) 
  {
  echo '</td></tr></tbody></table><br><br>';
  } 
Et d'effacer la partie "//on définit des variables vides " et le tour est joué.

par Patriboom » 03 août 2008, 03:45

Commence toujours par ôter mysql_close()

Pour le reste, je n'ai pas vraiment regarder le code.

Requête MySQL et affiche par boucle While (PHP)

par NesheK » 02 août 2008, 22:27

Bonjour à toutes et tous,

Voilà 2h que je tourne en rond sur mon problème et j'aurais besoin de votre aide précieuse. :D

Voici le code, je donnerai plus bas les détails du problème ainsi qu'un lien permettant de voir ce que me retourne le script :
<?php 

require("../admin/dbconnect.php");

$requete = mysql_query('SELECT annee, album, numero, titre, artiste, image FROM lyrics ORDER BY annee, artiste, album, numero ASC') OR die('Erreur de la requête MySQL');
mysql_close(); 

//on définit des variables vides
$annee_precedente=""; 
$image_precedente="";
$titre_precedent="";
$album_precedent="";

//on lance la boucle
while($resultat = mysql_fetch_object($requete)) 
{ 

$numero = $resultat->numero;

//si l'année est différente, on l'affiche 
if ($resultat->annee!=$annee_precedente) { 
echo $resultat->annee.' : '; 
} 

//si l'album est différent du précédent, on l'affiche 
if ($resultat->album!=$album_precedent) { 
echo '<a onclick=\'switchMenu(\''.$resultat->album.'\');\'>'.$resultat->album.'</a><div id='.$resultat->album.'><br><table style=\'text-align: left; width: 100%;\' border=1 cellpadding=2 cellspacing=0><tbody><tr><td
 style=\'width: 200px; vertical-align: top;\'><div
 id="picture">'; 
} 

//si l'image est différente, on l'affiche 
if ($resultat->image!=$image_precedente) { 
echo'<a href='.$resultat->image.' rel=lightbox><img src='.$resultat->image.' /></a></div></td><td style=\'vertical-align: top;\'>';
}

//si le titre est différent, on l'affiche
if ($resultat->titre!=$titre_precedent) {
echo $resultat->numero.'. '.$resultat->titre.'<br>';
}

//si l'album est différent, on termine le tableau <- PROBLEME A CE NIVEAU
if($resultat->album!=$album_precedent) {
echo '</td></tr></tbody></table><br><br>';
}


//on redéfinit les variables pour le prochain tour de boucle 
$annee_precedente=$resultat->annee; 
$image_precedente=$resultat->image;
$titre_precedent=$resultat->titre;
$album_precedent=$resultat->album;

} 
?>
Avant d'entrer dans les détails, voici l'adresse du script permettant de voir réellement le résultat : Cliquez ici.

Le but est d'afficher la playlist d'un album et son cover dans un tableau précédé de l'année et du titre de l'album. Le problème est que le tableau est "fermé" avant que toute la trackinglist de l'album concerné y soit insérée.

Je pense que cela vient du fait que je définis une variable vide
$album_precedent="";
puis que j'ordonne de fermer le tableau lorsque la requête retourne un titre d'album différent du précédent :
if($resultat->album!=$album_precedent) {
echo '</td></tr></tbody></table><br><br>';
}
Que la variable $album_precedent soit définie comme vide ou même qu'elle ne soit pas défini du tout, le résultat de la requête est forcément différent donc le tableau se retrouve fermé.

Je n'ai aucune idée de comment faire autrement... :( Je voudrais que le tableau soit fermé une fois que tous les titres d'un album y ait été inséré puis qu'un nouveau tableau recommence pour l'album suivant et ainsi de suite.

Je me permets donc de faire appel à vous, d'autant plus que le site doit être bouclé dans 15 jours et que je suis loin d'avoir fini. :(

En vous remerciant par avance,
Bien cordialement,
Robin.