Requete dans requete... - PHP - Programmation
Marsh Posté le 03-09-2006 à 04:18:21
elliotdoe a écrit : Bonsoir à tous, j'ai un léger problème en PHP.
|
Tu utilises deux fois $mysql_result dans ton imbrication. Remplace par $mysql_result2 et ca devrait marcher. N oublie pas les mysql_free_result !
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.
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.
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é.
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...
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
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
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.
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 |
details_utilisateurs.php :
Citation : |
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.
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.
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 :
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...
Marsh Posté le 03-09-2006 à 16:46:09
Pourquoi ne fais tu pas un select sur les deux tables en même temps ?
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.
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 ?
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 ...
Marsh Posté le 03-09-2006 à 19:53:23
J'y suis arrivé, non sans mal
Voilà ce que donne ma requête au final :
Citation : |
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
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 :
|
Il faut eviter les requetes SQL ( comme on en voit trop ) de 15 lignes !
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
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
Marsh Posté le 04-09-2006 à 23:38:50
Citation : |
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)
Marsh Posté le 04-09-2006 à 23:59:54
Citation : |
Lol je parle pas des fenêtres
... mais de mettre des indexes dans une base de données.
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 :
<?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 '"> </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">';
$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
Message édité par elliotdoe le 03-09-2006 à 01:09:00