[PHP] Problème avec un WHILE :(

Problème avec un WHILE :( [PHP] - Programmation

Marsh Posté le 12-06-2002 à 12:36:34    

Hello a tous  :hello:  
 
Voila, g un probleme, je suis en train de faire un forum, et je suis coincé :)
 
Voila le code :
 

Code :
  1. $sql = "SELECT * FROM forum_categories WHERE idforum='$id'";
  2. $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  3. while ($data = mysql_fetch_array($req))
  4. {
  5. $sql2 = "SELECT dateheure, lastauteur FROM forum_topics WHERE idforum='$id'  AND categorie='$data[id]' ORDER BY dateheure DESC";
  6. $req2 = mysql_query($sql2) or die('Erreur SQL !'.$sql2.'<br>'.mysql_error());
  7. $data2 = mysql_fetch_array($req2);


 
Comme vous pouvez le constater, la 2° requete est dans la boucle WHILE, ce qui a pour consequence de ralentir considérablement l'affichage :(
 
A votre avis, je peux trouver l'id de la categorie (categorie='$data[id]';) sans mettre la 2° requete ds le WHILE ?
 
Je vous remercie :)

Reply

Marsh Posté le 12-06-2002 à 12:36:34   

Reply

Marsh Posté le 12-06-2002 à 12:50:47    

si le resultat de ta 1ere requete ne renvoie qu'une seule ligne tu n'est pas oblige de faire un while, tu mets directos $data = mysql_fetch_array($req);


---------------
All we need is a soul revolution
Reply

Marsh Posté le 12-06-2002 à 12:51:21    

Hello  :hello:  
 
Justement non, je suis obligé de faire un WHILE, car apres c un tableau qui est généré :(

Reply

Marsh Posté le 12-06-2002 à 12:52:13    

:??:
 
ta requete est comme ca:
 $sql = "SELECT * FROM forum_categories WHERE idforum='$id'";  
donc si je suis pas trop con normalement idforum est unique => le resultat de ta requete ne renvoi donc qu'une ligne


Message édité par kayasax le 06-12-2002 à 12:53:37
Reply

Marsh Posté le 12-06-2002 à 12:53:30    

J'ai aussi testé :
 

Code :
  1. $sql = "SELECT * FROM forum_categories WHERE idforum='$id'"; 
  2.   $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  3.   while ($data = mysql_fetch_array($req)) 
  4.      $sql2 = "SELECT dateheure, lastauteur FROM forum_topics WHERE idforum='$id'  AND categorie='$data[id]' ORDER BY dateheure DESC"; 
  5.     $req2 = mysql_query($sql2) or die('Erreur SQL !'.$sql2.'<br>'.mysql_error());
  6.     $data2 = mysql_fetch_array($req2);
  7. {


 
Et :
 

Code :
  1. $sql = "SELECT * FROM forum_categories WHERE idforum='$id'"; 
  2. $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  3. $data3 = mysql_fetch_array($req)
  4. while ($data = mysql_fetch_array($req)) 
  5. {
  6. $sql2 = "SELECT dateheure, lastauteur FROM forum_topics WHERE idforum='$id'  AND categorie='$data3[id]' ORDER BY dateheure DESC"; 
  7. $req2 = mysql_query($sql2) or die('Erreur SQL !'.$sql2.'<br>'.mysql_error());
  8. $data2 = mysql_fetch_array($req2);


 
Aucun ne marche :(

Reply

Marsh Posté le 12-06-2002 à 12:54:12    

tu n'as qu'à faire une jointure (une gauche je crois). tu auras l'id du forum, dateheure et lastposteur tous rangés dans le même tableau, id restant identique tant que tu es dans le même forum (voilà pour la détection des différents forum).
 
cherche left join (ou les join en général si c'est pas ça :D).

Reply

Marsh Posté le 12-06-2002 à 12:54:29    

kayasax a écrit a écrit :

:??:
 
ta requete est comme ca:
 $sql = "SELECT * FROM forum_categories WHERE idforum='$id'";  
donc si je suis pas trop con normalement idforum est unique => le resultat de ta requete ne renvoi donc qu'une ligne  




 
Je me suis peut mal exprimé :)
En gros, en fonction du nombre d'enregistrement dans le champ, y aura le meme nombre de lignes au tablo.
 
Par exemple, ya 6 categories, y aura 6 lignes au tableau :)  [:veryfree]

Reply

Marsh Posté le 12-06-2002 à 12:55:11    

youdontcare a écrit a écrit :

tu n'as qu'à faire une jointure (une gauche je crois). tu auras l'id du forum, dateheure et lastposteur tous rangés dans le même tableau, id restant identique tant que tu es dans le même forum (voilà pour la détection des différents forum).
 
cherche left join (ou les join en général si c'est pas ça :D).  




 
Oki, v aller me renseigner, merchi :)

Reply

Marsh Posté le 12-06-2002 à 12:58:13    

Code :
  1. $sql = "SELECT A.*,B.dateheure,B.lastauteur FROM forum_categories as A LEFT JOIN forums_topics as B ON (B.idforum = A.idforum AND B.categorie = '$id') WHERE A.idforum='$id'"; 
  2.   $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  3.   while ($data = mysql_fetch_array($req)) {
  4. }


a tester, je pense que ca devrai etre bon ceci dit, j'ai pas testé


Message édité par skylight le 06-12-2002 à 12:58:35
Reply

Marsh Posté le 12-06-2002 à 12:59:13    

merchi sky, v tester :)

Reply

Marsh Posté le 12-06-2002 à 12:59:13   

Reply

Marsh Posté le 12-06-2002 à 13:00:26    

Nop, ca marche po, ca m'affiche a chaque fois 4 fois le nom de la categorie :(

Reply

Marsh Posté le 12-06-2002 à 13:01:18    

fais voir la structure de tes tables alors

Reply

Marsh Posté le 12-06-2002 à 13:02:57    

C en gros les memes que celle de ton forum :)
 
CREATE TABLE forum_categories (
  id tinyint(4) NOT NULL auto_increment,
  idforum tinyint(4) NOT NULL default '0',
  nom varchar(50) NOT NULL default '',
  totaltopics smallint(4) NOT NULL default '0',
  totalposts smallint(4) NOT NULL default '0',
  modérateur varchar(50) NOT NULL default '',
  description varchar(255) NOT NULL default '',
  KEY id (id)
) TYPE=MyISAM;
# --------------------------------------------------------
 
#
# Structure de la table `forum_topics`
#
 
CREATE TABLE forum_topics (
  topic int(11) unsigned NOT NULL auto_increment,
  idforum tinyint(4) NOT NULL default '0',
  categorie tinyint(4) NOT NULL default '0',
  icone int(11) default '1',
  titre varchar(100) NOT NULL default '0',
  auteur varchar(50) NOT NULL default '0',
  replys int(11) unsigned NOT NULL default '0',
  views int(11) unsigned NOT NULL default '0',
  dateheure datetime NOT NULL default '0000-00-00 00:00:00',
  lastauteur varchar(50) NOT NULL default '0',
  close tinyint(5) NOT NULL default '0',
  PRIMARY KEY  (topic)
) TYPE=MyISAM;

Reply

Marsh Posté le 12-06-2002 à 13:05:07    

oué l'ancien :D (ptin kes ke c crade :lol:)
 
bon deja il serait bcp + simple que tu recopie les champs dateheure et lastauteur dans forum_categories
 
d'une part ca eviterai une jointure, (qui est tjs + lourd et + lent) et donc ca allege le serveur
 
d'autres part tu as tout en 1 requete ...
 
pour la page principale, mon vrairum ne fait que 2 requetes pour tout avoir (posts, config ...)

Reply

Marsh Posté le 12-06-2002 à 13:06:10    

CREATE TABLE forum_forums (
  id_forum tinyint(2) unsigned NOT NULL auto_increment,
  groupe tinyint(2) unsigned NOT NULL default '0',
  forum varchar(100) NOT NULL default '',
  comment varchar(200) NOT NULL default '',
  password varchar(50) NOT NULL default '',
  nbtopics mediumint(7) unsigned NOT NULL default '0',
  nbtopicsreels mediumint(7) unsigned NOT NULL default '0',
  nbtopics_suppr mediumint(7) unsigned NOT NULL default '0',
  nbposts mediumint(10) unsigned NOT NULL default '0',
  visible tinyint(1) unsigned NOT NULL default '0',
  ordre tinyint(2) unsigned NOT NULL default '0',
  annonce varchar(255) NOT NULL default '',
  dateheure int(11) unsigned NOT NULL default '0',
  lastposteur varchar(50) NOT NULL default '',
  id_lastposteur mediumint(7) unsigned NOT NULL default '0',
  last_post mediumint(10) unsigned NOT NULL default '0',
  last_topic mediumint(7) unsigned NOT NULL default '0',
  last_page mediumint(4) unsigned NOT NULL default '0',
  moderateurs varchar(255) NOT NULL default '',
  level tinyint(2) unsigned NOT NULL default '0',
  level_grp tinyint(1) unsigned NOT NULL default '1',
  afficher_ip tinyint(1) unsigned NOT NULL default '1',
  alert_modo tinyint(1) unsigned NOT NULL default '1',
  avatars tinyint(1) unsigned NOT NULL default '1',
  citation tinyint(1) unsigned NOT NULL default '1',
  signatures tinyint(1) unsigned NOT NULL default '1',
  img_in_posts tinyint(1) unsigned NOT NULL default '1',
  bloquage tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (id_forum),
  KEY ordre (ordre),
  KEY visible (visible),
  KEY groupe (groupe)
) TYPE=MyISAM;


 
:D

Reply

Marsh Posté le 12-06-2002 à 13:06:11    

Oki, v essayer de faire comme ca :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed