8768 sujets

Développement web côté serveur, CMS

Bonjour à ,tous,
j'essaie de faire un import d'un fichier Xml, cela fonctionne en partie.
Mon problème est dans la récupération des images.
sur le premier bien cela fonctionne mais a partir du second et suivant cela m'affiche les images en double.
je vous met le code :
le xml (raccourci):

<?xml version="1.0" encoding="ISO-8859-1"?>
<LISTEPA date="2018-11-29 12:37:55">
<BIEN>
<LOCALISATION>
<VILLE><![CDATA[Brest]]></VILLE>
<CODE_POSTAL>29200</CODE_POSTAL>
<ADRESSE><![CDATA[1 Rue des 11 Martyrs]]></ADRESSE>
<VISIBLE>true</VISIBLE>
<INSEE>29019</INSEE>
<LATITUDE>48.390453338623</LATITUDE>
<LONGITUDE>-4.482745170593</LONGITUDE>
<LATITUDE_WEB>48.39045334</LATITUDE_WEB>
<LONGITUDE_WEB>-4.48274517</LONGITUDE_WEB>
<PROXIMITE/>
</LOCALISATION>
<IMAGES>
<IMG><![CDATA[https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/11111111a.jpg?DATEMAJ=29/11/2018-12:00:00]]></IMG>
<IMG><![CDATA[https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/11111111b.jpg?DATEMAJ=29/11/2018-12:00:00]]></IMG>
</IMAGES>
</BIEN>
<BIEN>
<LOCALISATION>
<VILLE><![CDATA[Bordeaux]]></VILLE>
<CODE_POSTAL>33000</CODE_POSTAL>
<ADRESSE><![CDATA[1 Rue des 11 Martyrs]]></ADRESSE>
<VISIBLE>true</VISIBLE>
<INSEE>29019</INSEE>
<LATITUDE>48.390453338623</LATITUDE>
<LONGITUDE>-4.482745170593</LONGITUDE>
<LATITUDE_WEB>48.39045334</LATITUDE_WEB>
<LONGITUDE_WEB>-4.48274517</LONGITUDE_WEB>
<PROXIMITE/>
</LOCALISATION>
<IMAGES>
<IMG><![CDATA[https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/22222222a.jpg?DATEMAJ=29/11/2018-12:00:00]]></IMG>
<IMG><![CDATA[https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/22222222b.jpg?DATEMAJ=29/11/2018-12:00:00]]></IMG>
</IMAGES>
</BIEN>
</LISTEPA>


le php :

    $BIENS456 = simplexml_load_file('test.xml');

    foreach ($BIENS456->BIEN as $BIEN) {
		
	//LOCALISATION
		foreach ($BIEN->LOCALISATION as $LOCALISATION) {
		$VILLE = $LOCALISATION->VILLE;
		$CODE_POSTAL = $LOCALISATION->CODE_POSTAL;
		}
	
	// POUR LES IMAGES	

		foreach($BIEN->IMAGES->IMG as $url) {

			$url = explode('?', $url);
			$champs_SQL_images[] = $url[0]; # champs SQL-URLs contruits un/un dans un tableau
		}

	echo '<br>';
		
	echo $CODE_POSTAL." ".$VILLE.'<br>';

	
	echo $champs_SQL_images[0];
		echo '<br>';
	echo $champs_SQL_images[1];
		echo '<br>';
	echo $champs_SQL_images[2];
		echo '<br>';
	echo $champs_SQL_images[3];

	echo '<br>';	
	
	}


le resultat :

29200 Brest
 https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/11111111a.jpg
 
 https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/11111111b.jpg
 

33000 Bordeaux
 https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/11111111a.jpg
 
 https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/11111111b.jpg
 
 https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/22222222a.jpg
 
 https://nomdedomaine/catalog/images/pr_p/1/2/3/4/5/6/7/8/22222222b.jpg
 


Je pense que c'est une histoire de boucle mais je ne vois pas comment faire.
Merci d'avance de votre aide.
Cdt
Modifié par spawns (25 Nov 2021 - 15:06)
Modérateur
Bonjour,

en effet , une histoire de boucle Smiley smile .

En début de boucle et au premier tour, ton tableau $champs_SQL_images est vide et se rempli avec les images du premier enregistrement,

Au second tour et les suivant, toutes les autres images sont ajoutées et comme tu ne fais un affichage que sur les 4 premières entrées de ton tableau , tu ne vois que celles ci. De plus, si les enregistrements sont manquant, tu as le droit à un message d'erreur.

A moins que tu ai besoin de ce tableau (array) des url (ailleurs et sans les villes ?) , tu peut simplement t'en passer et faire tes echo directement dans les deux boucles de la boucle principale.

    foreach ($BIENS456->BIEN as $BIEN) {	
	//LOCALISATION
		foreach ($BIEN->LOCALISATION as $LOCALISATION) {
		$VILLE = $LOCALISATION->VILLE;
		$CODE_POSTAL = $LOCALISATION->CODE_POSTAL;
		
		echo $CODE_POSTAL." ".$VILLE.'<br>'; /// echo ICI de la ville

		}
	
	// POUR LES IMAGES	
		foreach($BIEN->IMAGES->IMG as $url) {
			$url = explode('?', $url);			
			echo $url[0].'<br>';// echo des images si il y en a de trouvées
		}
	}


Si tu veut toutefois te servir d'un tableau, il te faut alors l'alimenter aussi avec les villes et codes postaux puis les url des images. Il te faudra un tableau multidimensionnel (voir https://www.pierre-giraud.com/php-mysql-apprendre-coder-cours/tableau-multidimensionnel/ ) et ensuite bouclé dessus pour faire ton affichage.
Peut-être utile pour générer directement un fichier HTML que tu mettra à jour à chaque modif de ton fichier XML sans avoir à relancer tes boucles à chaque visiteur.

Modifié par gcyrillus (25 Nov 2021 - 15:20)
Merci de te pencher sur mon problème.

le souci c'est quand réalité je dois sortir de la boucle car c'est pour faire une requête d'insertion en BDD ensuite.

Comment je peux faire ?
Modérateur
gcyrillus a écrit :

Si tu veut toutefois te servir d'un tableau, il te faut alors l'alimenter aussi avec les villes et codes postaux puis les url des images. Il te faudra un tableau multidimensionnel (voir https://www.pierre-giraud.com/php-mysql-apprendre-coder-cours/tableau-multidimensionnel/ ) et ensuite bouclé dessus pour faire ton affichage.
Peut-être utile pour générer directement un fichier HTML que tu mettra à jour à chaque modif de ton fichier XML sans avoir à relancer tes boucles à chaque visiteur.


Au lieu de générer un fichier HTML, tu peut alimenter ou mettre à jour ta BDD l'occasion d'une modif du fichier XML.

Si tu veut garder ton script tel quel, tu peut aussi réinitialiser le tableau à chaque nouveau passage.
    foreach ($BIENS456->BIEN as $BIEN) {
		$champs_SQL_images = null;
		
	//LOCALISATION
....
Meilleure solution
Oui c'est ca l'idée réinitialiser à chaque passage Smiley biggrin Smiley biggrin
$champs_SQL_images = null;

Grand merci à toi gcyrillus
Smiley good Smiley good