Requete dans requete...

Requete dans requete... - PHP - Programmation

Marsh Posté le 03-09-2006 à 01:08:15    

Bonsoir à tous, j'ai un léger problème en PHP.
 
Je suis dans une boucle qui affiche une liste de messages postés par des utilisateurs, sous forme de tableaux.
Les informations des messages sont dans la table SQL "messages".
 
Dans cette boucle, je crée une colonne de gauche, où je souhaite insérer des informations sur l'utilisateur qui a posté le message. Les informations de l'utilisateur sont stockées dans la table "utilisateur".
 
 
Le problème, c'est qu'en étant déjà dans une boucle while, je ne sais pas lancer de nouvelle requête pour aller chercher les informations concernant l'utilisateur...
 
Je suis débutant en php/SQL, disons que c'est mon premier site important, et que j'ai apprit sur le tas.
Voici le code :
 

Citation :


<?php
include ("../php/connexion_base.php" );
 
$mysql_result = mysql_query("SELECT * FROM messages ORDER By id DESC;" ) or die ("erreur de requete" );
while ($ligne = mysql_fetch_array($mysql_result))
{

//Permet d'inscrire dans la page les liens internes
echo '<table background="../images/ligne.png" border="1" align="center" width="100%" CELLSPACING="0">';
echo '<tbody>';
echo '<TD colspan="6"><A name="repere';
print ($ligne["id"]);
echo '">&nbsp;</A>';
echo '</TD></TR></TABLE>';
 
//Affiche la colonne de gauche
echo '<table background="../images/tableau.png" border="1" align="center" width="100%" CELLSPACING="0">';
echo '<tbody>';
echo '<TR align="center">';
echo '<TD rowspan="5">';
 
 

Citation :

$mysql_result = mysql_query("SELECT * FROM utilisateur WHERE login = \"michael\";" ) or die ("erreur de requete" );
while ($ligne = mysql_fetch_array($mysql_result))
{

echo $ligne["login"];
echo '<BR>';
echo $ligne["date_inscription"];
echo '<BR>';
echo $ligne["nombre_messages"];
}


 
 
echo '</TD><TD>';
//###########################TABLEAU Ligne 1
//Début du code pour "Voter pour ce message"
echo '<form method="post" action="../php/voter.php">';
echo '<input name="id" size="12" value="'; //Pour récupérer l'id du message dans voter.php
echo $ligne["id"];
echo '" maxlength="60" type="hidden">';
 
ETC ETC ETC...


 
 
En gros, je veux faire comme dans les salons style HFR ou Noky : la colonne de gauche, avec les infos sur l'utilisateur (date d'arrivée, ville de résidence, nombre de messages postés...). Merci beaucoup :jap:

Message cité 1 fois
Message édité par elliotdoe le 03-09-2006 à 01:09:00
Reply

Marsh Posté le 03-09-2006 à 01:08:15   

Reply

Marsh Posté le 03-09-2006 à 04:18:21    

elliotdoe a écrit :

Bonsoir à tous, j'ai un léger problème en PHP.
 
Je suis dans une boucle qui affiche une liste de messages postés par des utilisateurs, sous forme de tableaux.
Les informations des messages sont dans la table SQL "messages".
 
Dans cette boucle, je crée une colonne de gauche, où je souhaite insérer des informations sur l'utilisateur qui a posté le message. Les informations de l'utilisateur sont stockées dans la table "utilisateur".
 
 
Le problème, c'est qu'en étant déjà dans une boucle while, je ne sais pas lancer de nouvelle requête pour aller chercher les informations concernant l'utilisateur...
 
Je suis débutant en php/SQL, disons que c'est mon premier site important, et que j'ai apprit sur le tas.
Voici le code :
 

Citation :


<?php
include ("../php/connexion_base.php" );
 
$mysql_result = mysql_query("SELECT * FROM messages ORDER By id DESC;" ) or die ("erreur de requete" );
while ($ligne = mysql_fetch_array($mysql_result))
{

//Permet d'inscrire dans la page les liens internes
echo '<table background="../images/ligne.png" border="1" align="center" width="100%" CELLSPACING="0">';
echo '<tbody>';
echo '<TD colspan="6"><A name="repere';
print ($ligne["id"]);
echo '">&nbsp;</A>';
echo '</TD></TR></TABLE>';
 
//Affiche la colonne de gauche
echo '<table background="../images/tableau.png" border="1" align="center" width="100%" CELLSPACING="0">';
echo '<tbody>';
echo '<TR align="center">';
echo '<TD rowspan="5">';
 
 

Citation :

$mysql_result = mysql_query("SELECT * FROM utilisateur WHERE login = \"michael\";" ) or die ("erreur de requete" );
while ($ligne = mysql_fetch_array($mysql_result))
{

echo $ligne["login"];
echo '<BR>';
echo $ligne["date_inscription"];
echo '<BR>';
echo $ligne["nombre_messages"];
}


 
 
echo '</TD><TD>';
//###########################TABLEAU Ligne 1
//Début du code pour "Voter pour ce message"
echo '<form method="post" action="../php/voter.php">';
echo '<input name="id" size="12" value="'; //Pour récupérer l'id du message dans voter.php
echo $ligne["id"];
echo '" maxlength="60" type="hidden">';
 
ETC ETC ETC...


 
 
En gros, je veux faire comme dans les salons style HFR ou Noky : la colonne de gauche, avec les infos sur l'utilisateur (date d'arrivée, ville de résidence, nombre de messages postés...). Merci beaucoup :jap:


 
 
Tu utilises deux fois $mysql_result dans ton imbrication. Remplace par $mysql_result2 et ca devrait marcher. N oublie pas les mysql_free_result !


Message édité par supermofo le 03-09-2006 à 04:18:58
Reply

Marsh Posté le 03-09-2006 à 10:01:48    

Pour éviter ces problèmes, utilise des noms de variables plus représentatifs de ce qu'ils contiennent :  
$ResultDerniersMessages et $ResultDonneesUtilisateurs par exemple.
Ca a plus de gueule, c'est plus compréhensible et ça évite ces petits problèmes. :)


Message édité par ErnestoLAncien le 03-09-2006 à 10:06:41

---------------
Sonneries, jeux et logos pour téléphones portables
Reply

Marsh Posté le 03-09-2006 à 11:04:52    

Citation :

mysql_free_result


Ca sert à quoi en gros ?
 
Merci pour l'astuce ernesto.
J'ai apprit seul, donc pour l'instant j'ai pas prit de bonnes habitudes :/
Je vais essayer vos conseils, je vous tiens au courant.

Reply

Marsh Posté le 03-09-2006 à 11:13:06    

->>http://fr.php.net/mysql_free_result
En gros, ça supprime tous les résultats obtenus par MySQL.
En effet, si tu as 20000 messages dans la table messages et 50 champs avec pleins de caractères  dans la table membres, à la fin de la boucle tu vas faire chauffer ton serveur.
Donc là, tu fais mysql_free_result et ça libère tout l'espace utilisé.


---------------
Sonneries, jeux et logos pour téléphones portables
Reply

Marsh Posté le 03-09-2006 à 12:24:38    

L'imbrication ne fonctionne pas.
Quand elle affiche la seconde requête, et la première est arrêtée.
 
En gros, elle m'affiche la colonne de gauche, mais pas les messages dans la page principale :/
 
Merci pour le mysql_free_result, je l'ajouterai à la fin de mes requêtes...

Reply

Marsh Posté le 03-09-2006 à 12:28:30    

Bon, ça affiche les deux, faut juste que je règle l'emplacement de l'imbrication parce que ça me fait un truc bizarre, comme s'il y avait plusieurs fois la même page l'une dans l'autre dans l'autre dans l'autre... lol
Merci en tous cas, je vais bosser un peu là dessus, j'devrais pouvoir m'en sortir. Si c'est pas le cas je vous redemanderai :jap:

Reply

Marsh Posté le 03-09-2006 à 12:37:11    

Bon bin fausse joie, j'avais interrompu la première boucle pour insérer la seconde, donc ça affichait le premier message, mais pas les suivants :sweat:

Reply

Marsh Posté le 03-09-2006 à 14:26:06    

On peut voir le code actuel et le résultat s'il te plait ?
Et tu l'as mis où ton mysql_free_result ? Parce que si tu le mets dans la boucle, ça ne t'affichera que le premier message.


---------------
Sonneries, jeux et logos pour téléphones portables
Reply

Marsh Posté le 03-09-2006 à 15:05:31    

Je ne l'ai pas mis encore le free_result, je le ferai en dernier.
Pour l'instant le problème c'est l'imbrication des deux requêtes qui ne fonctionne pas..
 

Citation :

<?php
include ("../php/connexion_base.php" );
 
$mysql_result = mysql_query("SELECT * FROM messages ORDER By id DESC;" ) or die ("erreur de requete" );
 
while ($ligne = mysql_fetch_array($mysql_result))
{

//Permet d'inscrire dans la page les liens internes
echo '<table background="../images/ligne.png" border="1" align="center" width="100%" CELLSPACING="0">';
echo '<tbody>';
echo '<TD colspan="6"><A name="repere';
print ($ligne["id"]);
echo '">&nbsp;</A>';
echo '</TD></TR></TABLE>';
 
//Affiche la colonne de gauche
echo '<table background="../images/tableau.png" border="1" align="center" width="100%" CELLSPACING="0">';
echo '<tbody>';
echo '<TR align="center">';
echo '<TD rowspan="5" class="col-gauche" width="17%">';
 
include ("../php/details-utilisateur.php" );
 
echo '</TD><TD>';
//###########################TABLEAU Ligne 1
 
//Début du code pour "Voter pour ce message"
echo '<form method="post" action="../php/voter.php">';
echo '<input name="id" size="12" value="'; //Pour récupérer l'id du message dans voter.php
echo $ligne["id"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="votes" size="12" value="'; //Pour récupérer le nombre de "votes" (dans la BDD) du message dans voter.php
echo $ligne["votes"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login" size="12" value="'; //Pour récupérer le login du posteur du message, et empêcher l'auto-vote dans voter.php
echo $ligne["login"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login1" size="12" value="'; //Pour récupérer le login de la session ouverte, et empêcher l'auto-vote dans voter.php
echo $_SESSION['user'];
echo '" maxlength="60" type="hidden">';
 
echo '<form method="post" action="../php/voter.php">';
echo '<input name="nombrevote" size="12" value="'; //Pour récupérer le quotas de votes permis par jour dans voter.php
echo $ligne["nombrevote"];
echo '" maxlength="60" type="hidden">';
 
echo '<input type="image" src="../images/voter.png" value="Voter pour ce message" name="envoyer">';
//echo '<input value="Voter pour ce message" name="envoyer" type="submit">';
echo '</FORM>';
echo '</TD><TD>';
//###########################TABLEAU Ligne 1
 
//Début du code pour "Supprimer ce message"
echo '<form method="post" action="../pagesauth/supprimer_message.php">';
echo '<input name="id" size="12" value="'; //Pour récupérer l'id du message dans supprimer_message.php
echo $ligne["id"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login" size="12" value="'; //Pour récupérer le login du posteur du message dans supprimer_message.php
echo $ligne["login"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login1" size="12" value="'; //Pour récupérer le login de la session ouverte dans supprimer_message.php
echo $_SESSION['user'];
echo '" maxlength="60" type="hidden">';
 
echo '<input type="image" src="../images/supprimer.png" value="Supprimer ce message" name="envoyer">';
echo '</FORM>';
echo '</TD><TD>';
//###########################TABLEAU Ligne 1
 
//Début du code pour "Editer ce message"
echo '<form method="post" action="./editer_message.php">';
echo '<input name="id" size="12" value="'; //Pour récupérer l'id du message dans editer_message.php
echo $ligne["id"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login" size="12" value="'; //Pour récupérer le login du posteur du message, et empêcher l'auto-vote dans editer_message.php
echo $ligne["login"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login1" size="12" value="'; //Pour récupérer le login de la session ouverte, et empêcher l'auto-vote dans editer_message.php
echo $_SESSION['user'];
echo '" maxlength="60" type="hidden">';
 
echo '<input type="image" src="../images/editer.png" value="Editer ce message" name="envoyer">';
echo '</FORM>';
echo '</TD><TD>';
//###########################TABLEAU Ligne 1
 
//Début du code pour "Voir les réponses à ce message" //Début du code pour "Poster une réponse à ce message"
echo '<form method="post" action="./reponses_message.php">';
 
echo '<input name="id" size="12" value="'; //Pour récupérer l'id du message dans reponses_message.php
echo $ligne["id"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login" size="12" value="'; //Pour récupérer le login du posteur du message dans reponses_message.php
echo $ligne["login"];
echo '" maxlength="60" type="hidden">';
 
echo '<input name="login1" size="12" value="'; //Pour récupérer le login de la session ouverte dans reponses_message.php
echo $_SESSION['user'];
echo '" maxlength="60" type="hidden">';
 
echo '<input type="image" src="../images/reponses.png" value="Voir les réponses ou Poster une réponse" name="envoyer">';
echo '</FORM>';
echo '</TD><TD>';
//###########################TABLEAU Ligne 1
 
//Début du code pour afficher le total des votes
echo '<A href="" class="a6"><FONT color="990000">Votes&nbsp;&nbsp;&nbsp;&nbsp;</FONT><FONT color="EA2300">'.($ligne["votes"])."</FONT></A>";
echo '</TD></TR>';
//###########################FIN TABLEAU LIGNE 1
 
 
 
 
//###########################DEBUT TABLEAU Ligne 2
echo '<TR align="center">';
echo '<td colspan="5">';
print "<FONT color=\"990000\"><B>Posteur :&nbsp;</FONT><FONT color=\"EA2300\">".($ligne["login"])."&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;</FONT>";
print "<FONT color=\"990000\">Date :&nbsp;</FONT><FONT color=\"EA2300\">".($ligne["date"])."&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;</FONT>";
print "<FONT color=\"990000\">Heure :&nbsp;</FONT><FONT color=\"EA2300\">".($ligne["heure"]);
echo '</FONT></B></TD></TR>';
 
//###########################DEBUT TABLEAU Ligne 3
echo '<tr align="center">';
echo '<td colspan="5">';
print "<FONT color=\"990000\"><B>Sujet :&nbsp;</FONT><FONT color=\"EA2300\">".($ligne["sujet"]);
echo '</FONT></B></TD></TR>';
 
//###########################DEBUT TABLEAU Ligne 4
echo '<tr align="center">';
echo '<td colspan="5"><B><FONT color="EA2300">';
print ($ligne["texte"]);
echo '</FONT></B></TD></TR>';
 
//###########################DEBUT TABLEAU Ligne 5
echo '<tr align="center">';
echo '<td colspan="5">';
print "<FONT color=\"990000\"><B>Signature :&nbsp;</FONT><FONT color=\"EA2300\">".($ligne["signature"]);
echo '</B></TD></TR>';
 
}
echo '</table>';
?>


 
 
details_utilisateurs.php :

Citation :


<?php
include ("../php/connexion_base.php" );
 
$mysql_result2 = mysql_query("SELECT * FROM utilisateur WHERE login = \"michael\";" ) or die ("erreur de requete" );
while ($ligne = mysql_fetch_array($mysql_result2))
{

echo $ligne["login"];
echo '<BR>';
echo $ligne["date_inscription"];
echo '<BR>';
echo $ligne["nombre_messages"];
echo '</TD>';
}
?>


 
 
 
La seconde requête est dans les crochets de la première.
Le truc, c'est qu'apparemment, ça coupe la première et ça ne lance plus que la seconde.


Message édité par elliotdoe le 03-09-2006 à 16:36:28
Reply

Marsh Posté le 03-09-2006 à 15:05:31   

Reply

Marsh Posté le 03-09-2006 à 15:17:29    

Déjà tu fais deux connexions à la base.
Donc enlève le  
include ("../php/connexion_base.php" );
de details_utilisateur.php
Ensuite : il n'y a rien dans la boucle après l'include ?
 
Voilà, je pense que le probleme vient surtout de la double connexion.


---------------
Sonneries, jeux et logos pour téléphones portables
Reply

Marsh Posté le 03-09-2006 à 16:34:52    

Non ça vient pas de la double connexion àa la base apparemment, ça fait pareil... Sinon, j'édite et je te mets le code en totalité (y en a un paquet par contre...)
 
 
 
Et voilà ce que ça donne :
http://michalatore.free.Fr/fotos/pb-site.png
 
On voit que ça affiche bien les caractéristiques des utilisateurs sur la colonne de gauche, mais aucun message à droite. Le point difficile c'est que la colonne de gauche puise ses infos dans la table utilisateur, et les messages dans la table messages...


Message édité par elliotdoe le 03-09-2006 à 16:39:42
Reply

Marsh Posté le 03-09-2006 à 16:46:09    

Pourquoi ne fais tu pas un select sur les deux tables en même temps ?


---------------
Sonneries, jeux et logos pour téléphones portables
Reply

Marsh Posté le 03-09-2006 à 16:47:46    

Oui tu as raison, c'est ce que j'étais en train de chercher à faire. C'est certainement ma requête qui n'est pas bonne. J'essais, je te tiens au courant.

Reply

Marsh Posté le 03-09-2006 à 16:50:57    

Une question : j'ai plusieurs enregistrements de même nom dans les deux tables. Si je SELECT tous les enregistrements des deux tables, pour les afficher par la suite quelle est la syntaxe ?
 
Pour un champ d'une table je fais : print ($ligne["id"]);
Mais pour un champ dans une table précise ?

Reply

Marsh Posté le 03-09-2006 à 16:56:21    

Utilise la syntaxe SQL:
SELECT champs AS champs_renomme ...
Exemple:
SELECT message.id AS id_message, user.id AS id_utilisateur ...

Reply

Marsh Posté le 03-09-2006 à 19:53:23    

J'y suis arrivé, non sans mal :D
 
Voilà ce que donne ma requête au final :
 

Citation :


$mysql_result = mysql_query("SELECT messages.id AS id, votes, messages.login AS login, messages.sujet AS sujet, messages.texte AS texte, messages.signature AS signature, messages.date AS date, messages.heure AS heure, utilisateur.login AS userlogin, utilisateur.date_inscription AS userdate, utilisateur.nombre_messages AS userposts, utilisateur.id AS userid FROM messages,utilisateur WHERE utilisateur.login = messages.login ;" ) or die ("erreur de requete" );


 
Me restera à penser aux mysql_free_result à la fin de chaque boucle, histoire de pas faire trop souffrir ma machine. Merci beaucoup à vous tous, j'ai apprit bcp de choses sur ce problème :)

Reply

Marsh Posté le 04-09-2006 à 15:07:57    

aie aie aie
Voici quelques conseils qui vont t'aider par la suite:
 
1°) utiliser des tablo 2°) comment 3°) Suivre un schéma dans ton code ( SQL, HTML, sortie, exit ) 4°) travailler en SQL sur les index  
 

Code :
  1. //debut de la page j active le buffer
  2. ob_start("ob_gzhandler" );
  3. // ici je vais prendre les informations LOGIN
  4.  
  5. $fields = array ( 'champs1', ... , 'champsn' );
  6. $requete_login = "SELECT ".implode(", ", $fields)." from truc where machin LIMIT 50";
  7. ...
  8. //ici je vais cherche le pass du user pour verifier si ok
  9. ...
  10. $id = (int)$id;
  11. $requete_pass = "SELECT user_id, pass FROM users WHERE user_id=$id";
  12. //fini SQL on passe au code HTML
  13. @mysql_free_result($mes_resultats);
  14. $html ="<table>..... <tr>$user_name, $post, ... </tr> .....</table>";  //beurk :D
  15. //fini le HTML on print tout
  16. echo $html;
  17. ob_end_flush();
  18. die;


 
Il faut eviter les requetes SQL ( comme on en voit trop ) de 15 lignes !


Message édité par supermofo le 04-09-2006 à 15:10:40
Reply

Marsh Posté le 04-09-2006 à 16:09:11    

Merci je vais me renseigner sur ce que tu me conseilles.
J'ai apprit seul en faisant des patchworks de codes déjà écrits, et du coup j'ai pas les bonnes habitudes. Faut que je corrige tout ça... D'ailleurs, si t'as des sites ou des bouquins à me conseiller, je prends :jap:

Reply

Marsh Posté le 04-09-2006 à 22:50:05    

2 bouquins voir 1 :
 
- facultatif un bouquin de sur le php&sql bestseller
- obligatoire php|architect's Guide to Php security
 
- pour Mysqli prend Pro Mysql de chez Apress
 
Ya beaucoup de matières bon courage

Reply

Marsh Posté le 04-09-2006 à 23:38:50    

Citation :


1°) utiliser des tablo 2°) comment 3°) Suivre un schéma dans ton code ( SQL, HTML, sortie, exit ) 4°) travailler en SQL sur les index  


D'accord sur le principe... maintenant le code proposé est un peu radical. Surtout le <<die>>.
 
Tu soulève un point important: les indexes.
Je conseille vivement à tous ceux qui font des jointures (c'est ainsi que l'on appelle techniquement un SELECT sur plusieurs tables) de se renseigner sur les INDEX. Ils permettent d'accélerer de façon notable les requêtes en lecture (les SELECTs). Sur de grande tables c'est même necessaire. Voir la syntaxe de CREATE INDEX.
 
(j'enfonce des portes ouvertes aujourd'hui)

Reply

Marsh Posté le 04-09-2006 à 23:52:29    

Tu parles de quoi en parlant de portes :D

Reply

Marsh Posté le 04-09-2006 à 23:59:54    

Citation :


Tu parles de quoi en parlant de portes :D


Lol je parle pas des fenêtres :D
... mais de mettre des indexes dans une base de données.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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