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

  FORUM HardWare.fr
  Programmation
  PHP

  Requete dans requete...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requete dans requete...

n°1435803
elliotdoe
Posté le 03-09-2006 à 01:08:15  profilanswer
 

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
mood
Publicité
Posté le 03-09-2006 à 01:08:15  profilanswer
 

n°1435819
supermofo
Hello World !
Posté le 03-09-2006 à 04:18:21  profilanswer
 

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
n°1435829
ErnestoLAn​cien
Posté le 03-09-2006 à 10:01:48  profilanswer
 

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
n°1435837
elliotdoe
Posté le 03-09-2006 à 11:04:52  profilanswer
 

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.

n°1435841
ErnestoLAn​cien
Posté le 03-09-2006 à 11:13:06  profilanswer
 

->>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
n°1435856
elliotdoe
Posté le 03-09-2006 à 12:24:38  profilanswer
 

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

n°1435857
elliotdoe
Posté le 03-09-2006 à 12:28:30  profilanswer
 

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:

n°1435858
elliotdoe
Posté le 03-09-2006 à 12:37:11  profilanswer
 

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:

n°1435886
ErnestoLAn​cien
Posté le 03-09-2006 à 14:26:06  profilanswer
 

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
n°1435909
elliotdoe
Posté le 03-09-2006 à 15:05:31  profilanswer
 

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
mood
Publicité
Posté le 03-09-2006 à 15:05:31  profilanswer
 

n°1435911
ErnestoLAn​cien
Posté le 03-09-2006 à 15:17:29  profilanswer
 

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
n°1435925
elliotdoe
Posté le 03-09-2006 à 16:34:52  profilanswer
 

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
n°1435931
ErnestoLAn​cien
Posté le 03-09-2006 à 16:46:09  profilanswer
 

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


---------------
Sonneries, jeux et logos pour téléphones portables
n°1435932
elliotdoe
Posté le 03-09-2006 à 16:47:46  profilanswer
 

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.

n°1435933
elliotdoe
Posté le 03-09-2006 à 16:50:57  profilanswer
 

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 ?

n°1435935
nargy
Posté le 03-09-2006 à 16:56:21  profilanswer
 

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

n°1435973
elliotdoe
Posté le 03-09-2006 à 19:53:23  profilanswer
 

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

n°1436258
supermofo
Hello World !
Posté le 04-09-2006 à 15:07:57  profilanswer
 

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
n°1436294
elliotdoe
Posté le 04-09-2006 à 16:09:11  profilanswer
 

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:

n°1436494
supermofo
Hello World !
Posté le 04-09-2006 à 22:50:05  profilanswer
 

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

n°1436510
nargy
Posté le 04-09-2006 à 23:38:50  profilanswer
 

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)

n°1436513
supermofo
Hello World !
Posté le 04-09-2006 à 23:52:29  profilanswer
 

Tu parles de quoi en parlant de portes :D

n°1436514
nargy
Posté le 04-09-2006 à 23:59:54  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


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

  Requete dans requete...

 

Sujets relatifs
[ORA] - Optimisation d'une requete[MySQL] Probléme sur requete pas simple !
Oracle : problème requête ! MERGE INTO [RESOL] 2 bugs Oracle de fouUn ptit coup de pouce pour une requête SQL
[Access]Problème de requete dans un formulairerequete sql décalé
requete accessEfficacité requête de mise à jour d'enregistrement
Requête SQL sur des valeurs d'attributs d'un objetRequête sql sous php
Plus de sujets relatifs à : Requete dans requete...


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