[RESOLU] problème d'ecriture xml via formulaire

Eléphanteau du PHP | 16 Messages

13 sept. 2012, 16:10

Bonjour à tous,

je m’arrache les cheveux sur un problème d'incrémentation xml via php.
Concrètement, via un formulaire, je veux écrire dans un fichier xml, après avoir stocké différentes variables dans une bdd. jusque là, rien de (trop) compliqué...
Le problème est que ces variable sont organisées selon une hierarchie bien précise, car le fichier xml en question alimente une galerie photo, dont les photos sont regroupées par année (en fait, par catégorie).

Mon formulaire permet, après avoir choisi quelle galerie, puis quelle catégorie, d'uploader une photo, et le but est qu'elle soit rangée dans la bonne catégorie. dans la bdd, tout est ok.

Le problème arrive quand je dois écrire dans le xml.
pour info, la structure est la suivante :

<gallery title="galerie_test" thumbDir="./images/thumbs/" imageDir="./images/" random="false">

<category name="2012">
<image>
<date>2012</date>
<title>test avec accents ééé</title>
<desc>Operation : test avec accents ééé

Description : test avec accents ééé

Photographe - test avec accents ééé

annee : test avec accents ééé

</desc>
<thumb>03_2012toit.jpg</thumb>
<img>03_2012toit.jpg</img>
</image>

<image>
<date>2012</date>
<title>test avec accents ééé</title>
<desc>Operation : test avec accents ééé

Description : test avec accents ééé

Photographe - test avec accents ééé

annee : test avec accents ééé

</desc>
<thumb>03_2012toit.jpg</thumb>
<img>03_2012toit.jpg</img>
</image>

etc...
</category>

<category name="2012">
<image>
...
</category>

et ainsi de suite.

Tout va très bien quand je reste sur une categorie, j'uploade mes images, ça incremente... mais si je crée une nouvelle categorie, celle ci sera ok, mais quand je reviens sur la précédente et que je tente d'uploader une nouvelle photo, le code me crée une nouvelle categorie...

Je vous joins le bout de code php qui permet d'ecrire dans le xml :
//Ecriture dans le fichier XML

$sql = "SELECT * FROM image WHERE Id_Cat IN (SELECT categorie.Id FROM categorie WHERE categorie.Id_Galerie='$gal') ORDER BY Annee DESC";
$req = mysql_query($sql) or die("mysql connect Failled on : selection de la categorie");

	
	$sql_gal = "SELECT * FROM galerie WHERE Id='$gal'";
	$req_gal = mysql_query($sql_gal) or die('Erreur SQL'.mysql_error());
	$result_gal = mysql_fetch_array($req_gal);
	$nom_galerie = $result_gal['Name'];
	$chemin = $result_gal['Chemin'];
	
	$xml = '<gallery title="' . html_entity_decode($nom_galerie) . '" thumbDir="./images/thumbs/" imageDir="./images/" random="false">';

$nom_cat=null;
$i=0;
while ($result=mysql_fetch_array($req)){

	$cat_prec=$nom_cat; //Le nom de la catégorie précédente
	$id = $result['Id'];
	$date = $result['Date'];
	$titre = html_entity_decode($result['Titre']);
	$operation = $result['Operation'];
	$desc = $result['Description'];
	$photo = $result['Photographe'];
	$annee = $result['Annee'];
	$thumb = $result['Thumb'];
	$img = $result['Img'];
	$idCat = $result['Id_Cat'];
	
	$sql_cat = "SELECT Name FROM categorie WHERE Id='$idCat' GROUP BY Name";
	$req_cat = mysql_query($sql_cat) or die('Erreur SQL !<br>'.$sql_cat.'<br>'.mysql_error());
	$result_cat=mysql_fetch_array($req_cat);
	$nom_cat = $result_cat['Name'];

	if($nom_cat != $cat_prec){
		if($i==0){ $xml .= '

<category name="'.$nom_cat.'">
' ;
		$i = 1;
		}
		else{
		$xml .= '</category>';
		$xml .= '

<category name="'.$nom_cat.'">
' ;
		}
	};

	$xml .= '<image>
' ;

$xml .= '			<date>' . $date . '</date>
';

$xml .= '			<title>' . $titre . '</title>
';

$xml .= '			<desc>Operation : ' . $operation . '
			
Description : ' . $desc . '

Photographe - ' . $photo . '

annee : ' . $annee . '

			</desc>
';
			
$xml .= '			<thumb>' . $thumb . '</thumb>
';

$xml .= '			<img>' . $img . '</img>
';

$xml .= '		</image>
';

}


$xml .= '</category>';
$xml .= '
</gallery>';
Je vous remercie de votre aide, et je suis désolé pour un premier message qu'il soit aussi long... :oops:
Modifié en dernier par bbhood le 13 sept. 2012, 17:56, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

13 sept. 2012, 16:37

mais quand je reviens sur la précédente
T'y reviens comment à tout hasard ? Bouton précédent du navigateur ? (=> formulaire déjà rempli du coup avec les anciennes valeurs /!\ dont les champs cachés/url avec les ids)

Eléphanteau du PHP | 16 Messages

13 sept. 2012, 16:41

non, j'y reviens par un header.location qui me ramène a l'accueil, ou je dois de nouveau choisir ma galerie et ma catégorie (j'avais anticipé ce truc déjà...) :D

ViPHP
xTG
ViPHP | 7331 Messages

13 sept. 2012, 16:47

Bon j'ai parcouru un peu le code mais je m'y perds sans coloration ni indentation.
Tu pourrais nous éditer ton premier message pour rajouter le bbcode php autour de ton code ?

Pour ce que j'en ai compris c'est tout à fait normal, c'est un cas non géré, tu ne fais que de la recopie ou de la création.
Il faut donc insérer une détection d'édition d'une catégorie existante et donc rajouter uniquement un noeud image.
Mais là je m'y perds dans les accolades.

Eléphanteau du PHP | 16 Messages

13 sept. 2012, 16:56

heu, je veux bien, merci, mais comment on fait ?

je précise que je suis loin d'être un crack en php, et que le code est très certainement dégueu...

ViPHP
ViPHP | 1996 Messages

13 sept. 2012, 20:38

Problème d'encodage. En quoi est encodée ta bdd ? Tu ne définis aucun encodage dans ton XML. Généralement on commence les XML de la sorte :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>

Essaye utf8_encode par exemple ici :
$titre = html_entity_decode(utf8_encode($result['Titre']));
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

ViPHP
xTG
ViPHP | 7331 Messages

14 sept. 2012, 08:48

Pour rajouter ton image à priori cela se trouverai ici :
else{
                $xml .= '</category>';
                $xml .= '

<category name="'.$nom_cat.'">
' ;
                }
Il faut rajouter un test dans ce else pour vérifier si l'id catégorie posté est identique à la catégorie précédente.
Et si c'est le cas rajouter ton image avant de fermer la catégorie.

Eléphanteau du PHP | 16 Messages

14 sept. 2012, 09:24

Bonjour et merci de ces réponses.
Il faut rajouter un test dans ce else pour vérifier si l'id catégorie posté est identique à la catégorie précédente.
Et si c'est le cas rajouter ton image avant de fermer la catégorie.
normalement le test est fait ici si je ne me trompe pas ? :
if($nom_cat != $cat_prec){
		if($i==0){ $xml .= '

<category name="'.$nom_cat.'">
' ;
		$i = 1;
		}
		else{
		$xml .= '</category>';
		$xml .= '

ViPHP
xTG
ViPHP | 7331 Messages

14 sept. 2012, 10:48

Non je parle de la catégorie choisie dans ton formulaire.

Eléphanteau du PHP | 16 Messages

14 sept. 2012, 11:13

j'ai essayé comme ça :
//Ecriture dans le fichier XML

$sql = "SELECT * FROM image WHERE Id_Cat IN (SELECT categorie.Id FROM categorie WHERE categorie.Id_Galerie='$gal') ORDER BY Annee DESC";
$req = mysql_query($sql) or die("mysql connect Failled on : selection de la categorie");

	
	$sql_gal = "SELECT * FROM galerie WHERE Id='$gal'";
	$req_gal = mysql_query($sql_gal) or die('Erreur SQL'.mysql_error());
	$result_gal = mysql_fetch_array($req_gal);
	$nom_galerie = $result_gal['Name'];
	$chemin = $result_gal['Chemin'];
	
	$xml = '<gallery title="' . html_entity_decode($nom_galerie) . '" thumbDir="./images/thumbs/" imageDir="./images/" random="false">';

$nom_cat=null;
$i=0;
while ($result=mysql_fetch_array($req)){

	$cat_prec=$nom_cat; //Le nom de la catégorie précédente
	$id = $result['Id'];
	$date = $result['Date'];
	$titre = html_entity_decode($result['Titre']);
	$operation = $result['Operation'];
	$desc = $result['Description'];
	$photo = $result['Photographe'];
	$annee = $result['Annee'];
	$thumb = $result['Thumb'];
	$img = $result['Img'];
	$idCat = $result['Id_Cat'];
	
	$sql_cat = "SELECT Name FROM categorie WHERE Id='$idCat' GROUP BY Name";
	$req_cat = mysql_query($sql_cat) or die('Erreur SQL !<br>'.$sql_cat.'<br>'.mysql_error());
	$result_cat=mysql_fetch_array($req_cat);
	$nom_cat = $result_cat['Name'];

	if($nom_cat != $cat_prec){
		if($i==0){ $xml .= '

<category name="'.$nom_cat.'">
' ;
		$i = 1;
		 
		}
	else{
			/* rajout 14/09 */
			
		if 	($cat == $idCat) {
			$xml .= '<image>
' ;

$xml .= '			<date>' . $date . '</date>
';

$xml .= '			<title>' . $titre . '</title>
';

$xml .= '			<desc>Operation : ' . $operation . '
			
Description : ' . $desc . '

Photographe - ' . $photo . '

annee : ' . $annee . '

			</desc>
';
			
$xml .= '			<thumb>' . $thumb . '</thumb>
';

$xml .= '			<img>' . $img . '</img>
';

$xml .= '		</image>
';

			
			
		}
				
			/* fin rajout */
			
				
		$xml .= '</category>';
		$xml .= '

<category name="'.$nom_cat.'">
' ;
		}
	};

	$xml .= '<image>
' ;

$xml .= '			<date>' . $date . '</date>
';

$xml .= '			<title>' . $titre . '</title>
';

$xml .= '			<desc>Operation : ' . $operation . '
			
Description : ' . $desc . '

Photographe - ' . $photo . '

annee : ' . $annee . '

			</desc>
';
			
$xml .= '			<thumb>' . $thumb . '</thumb>
';

$xml .= '			<img>' . $img . '</img>
';

$xml .= '		</image>
';

}


$xml .= '</category>';
$xml .= '
</gallery>';
ça fait la même chose

ViPHP
xTG
ViPHP | 7331 Messages

14 sept. 2012, 11:40

Si cela fait la même chose c'est que :
if      ($cat == $idCat) {
n'est jamais vrai et donc que le code ne s'exécute pas. ;)

Eléphanteau du PHP | 16 Messages

14 sept. 2012, 12:26

heu... alors c'est plus haut que c'est foireux... :D

parce que c'est censé être vrai justement ???

ViPHP
xTG
ViPHP | 7331 Messages

14 sept. 2012, 14:04

Debug en regardant ce que tu récupères du formulaire.
Et si cela te sembles correct, commentes toute écriture dans le .xml et affiches des echo de debug pour vérifier le déroulement de ton script.

Eléphanteau du PHP | 16 Messages

17 sept. 2012, 16:20

j'y ai passé tout le we, resultat, j'ai refait le code, c'est mieux mais pas que...


	

$sql_gal = "SELECT * FROM galerie WHERE Id='$gal'";
	$req_gal = mysql_query($sql_gal) or die('Erreur SQL'.mysql_error());
	$nom_galerie = $result_gal['Name'];
	$chemin = $result_gal['Chemin'];
	
	$sql_cat = "SELECT * FROM categorie WHERE Id_Galerie='$gal';";
	$req_cat = mysql_query($sql_cat) or die('Erreur SQL'.mysql_error());

		
/* debut d'ecriture dans le xml*/



echo 'debut_galerie';


	
while ($result_gal = mysql_fetch_array($req_cat)) {


$nom_cat= $result_gal['Name'];

echo '<br/>debut_categorie';




$sql = "SELECT * FROM image WHERE Id_Cat IN (SELECT categorie.Id FROM categorie WHERE categorie.Id_Galerie='$gal') ORDER BY Annee DESC";

$req = mysql_query($sql) or die("mysql connect Failled on : selection de la categorie");


		if (mysql_num_rows($req)>0) {
				echo '<br/> debut image';
				
				while ($result = mysql_fetch_array($req)) {
	
				echo '<br> continue image';
				echo $result['Id_Cat'];
				echo '<br/>'.$result['Id'];
				
				}
				
                       echo '<br/> fin image';
		}

echo '<br/> fin categorie';

}
echo '<br/> fin galerie';


(j'ai simplifié le code pour poser la question)
j'ai donc une partie du resultat attendu : j'ai autant de catégories que j'en ai dans ma bdd, mais par contre, a l'interieur des catégories, j'ai toutes les images qui s'affichent, puisque recherchées selon l'id de la galerie. Et j'ai beau chercher je ne sais pas comment les classer...

ViPHP
xTG
ViPHP | 7331 Messages

17 sept. 2012, 16:52

Tu aurais affiché l'id catégorie que tu aurais peut être compris le retour en fait.
Essaies ceci et tu comprendras mieux :
$sql = "SELECT * FROM image WHERE Id_Cat IN (SELECT categorie.Id FROM categorie WHERE categorie.Id_Galerie='$gal') ORDER BY Annee DESC GROUP BY Id_Cat";
;)