Page 1 sur 1
Problème de traitement de requetes
Posté : 22 janv. 2008, 13:07
par myself_o
Bonjour tout le monde,
Je code un intranet pour une petite entreprise en php, me servant d'une bdd sql.
J'ai un problème avec le code suivant :
//$sql contient la requete principale
$sql='SELECT * FROM chantier WHERE chantier_etat = "encours" ORDER BY chantier_ID';
//Envoi de la requete
$retour=mysql_query($sql);
//boucle permettant de parcourir chaque enregistrement dela requete
while ($data=mysql_fetch_array($retour)){
//Création d''une nouvelle requete + envoi
$sql="SELECT * FROM client WHERE client_ID = ".$data['client_ID'];
$req=mysql_query($sql);
//stockage du résultat dans $rowClient
$rowClient = mysql_fetch_object($req);
//affichage des résulats
echo 'Client : '.$rowClient->client_nom.'<br>Adresse du chantier : '.$data['chantier_rue'].' '.$data['chantier_CP'].' '.$data['chantier_ville'].'<br>';
echo '<a href="http://192.168.0.222/chantiers/chantier_'.$rowClient->client_nom.$data['chantier_ID'].'.php>
Voir fiche chantier</a><br><br>';
}
Mon problème est que seulement la moitié des résulats s'affichent par rapport a ce que je voudrai, comme si lorsque je lançai la seconde requete (a l'interieur de la boucle), ça me déplaçai le pointeur de la première.
Voyez vous où se situe le problème ? ou y a-t-il une fonction pour faire revenir le pointeur en arrière ?
Merci pour votre aide...
Posté : 22 janv. 2008, 13:14
par Ryle
Pas vraiment d'explication à ton soucis, je vois pas ce qui peut clocher... par contre, plutôt que de refaire n requête dans ta boucle, pourquoi ne pas faire une seule requête avec une jointure et ainsi limiter le nombre de requêtes envoyées au serveur

Posté : 22 janv. 2008, 14:10
par myself_o
Bon ben je vais essayer avec ta solution, en espérant que j'arrive a faire la bonne requete >.<.
Mais j'aurai bien aimé savoir au moins pourquoi ça marche pas.
Merci quand même !
Posté : 22 janv. 2008, 14:37
par Ryle
Disons qu'il vaut mieux éviter de mettre une requête à l'intérieur d'une boucle dont on ne maitrise pas le nombre d'occurence... maintenant on peut quand même essayer de comprendre pourquoi ça ne fonctionne pas
Affiche ce que retourne un mysql_num_rows($result); avant d'entrer dans ta boucle et regarde si tu as bien autant d'enregistrements retournés par ta requête que de lien affichés...
Posté : 22 janv. 2008, 14:48
par Myself_o
oui j'ai fais ce test déjà, mysql_num_rows() me renvoie bien le bon nombre d'enregistrement ( a savoir 2).
Mais ça ne m'en affiche qu'un !
si j'ai 4 enregistrement, mysql_num_rows() vaut 4, mais ça m'en affiche que 2.
C'est pour ça que je pensais que lorsque je me sers de la seconde requete grâce à mysql_fetch_object(), ça faisait pointer le pointeur (!) sur l'enregistrement suivant.
Et j'ai fais le tour des autres fonctions disponibles, j'ai pas trouvé mon bonheur...
Posté : 22 janv. 2008, 15:09
par Myself_o
Je viens d'essayer avec la requete :
$sql = 'SELECT * FROM chantier, client WHERE chantier.client_ID = client.client_ID AND chantier_etat = "devis" ORDER BY chantier_ID';
et donc en enlevant la seconde requete et en me servant que de celle là, et le résultat est le même.
La je me pose vriament des questions étant donné que j'en ai fais plein des affichages dans ce genre dans d'autres pages...
Si tu / vous voyez ce qui pourrai provoquer ça...
Posté : 22 janv. 2008, 15:26
par Ryle
vraiment bizare.... et si tu joues la nouvelle requête dans MySQL ou phpMyAdmin, t'obtiens le bon résultat ? Montre nous éventuellement le nouveau code, tu as peut être mysql_fetch en trop qui traine ?
Posté : 22 janv. 2008, 15:34
par d0m
essaies voir en faisnt une première requête qui selectione les identifiants de clients et en stockant ceux ci dans un tableau
Ensuite faire une seule deuxième requête qui va chercher les clients dont l'identifiants est dans l'énumération du contenu du tableau.
$id_clients = array();
$sql='SELECT client_ID FROM chantier WHERE chantier_etat = "encours" ORDER BY chantier_ID';
//Envoi de la requete
$retour=mysql_query($sql);
//boucle permettant de parcourir chaque enregistrement dela requete
while ($data=mysql_fetch_array($retour)){
$id_clients[] = $retour|'client_ID'];
}
$sql="SELECT * FROM client WHERE client_ID IN (".implode(','$id_clients).")";
$req=mysql_query($sql);
En plus cela te permet de faire 2 requêtes quelque soit le nombre de clients retourné par la première requête.
Posté : 22 janv. 2008, 15:38
par Myself_o
Jvais vais mettre la page entière, au cas où y ai un truc qui aille pas :
<?php
//Connection au serveur mySQL
$result=mysql_connect('127.0.0.1','$usr','monpw');
if ($result==FALSE)
echo "Impossible de se connecter au Serveur mySQL";
else {
//Selection de la base
$result=mysql_select_db('fpcmazzer');
if ($result==FALSE)
echo "Probleme de connection mySQL : mauvais nom de base de donnée";
else {
// sql contient la requete principale
$sql = 'SELECT * FROM chantier, client WHERE chantier.client_ID = client.client_ID AND chantier_etat = "devis"';
//Envoi de la requete
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
//boucle permettant de parcourir chaque enregistrement dela requete
while ( $data=mysql_fetch_array($req) ) {
//affichage des résulats
//Si je met : "echo $data['client_nom'].'<br>';" , ça m'affiche le bon nombre de fois les nom des clients
//Tandis que dans le code qui suit, ça m'en met que la moitié ( mieu : ça m'en affiche 1 sur 2 selon l'ordre présenté dans phpmyadmin )
echo 'Client : '.$data['client_nom'].'<br>Adresse du chantier : '.$data['chantier_rue'].' '.$data['chantier_CP'].' '.$data['chantier_ville'].'<br><a href="http://192.168.0.222/chantiers/chantier_'.$data['client_nom'].$data['chantier_ID'].'.php>Voir fiche chantier</a><br><br>';
}
echo "</body>";
}
}
mysql_close();
?>
Posté : 22 janv. 2008, 15:59
par Ryle
Aïta !!
Le compte est bon, regarde le code source de ta page
Le problème vient de l'absence des guillemets finale de l'attribut href="" dans ton lien. Du coup il considère que le lien n'est pas terminé et colle tout le reste dans la balise...

Posté : 22 janv. 2008, 16:07
par Myself_o
comment on dit déjà ? ah oui ! "OMG "
Merci infiniment a toi, tu m'enleves un pieu de l'orteil là...
Perdre 3 heures pour des guillemets, heureusement qu'ils suivent pas ce que je fais dans ma boite.............
Merci encore ; )
Posté : 22 janv. 2008, 16:51
par Ryle
lol
Certes, mais d'un autre côté t'en a profité pour bien optimisé le code, et pour ça, on perds jamais assez de temps

(ouéé ben on sait jamais, ça peut passer comme argument

)
Je passe le sujet en résolu puisque tu l'as posté en tant qu'invité. N'hésites pas à t'inscrire pour pouvoir le faire toi même les prochaines fois
