Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2611 connectés 

  FORUM HardWare.fr
  Programmation

  [PHP] Problème avec un WHILE :(

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Problème avec un WHILE :(

n°157479
Max Evans
Posté le 12-06-2002 à 12:36:34  profilanswer
 

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 :)

mood
Publicité
Posté le 12-06-2002 à 12:36:34  profilanswer
 

n°157486
kayasax
Posté le 12-06-2002 à 12:50:47  profilanswer
 

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
n°157487
Max Evans
Posté le 12-06-2002 à 12:51:21  profilanswer
 

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

n°157488
kayasax
Posté le 12-06-2002 à 12:52:13  profilanswer
 

:??:
 
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
n°157490
Max Evans
Posté le 12-06-2002 à 12:53:30  profilanswer
 

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 :(

n°157491
youdontcar​e
Posté le 12-06-2002 à 12:54:12  profilanswer
 

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).

n°157492
Max Evans
Posté le 12-06-2002 à 12:54:29  profilanswer
 

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]

n°157493
Max Evans
Posté le 12-06-2002 à 12:55:11  profilanswer
 

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 :)

n°157494
skylight
Made in France.
Posté le 12-06-2002 à 12:58:13  profilanswer
 

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
n°157495
Max Evans
Posté le 12-06-2002 à 12:59:13  profilanswer
 

merchi sky, v tester :)

mood
Publicité
Posté le 12-06-2002 à 12:59:13  profilanswer
 

n°157496
Max Evans
Posté le 12-06-2002 à 13:00:26  profilanswer
 

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

n°157497
skylight
Made in France.
Posté le 12-06-2002 à 13:01:18  profilanswer
 

fais voir la structure de tes tables alors

n°157498
Max Evans
Posté le 12-06-2002 à 13:02:57  profilanswer
 

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;

n°157499
skylight
Made in France.
Posté le 12-06-2002 à 13:05:07  profilanswer
 

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 ...)

n°157501
skylight
Made in France.
Posté le 12-06-2002 à 13:06:10  profilanswer
 

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

n°157502
Max Evans
Posté le 12-06-2002 à 13:06:11  profilanswer
 

Oki, v essayer de faire comme ca :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [PHP] Problème avec un WHILE :(

 

Sujets relatifs
[PHP] header()[PHP] Ca veut dire quoi ce message???????
[PHP] Refresh[PHP] Cookies et dépendance
[PHP] Comment supprimer un fichier texte ?problème de "frames"...
[PHP + Cookies] changer la valeur d'un cookiesession PhP / empecher l'acces a une page par "saut d'URL"
Problème de sessions php4 FreeBSD 4.5Editeur PHP à indentation
Plus de sujets relatifs à : [PHP] Problème avec un WHILE :(


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR