Page 1 sur 1

[probleme de boucle]Ecrire un xml avec php

Posté : 07 juin 2005, 21:13
par Invité
Voila je suis pas très fort en php mais on va dire que je me débrouille. J'essaie d'écrire un xml avec php. Php va chercher des données dans des tables mysql et doit en écrire certaines dans mon xml. Mon problème est qu'une boucle ne s'execute qu'une seule fois. Voici mon code php:

Code : Tout sélectionner

<? $table_name = 'sequence_table'; $sql = "SELECT * FROM ".$table_name; $result = mysql_query($sql) or die ("Impossible d'effectuer la requete : ".mysql_error()); $sql_image = "SELECT * FROM image_table Order By chord_id ASC" ; $result_image = mysql_query($sql_image) or die ("Impossible d'effectuer la requete : ".mysql_error()); $sql_fingers = "SELECT * FROM chords_table Order By chord_id ASC" ; $result_fingers = mysql_query($sql_fingers) or die ("Impossible d'effectuer la requete : ".mysql_error()); $num = mysql_num_rows($result); $num_chords = mysql_num_rows($result_image); if ($num != 0) { $file= fopen("xml/chords.xml", "w"); $_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"; $_xml .="<library>\r\n"; //ajout des accords $_xml .="\t<chords>\r\n"; while ($row_chord = mysql_fetch_array($result_image)) { if ($row_chord["chord_id"]) { $_xml .="\t\t<chord chord_name =\"" . $row_chord["chord_name"] . "\" chord_url=\"" .$row_chord["image_src"]. "\" >\r\n"; while($row_fingers = mysql_fetch_array($result_fingers)) { /*------------------------------------------------------- LE PROBLEME SE SITUE DANS LE IF SUIVANT: A CET ENDROIT LE IF EST CENSE VERIFIE SI LES CHORD_ID CORRESPONDENT BIEN ENTRE LES DEUX TABLES ET LE CAS ECHEANT RECUPERER CHORD_FINGER DANS LA PREMIERE TABLE OR IL NE LE FAIT QUE POUR LE 1ER CHORD_ID COMME VISIBLE DANS LE XML.*/ if ($row_fingers["chord_id"] == $row_chord["chord_id"]) { $_xml .="\t\t<finger touch =\"" . $row_fingers["chord_finger"] . "\" />\r\n"; } //------------------------------------------------------- } } $_xml .="\t</chord>"; } $_xml .="\t</chords>"; //ajout des séquences $_xml .="\t<songs>\r\n"; while ($row = mysql_fetch_array($result)) { if ($row["sequence_name"]) { $_xml .="\t\t<sequence name =\"" . $row["sequence_name"] . "\" structure=\"" .$row["sequence_structure"]. "\" src=\"".$row["sequence_loop"]."\" src2=\"".$row["sequence_loop2"]."\" />\r\n"; } else { $_xml .="\t<page title=\"Nothing Returned\">\r\n"; $_xml .="\t\t<file>none</file>\r\n"; } } $_xml .="\t</songs>\r\n"; $_xml .="</library>"; fwrite($file,$_xml); fclose($file); print("<a href='xml/chords.xml'>Voir le XML</a>"); } else { print("No Records found"); } ?>
le xml:

Code : Tout sélectionner

<library> - <chords> - <chord chord_name="C7" chord_url="img/chords/C7.gif"> //LA BOUCLE N EST EXECUTEE QU ICI <finger touch="barred"/> <finger touch="simple"/> <finger touch="simple"/> //------------------------------------------ </chord> <chord chord_name="F7" chord_url="img/chords/F7.gif"> </chord> <chord chord_name="G7" chord_url="img/chords/G7.gif"> </chord> </chords> - <songs> <sequence name="Blues en Do" structure="C7-F7-C7-C7-F7-F7-C7-C7-G7-F7-C7-C7" src="loops/bluesC90bpm.mp3" src2="loops/bluesC130bpm.mp3"/> </songs> </library>
Je n'arrive pas a comprendre d'ou vient mon erreur. Si une bonne ame passe par la et voit mon erreur je lui serait tres reconnaissant :)

Posté : 08 juin 2005, 10:56
par Invité
Personne ne peut m'aider? :(

Je me suis encore énervé dessus hier et j'ai un peu plus ciblé le problème. En fait, il se situe précisément au niveau du
while ($row_chord = mysql_fetch_array($result_image))
Avant la première exécution de cette boucle while, $row_chord n'est pas défini. Mon array est bien fetché :) . Or pour sortir de cette première boucle, la condition est que $row_chord ne soit plus égal à mysql_fetch_array($result_image). Et donc, lorsqu'on revient à ce while,
while ($row_chord = mysql_fetch_array($result_image))
n'est pas exécuté étant donné que la condition n'est plus remplie.

Voiçi ma question plus ciblée:
Comment est que je peux réinitialiser $row_chord en tant que mysql_fetch_array($result_image) ? Lorsque j'essaie de mettre ceci:
$row_chord = mysql_fetch_array($result_image)
while ($row_chord = mysql_fetch_array($result_image)) {
...
}
mon php est correct mais mysql a l'air de ne pas aimer ca du tout et je n'ai pas de réponse de la bdd(si ce n'est "timed out"). :? Franchement, je comprends pas.

Mille mercis à celui qui me répondra, s'il y en a un.

Posté : 11 juin 2005, 21:02
par smarties
C'est un peu a part, ca concerne tes 2 requetes SQL, tu devrais en utiliser 1 seule don remplace :

Code : Tout sélectionner

$sql_image = "SELECT * FROM image_table Order By chord_id ASC" ; $sql_fingers = "SELECT * FROM chords_table Order By chord_id ASC";
Par :

Code : Tout sélectionner

$sql="SELECT DISTINCT * FROM image_table AS i, chords_table AS c WHERE c.chord_id=i.chord_id ORDER BY i.chord_id"
(j'espere ne pas me tromper vu que j'ai l'habitude de bosser avec ORACLE)
Note : c et i sont des alias des tablepour la requete

Comme ca tu n'aura plus besoin de ton if, le SGBD le fait tout seul vu que si j'ai bien compris tu veux qui les lignes qui ont le même chord_id.
Et pour acceder : $row["c.chord_name"];$row["i.image_src"];


C'est une solution alternative qui décharge php d'effectuer la condition et la 2eme boucle.