8791 sujets

Développement web côté serveur, CMS

Bonjour,

Quand je fais

$fp = fopen("sitemap.xml","r+");
while (!feof($fp)) {
   $page.=fgets($fp, 4096);
}	
echo $page;


sur mon fichier sitemap.xml qui contient :
a écrit :
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
<url><loc>http://brys.developpez.com</loc><priority>1.0</priority></url>
</urlset>


J'obtien :
a écrit :
http://brys.developpez.com1.0


Et c'est tout... Alors du coup, là, je suis un peu dubitatif...
Ou sont passé mes belles tags et mon magnifique 1.0?

Mystère...

Quelqu'un pourrait-il éclairer ma lanterne sur le fonctionnement de ce while (auquel je ne comprend rien) et peut être m'expliquer comment afficher le contenu de mon fichier?

Merci d'avance ^^
Modifié par simon.baconnais (11 Mar 2008 - 17:13)
salut,

d'un point de vue php il n'y a pas de faute en fait.

malgré ce qu'elle affiche si tu regardes le source de la page c'est bien le contenu de ton fichier xml.

mais soit le xml est interpreté ( par les navigateurs web les plus récents).

soit le pb c'est que le navigateur essaie d'interpreter du xml comme du php. ton fichier est un fichier .php apres tout.

moralité
soit 1: C'est un effet de la balise <loc> en xml
soit 2: Les balises xml ne sont pas comprises en php. et du coup il t'affiche juste le texte hors balise.

a priori je penche pour la seconde solution comme le plus probable.
Modifié par CPascal (07 Mar 2008 - 16:58)
Ok c'était bien une interprétation de la part des navigateurs, mea culpa ^^

En revanche la sutie de ma fonction ne marche pas non plus =p


$fp = fopen("sitemap.txt","r+");
$url='http://www.jelisdeshistoiresvraies.fr/?p=';
		
while (!feof($fp)) {
	$page.=fgets($fp, 4096);
}
		
eregi($url,$page,$regs);
		
if(empty($regs[1])){
	$contenu='<url><loc>'.url.'</loc><priority>1.0</priority></url>\n</urlset>';
	str_replace("</urlset>",$contenu,$fp);
}
	
fclose($fp);


C'est censé faire :
J'ouvre le fichier
Je regarde si l'URL existe
Si elle n'existe pas je change "</urlset>" par "<url><loc>'.url.'</loc><priority>0.5</priority></url>\n</urlset>"

Mais l'URL n'exsite pas et ça n'ajoute rien =p Par contre pour une raison obscure ça m'affiche le contenu du fichier xml alores qu'il n'y a aucun echo nulle part -__-"
Modifié par simon.baconnais (10 Mar 2008 - 14:19)
je dois avouer pas trop comprendre ce que tu veux faire .

a écrit :
$url='http://www.jelisdeshistoiresvraies.fr/?p=';


quelle drôle d'url! ce / suivi directement d'un parametre get dont on ne donne pas la valeur et ce sans même precisez la page voulue.


sinon il y a une erreur evidente là:

$contenu='<url><loc>'.url.'</loc>

au lieu de
$contenu='<url><loc>'.[b]$[/b]url.'</loc>

Modifié par CPascal (10 Mar 2008 - 20:48)
Bon alors... Effectivement il y avait quelques bugs dans mon code (qui n'expliquent pas pourquoi il n'ajoute rien à mon fichier d'ailleurs) que j'ai maintenant corrigé. Je vous recolle donc le code :

		$fp = fopen("sitemap.xml","r+") or die("echec");
	
		$url='http://www.jelisdeshistoiresvraies.fr/?p=';
		
		while (!feof($fp)) {
			$page.=fgets($fp, 4096);
		}
		
		eregi($url,$page,$regs);
		
		if(empty($regs[1])){
			echo 'ok';
			$contenu='<url><loc>'.$url.'</loc><priority>1.0</priority></url>\n</urlset>';
			str_replace("</urlset>",$contenu,$page) or die("echec");
		}
		
		else{ echo 'pas ok'; }

		echo $page;
	
		fclose($fp);


Pour la variable $url, le "p=" sera incrémenté par une variable GET, pour le moment je fais juste des tests donc je m'en fiche un peu. Bref.

Alors après quelques tests j'ai remarqué :
- Il ouvre bien le fichier
- Il créé bien ma variable $page
- Après le eregi, la variable $reg[1] est vien vide et il entre dans mon if.

Ce qui semble bugger c'est la fonction str_replace(). Si quelqu'un sait pourquoi ... Je serais ravis de l'apprendre =)

Merci d'avance.
Modifié par simon.baconnais (11 Mar 2008 - 10:43)
voyons voir la doc:
a écrit :
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )


donc ici tu cherches </urlset> dans $page en le remplaçant par $contenu.

Est-ce bien ce que tu voulais faire?

si tu veux que page soit mis a jour il faut ecrire

$page = str_replace("</urlset>",$contenu,$page);

en effet la signature dit: mixed $subject et non mixed &$subject.
ici le subjet est passé par valeur et non par référence.

j'ai repris le code de sitemap.xml suivant:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
<url><loc>http://brys.developpez.com</loc><priority>1.0</priority></url>
</urlset> 


et effectuer un test ainsi ça m'a l'air d'aller.
Modifié par CPascal (11 Mar 2008 - 11:17)
Merci Pascal, après quelques bidouillages j'ai réussi, je vous colle la solution :

<?

	$fp = fopen("monfichier.xml","r+") or die("echec");
	
		$url='www.monURL.com';
		
		while (!feof($fp)) {
			$page.=fgets($fp, 4096);
		}
	
		fclose($fp);
		
		if(!eregi($url,$page)){
			$contenu='<url><loc>'.$url.'</loc><priority>0.5</priority></url></urlset>';
			$page=str_replace("</urlset>",$contenu,$page);
			
			unlink("monfichier.xml");
			
			$fp=fopen("monfichier.xml","a+");
			fwrite($fp,$page);
			fclose($fp);
		}
?>


C'est sûrement améliorable mais au moins ça marche =)

Et puis en bidouillant un peu ça vous servira a faire un sitemap qui se met automatiquement à jour Smiley cligne
Modifié par simon.baconnais (11 Mar 2008 - 17:11)