Bonjour,

Je ne parviens pas à écrire dans un fichier avec PHP avec ces quelques lignes pourtant simples. J'ai essayé sur mon serveur en local mais également sur mon serveur OVH. Ça ne veut pas fonctionner.
Quelqu"un peut-il me mettre sur la voie ?
Merci.

function update_fluxrss() {
$xml = '<?xml version="1.0" encoding="UTF-8"?>';
$xml .= '<rss version="2.0">';
$xml .= '<channel>';
$xml .= ' <title>FLux RSS</title>';
$xml .= ' <link>www.site.com</link>';
$xml .= ' <description>News RSS</description>';
$xml .= ' <image>';
$xml .= '   <title>Image</title>';
$xml .= '   <url>www.img.jpg';
$xml .= '   <link>www.site.com</link> ';
$xml .= '   <description>Logo</description>';
$xml .= '   <width>80</width>';
$xml .= '   <height>80</width>';
$xml .= ' </image>';
$xml .= ' <language>fr</language>';
$xml .= ' <copyright>frank</copyright>';
$xml .= ' <managingEditor>xxx@xxx.com</managingEditor>';
$xml .= ' <category>Blog</category>';
$xml .= ' <generator>PHP/MySQL</generator>';
$xml .= ' <docs>http://www.rssboard.org</docs>';

$index_selection = 0;
$limitation = 25;

// Connection à la bdd //
include 'myadmin.php';

while ($donnees = $reponse->fetch())
{
    $xml .= '<item>';
    $xml .= '<title>'.stripcslashes($donnees['title']).'</title>';
    $xml .= '<link>'.$donnees['link'].'</link>';
    $xml .= '<guid isPermaLink="true">'.$donnees['link'].'</guid>';
    $xml .= '<pubDate>'.(date("D, d M Y H:i:s O", strtotime($donnees['pubDate']))).'</pubDate>';
    $xml .= '<description>'.stripcslashes($donnees['description']).'</description>';
    $xml .= '</item>';
}
$reponse->closeCursor();

$xml .= '</channel>';
$xml .= '</rss>';

$fp = fopen("rss.xml", 'w+');
fputs($fp, $xml);
fclose($fp);

}

22 réponses


otakodes
Réponse acceptée

rajoute à la fin de tes balises, mais il faut que ce soit entre guillemets et non entre apostrophes pour que ça formate bien

$xml .= "<item>\r\n";
Huggy
Réponse acceptée

tu peux essayer cette syntaxe

   $xml .= '<pubDate>'.date_create($donnees['pubDate'])->format("D, d M Y H:i:s O").'</pubDate>';

Mis à part les erreurs dans les balises XML (manque </url> et </height>)
quel est le problème avec le fichier
pas de fichier créé ?, fichier incomplet ?

Oups, j'ai corrigé les erreurs, merci, mais rien ne s'écrit dans le fichier rss.xml déjà existant.

tu peux essayer de rajouter la taille dans la fonction fputs

fputs($fp, $xml, strlen($xml));

Le fichier reste vide :-(

Tu veux dire que le fichier est créé mais de taille = 0 ?

J'ouvre mon fichier rss.xml et il est vide, donc oui de taille = 0

Pour éliminer les pb de droits, fais le test suivant

$fp = fopen("test.txt", "wb");
fputs($fp, "good");
fclose($fp);

le fichier test.txt devrait contenir 'good'
sinon ton code fonctionne chez moi, sauf que j'ai mis en commentaire la boucle while

Ça fonctionne sur serveur distant. Ce n'est donc pas un pb de droits. J'ai l'impression que c'est la boucle.

est-ce que ton $xml renvoi quelque chose si tu fait un ECHO ou VAR_DUMP ? Si oui je pense vraiment que c'est un probleme de droit de ton fichier en local sur ton dossier courant car si c'était la boucle tu devrais au moins avoir le contenu du xml avant et après la boucle.

Dans la boucle while, la ligne la plus critique, c'est celle avec Datepub
mets la en commentaire pour voir si ça passe

Oulala, j'avais oublié de sélectionner ma bdd, mea culpa les amis :-(
Ça fonctionne...enfin presque car je suis confronté à d'autres problèmes.
Tout d'abord le fichier xml n'est pas formaté, le code s'écrit à la queuleuleu sur des km.
Enfin, les urls des balises <link> transportent des variables avec le caractère '&' qui provoque cette erreur :

    error on line 1 at column 931: EntityRef: expecting ';'

@Huggy pourquoi pubDate serait critique ? à priori il y a le bon nombre de paranthèses non ?

@Frank Hélin, active tes erreurs au maximum avec les lignes suivantes au début du script :

// ça te dira ou quelque chose a cloché
error_reporting(E_ALL);
ini_set("display_errors", 1);

// et mets ton xml avec ça
// ça revient au même que fopen/fputs/fclose et ça crée le fichier s'il n'existe pas 
// mais, si ça aussi ne fonctionne pas, les droits sont en cause à coup sûre
file_put_contents('rss.xml', $xml);

Soit tu inverses simple cote et double cote et tu rajoutes des \n
ou bien tu laisses comme c'est et tu rajoutes . chr(10) à la fin de chaque ligne

\r\n permet un meilleur formatage mais ce n'est pas encore ça car les balises de chaque entrée se suivent sur la même ligne. Exemple :
<title>TITRE</title><link>https://olala.com/test?id=OPI&po=APA</link><guid isPermaLink= etc..

J'obtiens toujours une erreur causée par le symbole '&' dans les balises <link> Je ne sais pas comment résoudre ce problème.

Je pense pas dire de bétise en disant qu'il faut utiliser CDATA car avec htmlentities tu vas transformer les & en &amp;

<url><![CDATA[http://www.example.com/test.php?id=1&p=44]]></url>

J'ai pensé à CDATA, je viens de tester et ça fonctionne.
J'ai maintenant un problème avec la date qui n'est pas bonne bien que ok dans la bdd

oublie pas les espaces pour les tabulations, vers la fin tu ne les mets plus dans ta variable xml. \t Peut aussi faire office de tabulation si tu ne veux pas mettre d'espace

Merci :-) On dirait que c'est tout bon sauf encore un petit soucis. J'ai tenté une intégration du flux dans un WP et les données ne se mettent pas à jour bien le que le fichier en ligne le soit.

je pense que là il faudra un autre sujet. J'imagine que le format n'est pas bon d'ailleurs WP te génère déjà un xml de base pour tes posts créés.

Si c'est de l'importation que tu veux, https://codex.wordpress.org/Importing_Content ça devrait t'aider pour savoir ce qui cloche

Je ne connais pas bien ce format
si c'est le CDATA qui gène , essayes avec htmlentities