8800 sujets

Développement web côté serveur, CMS

Bonjour,

Je rencontre un problème avec la fonction simplexml_load_file de php.

Je l'utilise pour parser un flux xml de type catalogue produit.

Lorsque je met mon script en ligne en indiquant:

$flux = simplexml_load_file('http://www.mon_flux.xml');

Ca fonctionne.(l'url est plus complexe que cela, il y a des ? et & dans l'url)

si je fais:

$flux = simplexml_load_file($mon_flux);

Avec $mon_flux récupéré dans une base de donnée ça ne marcha pas.

Je pense qu'il y a un problème d'encodage de caractéres de l'url entre le moment ou j'enregistre mon url dans la base de donnée et quand je vais rechercher mon url dans ma bdd.

Quand j'enregistre mon url dans la base de donnée je fais un mysql_real_escape_string et quand je la récupére je fais un stripslashes (je ne vois pas ce qui peux poser problème)

Dans la doc php, il y a cette note:

a écrit :
Note: Libxml 2 supprime la protection des caractères des URI, alors si vous voulez passer par exemple b&c comme paramètre URI à a, vous devez appeler simplexml_load_file(rawurlencode('http://example.com/?a=' . urlencode('b&c'))). Depuis PHP 5.1.0, vous n'avez plus besoin de faire cela puisque PHP le fait pour vous.


j'ai donc essayé cela:

$flux= simplexml_load_file(rawurlencode($mon_flux . urlencode('b&c')));


Ce qui ne marche pas non plus.

J'ai essayé aussi avec utf-8 encode, sans résultat.

Quelqu'un a t-il eu le problème ?

Auriez-vous des infos sur ce probléme ?

Merci d'avance.
Modifié par yann123 (11 Nov 2008 - 15:37)
Merci de ta réponse.

J'ai déjà essayé et l'url affiché est conforme.

Par contre voici ce que j'ai pu observé en "bidouillant".


echo $url_flux . '<br />';
$flux = simplexml_load_file($url_flux);


Dans ce cas la echo $url_flux affiche mon url correctement et aucun message d'erreur de la fonction simplexml_load_file n'est affiché.

Par contre, si je fais:

echo $url_flux . '<br />';
$flux = simplexml_load_file("'" . $url_flux . "'");


Dans ce cas, $url_flux affiche mon url correctement. et j'ai un message d'erreur du type:
a écrit :

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "'http%3A//www.mon_flux.xml/XMLFormat.aspx%3Fpart'" in ....


Donc la sur ce que je comprends simplexml_load_file rencontre un problème avec l'url, car dans l'url qu'il affiche dans le message d'erreur (voir ci-dessus) les caractères suivant sont modifiés: ":" est remplacé par "%3A", "?" par "%3F", "&" par "&amp;".

Et la ce n'est pas bon il faut que ":" reste ":", "?" reste "?" et "&" reste "&".

Ce serait donc la fonction elle-même qui modifie mon url....J'y comprends plus rien.
Juste au cas où, essaye un peu ces deux lignes:

$flux = simplexml_load_file($url_flux . chr(0));
et
$flux = simplexml_load_file($url_flux . chr(3));


C'est peut être un problème de fin de chaîne.
Calak a écrit :
Juste au cas où, essaye un peu ces deux lignes:

$flux = simplexml_load_file($url_flux . chr(0));
et
$flux = simplexml_load_file($url_flux . chr(3));


C'est peut être un problème de fin de chaîne.


Merci, mais non cela ne change rien.
yann123 a écrit :
[...]
Par contre, si je fais:

echo $url_flux . '<br />';
$flux = simplexml_load_file("'" . $url_flux . "'");


Dans ce cas, $url_flux affiche mon url correctement. et j'ai un message d'erreur du type:

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "'http%3A//www.mon_flux.xml/XMLFormat.aspx%3Fpart'" in ....


C'est normal il me semble.

Tu lui passe la chaîne 'http://www.mon_flux.xml' au lieu de http://www.mon_flux.xml.

En gros, c'est comme si tu faisais:
$flux = simplexml_load_file(''\'http://www.mon_flux.xml\'');

(tu peux tester, tu devrais avoir la même erreur.

Toujours dans la série des tests et magouilles, essaye ceci:
$flux = simplexml_load_file("$url_flux");
Calak a écrit :


C'est normal il me semble.

Tu lui passe la chaîne 'http://www.mon_flux.xml' au lieu de http://www.mon_flux.xml.

En gros, c'est comme si tu faisais:
$flux = simplexml_load_file(''\'http://www.mon_flux.xml\'');

(tu peux tester, tu devrais avoir la même erreur.


Oui ma bidouille du dessus était tordu, mais ce qui a attiré mon attention, c'est que dans le message d'erreur, il me met l'url du flux avec des caractéres qui ne me plaise pas. et qui je pense sont la cause de mon probléme.

a écrit :

Toujours dans la série des tests et magouilles, essaye ceci:
$flux = simplexml_load_file("$url_flux");



Ca ne fonctionne pas non plus.

Merci
Modifié par yann123 (11 Nov 2008 - 17:10)
Super_baloo8 a écrit :
Et ça en direct ça marche ?

$flux = simplexml_load_file(''http://www.mon_flux.com/fichier.xml'');



Non, ça ne marche pas. J'ai copié directement ta ligne et remplacer l'url par mon url.
Tu as mis deux apostrophe avant et après l'url du coup php considère tous ce qui suit // comme un commentaire (écrit en jaune).

a écrit :

C'est quoi l'url ?
Une url simple ? http://www.monsite.com/flux.xml
Ou une url avec paramètre ? http://www.monsite.com/flux.php?rss=xml


C'est une url avec des paramètres, l'url contient les caractéres suivant:
':' '?' et '&'

a écrit :

Parce que chez moi ça ça fonctionne

$xml = simplexml_load_file("http://www.worldcommunitygrid.org/rss?feed=member&userName=".$name_user."");



Moi aussi, si je met mon url directement dans la fonction, ca marche
si j'enregistre l'url dans une bdd, quand je vais la chercher et que je l'insère dans la fonction en tant que variable $url_flux, la çà ne marche plus.

Si tu peux faire l'essai, ca m'intérrésse. Smiley cligne
Modifié par yann123 (11 Nov 2008 - 22:26)
Oops, pardon pour le premier lien, c'est un vulgaire copier coller, les deux ' sont une erreur, c'est bien des " qu'il faut.

Accède à ta base de donnée manuellement, et va lire directement ce qu'il y a d'inscrit.

Il y a t'il toute l'url ? (champs trop court, limité à un certains nombre de caractères).

Encodage de la base de donnée ?
Super_baloo8 a écrit :
Oops, pardon pour le premier lien, c'est un vulgaire copier coller, les deux ' sont une erreur, c'est bien des " qu'il faut.


Avec les guillemets ça ne marche pas non plus.

a écrit :

Accède à ta base de donnée manuellement, et va lire directement ce qu'il y a d'inscrit.

Il y a t'il toute l'url ? (champs trop court, limité à un certains nombre de caractères).


Tout y est et ecrit correctement, :?& présent.

a écrit :

Encodage de la base de donnée ?


French(fr-iso-8859-1)

Je ne pense pas que ce soit top il faudrait utf-8, mais si je change cela risque de poser problème pour le reste du site (pas trop envie d'essayer).

On ne peut pas changer l'encodage juste pour un champ ?
Je ne comprends vraiment pas pourquoi ça coince, serais t'il possible, pour ne pas dévoiler l'url à tout le monde, que tu m'envoie l'url par MP ?
A tout hasard :
a écrit :
Libxml 2 supprime la protection des caractères des URI, alors si vous voulez passer par exemple b&c comme paramètre URI à a, vous devez appeler simplexml_load_file(rawurlencode('http://example.com/?a=' . urlencode('b&c'))). Depuis PHP 5.1.0, vous n'avez plus besoin de faire cela puisque PHP le fait pour vous.

=>http://fr.php.net/manual/fr/function.simplexml-load-file.php
Arsene a écrit :
A tout hasard :
Libxml 2 supprime la protection des caractères des URI, alors si vous voulez passer par exemple b&c comme paramètre URI à a, vous devez appeler simplexml_load_file(rawurlencode('http://example.com/?a=' . urlencode('b&c'))). Depuis PHP 5.1.0, vous n'avez plus besoin de faire cela puisque PHP le fait pour vous.

=>http://fr.php.net/manual/fr/function.simplexml-load-file.php

Vu et sans succés (voir premier message)

Merci
Super_baloo8 a écrit :
Je ne comprends vraiment pas pourquoi ça coince, serais t'il possible, pour ne pas dévoiler l'url à tout le monde, que tu m'envoie l'url par MP ?


url envoyé.

Merci
Modifié par yann123 (13 Nov 2008 - 14:10)