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

Résolu/Fermé
typiac Messages postés 92 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 14 janvier 2015 - Modifié par typiac le 3/01/2013 à 17:02
typiac Messages postés 92 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 14 janvier 2015 - 3 janv. 2013 à 21:31
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????

A voir également:

6 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
3 janv. 2013 à 17:30
<?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) ;}}
0
typiac Messages postés 92 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 14 janvier 2015 1
3 janv. 2013 à 17:34
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! ^^
0
typiac Messages postés 92 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 14 janvier 2015 1
3 janv. 2013 à 19:09
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?
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
3 janv. 2013 à 21:00
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
typiac Messages postés 92 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 14 janvier 2015 1
3 janv. 2013 à 21:09
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...
0
typiac Messages postés 92 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 14 janvier 2015 1
3 janv. 2013 à 21:31
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!
0