Script [PHP -> XML] ne donne qu'un résultat

[Résolu/Fermé]
Signaler
Messages postés
92
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
14 janvier 2015
-
Messages postés
92
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
14 janvier 2015
-
Bonjour,

J'ai un petit problème avec ce script qui me génère bien un xml mais avec un seul "item" en résultat:

Script [PHP -> XML] ne génère qu'un résultat:

Voici le résultat que je souhaite obtenir:

<portfolio>  

 <categories>  
  <category id="cat1">categoriew</category>  
  <category id="cat2">categoriex</category>  
  <category id="cat3">categoriey</category>  
  <category id="cat5">categoriez</category>  
 </categories>  

 <items>  
  <item>  
   <thumbnail>images/img1.jpg</thumbnail>  
   <preview>images/preview.jpg</preview>  
   <category>categoriex</category>  
   <description>Description goes here</description>  
   <description2>Description goes here</description2>  
  </item>  
  <item>  
   ... 
  </item>  
<item>  
   ... 
  </item>  


Et voici mon script:
$rst = mysql_query("SELECT a,b,c,d,e DATE_FORMAT(date.date, '%d/%m/%Y') as date FROM a,b,c  ORDER BY date_added DESC LIMIT 9");  
$productCount = mysql_num_rows($rst);  
if ($productCount > 0) {  
  while($row = mysql_fetch_array($rst)){  
             $id = $row["id"];  
    $category = $row["category"];  
    $product_name = $row["item_name"];  
    $date = $row["date"];  
    $price = $row["time"];  
    $nom = $row["nom"];  
    $photo = $row["photo"];  
    $date_added = strftime("%V,%G,%Y", strtotime($row["date_added"]));  
     
$xml = '<?xml version="1.0" encoding="UTF-8"?>' ;  
$xml .= '<portfolio>' ;  
$xml .= '  
<categories>  
<category id="cat1">categoriew</category>  
<category id="cat2">categoriex</category>  
<category id="cat3">categoriey</category>  
<category id="cat4">categoriez</category>  
</categories>' ;  

$xml .= '<items>' ;  
   
while($row = mysql_fetch_array($rst)){  
$xml .= '  

<item>  
<thumbnail>storeadmin/images/'.$photo.'</thumbnail>  
<preview>images/preview.jpg</preview>  
<category>'.$category.'</category>  
<description>'.$item_name.'</description>  
<description2>'.$time.'</description2>  
</item>' ;  
}  
   
$xml .= '</items></portfolio>' ;  
file_put_contents('data.xml', $xml) ;}}  


Qu'ai-je fait au dieu du php pour que ça ne marche pas????

6 réponses

Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
893
<?php
$rst = mysql_query("SELECT a,b,c,d,e DATE_FORMAT(date.date, '%d/%m/%Y') as date FROM a,b,c ORDER BY date_added DESC LIMIT 9");
//etrange ta requette
/*
tu mets SELECT champs a,b,c,d,e alors que dans ta boucle while tu utilises les noms de champs categorie, item_name etc..
tu fais un DATE_FORMAT sur le champ date apparemnt mais tu lui attribue l'alias date ? il faudrait un autre nom date_f par ex
tu mets FROM a,b,c comme nom de table ?
et ton ORDER BY sur le champ date_added
*/
$productCount = mysql_num_rows($rst);
if ($productCount > 0) {
while($row = mysql_fetch_array($rst)){
$id = $row["id"];
$category = $row["category"];
$product_name = $row["item_name"];
$date = $row["date"];
$price = $row["time"];
$nom = $row["nom"];
$photo = $row["photo"];
$date_added = strftime("%V,%G,%Y", strtotime($row["date_added"]));

$xml = '<?xml version="1.0" encoding="UTF-8"?>' ; //a mon avis cette ligne devrait être en dehors de ta boucle while
$xml .= '<portfolio>' ;
$xml .= '
<categories>
<category id="cat1">categoriew</category>
<category id="cat2">categoriex</category>
<category id="cat3">categoriey</category>
<category id="cat4">categoriez</category>
</categories>' ;

$xml .= '<items>' ;
//le poniteur a la fin de la première boucle while est en fin des lignes extraites
//si tu fais une autre boucle il faut remettre le pointeur au début
//mysql_data_seek($rst) ferait l'afaire, mais si tu es en php5.5 cette fct est dépréciée donc vas voir:
//https://www.php.net/manual/fr/mysqli-result.data-seek.php

while($row = mysql_fetch_array($rst)){
$xml .= '

<item>
<thumbnail>storeadmin/images/'.$photo.'</thumbnail>
<preview>images/preview.jpg</preview>
<category>'.$category.'</category>
<description>'.$item_name.'</description>
<description2>'.$time.'</description2>
</item>' ;
}

$xml .= '</items></portfolio>' ;
file_put_contents('data.xml', $xml) ;}}
Messages postés
92
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
14 janvier 2015
1
Oui, j'ai grandement simplifié les requêtes sql parce qu'il y en a en fait, beaucoup plus avec des croisements et je voulais simplifier le problème car je sais que mes requêtes fonctionnent.

J'étudie tout de suite te réponse et je reposte un résultat! ^^
Messages postés
92
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
14 janvier 2015
1
Bon et bien c'est le point mort. j'ai tenté avec mysql_data_seek($rst) ainsi que mysql_fetch_array mais ça ne fonctionne pas plus.

Je vois bien que j'ai un problème avec ces 2 "while" mais je ne vois pas comment procéder autrement?

Suis-je parti dans la bonne direction?
Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
893
il y a aussi une grosse erreur:

si tu mets dans la première boucle while:
$xml = '<?xml version="1.0" encoding="UTF-8"?>' ;


à chaque fois que tu vas passer dans la boucle ça va écraser le contenu de la variable $xml

donc en fait tu n'as à la fin que la dernière valeur de la boucle

il faut absolument mettre cette ligne avant while

pour ce qui est des deux boucle il faut passer par mysqli au lieu de mysql vas voir le lien que je t'ai donné.

Sinon pourquoi ne pas generer tout ton xml dans la même boucle ?
Messages postés
92
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
14 janvier 2015
1
Merci Alain de ton retour, ça me donne du courage!

Effectivement, je l'ai placé en haut et en ne mettant qu'une seule boucle je te d'arriver à mes fins comme ceci je remets des variables plus propres et j'ai simplifié le code):

$xml = '<?xml version="1.0" encoding="UTF-8"?>'; 
$connexion=mysql_connect('localhost', 'root', 'pass');
mysql_select_db('db');

$req="SELECT * FROM table1,table2,table3 ORDER BY date_added DESC LIMIT 9";
$reponse = mysql_query($req, $connexion) or die(mysql_error());
while ($row_reponse=mysql_fetch_array($reponse))
{
$category=$row_reponse['category'];
$date=$row_reponse['date'];


$xml = '<portfolio>'; 
$xml = '<categories>
                  <category id="cat1">cat1</category>
                  <category id="cat2">cat2</category>
                  <category id="cat3">cat3</category>
            </categories>'; 
$xml = '<items>'; 
$xml .='<item>';

$xml .='<thumbnail>'.$row_reponse['photo'].'</thumbnail>';
$xml .='<preview>images/preview.jpg</preview>';
$xml .='<category>'.$row_reponse['category'].'</category>';
$xml .='<description>Description goes here</description>';
$xml .='<description2>Description goes here</description2>';

$xml .='</item>';
$xml .='</items>';
$xml .='</portfolio>'; 
}

$fichier = fopen("data2.xml", "r");//ouvrir le fichier
fwrite($fichier, $xml);
fclose($fichier);


Toujours pas de résultat...
Messages postés
92
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
14 janvier 2015
1
Ah mais tu sais que je t'adore Alain! Effectivement, avec le mysqli, ça fonctionne parfaitement! merci beaucoup pour ton aide!

Pour ceux qui galèrent comme moi, faîtes bien attention de bien placer avant l'appel de la base, toutes les données xml qui ne seront pas modifiées, à commencé par

<?xml version="1.0" encoding="UTF-8"?>


Puis checker si ça fonctionne avec le mysqli au lieu du mysql, ça devrait être bon!