Version complète: sur le forum Webmaster Hub : Ecriture dans un fichier
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
xpatval
Bonjour,

Je reste dans l'expectative, et l'incompréhension (diantre !!)

je teste l'écriture dans un fichier de deux manières suivantes:

1a: je créé un fichier et écris une ligne. (1 script)
1b: j'écris plusieurs lignes. (un second script).

Cela fonctionne sans problème.

2a: Si le fichier n'existe pas, je le créé, puis tente d'écrire plusieurs lignes , avec un chmod 666, au cas où.
Dans ce cas, la création est effectuée, mais pas l'écriture des lignes suivantes. (le tout, en un seul script)

2b: je repasse cette moulinette, et comme le fichier est créé, j'écris sans problème plusieurs lignes (toujours un seul script)

Voici les scripts en question:
// w_fil1.php:

CODE

<?php
include "connect.inc";
include "initvar.php";

$filename = 'C:\Documents and Settings\pc\Mes documents\sites\admin_fnd\save_data.txt';
$r = date('l dS F Y');

if (!file_exists($filename)) include "create_file.php";

$sql = "select nom_ent, metier, ville, n_mail from ent, vend, metier where
       ent.id_ent = vend.id_ent and metier.id_metier = vend.id_metier order by nom_ent";
$res = mysql_query($sql);
if (!is_writable($filename))
{
if (!chmod($filename, 0666))
{
   echo "Cannot change the mode of file ($filename)";
exit;
}
}        
if (!$handle = fopen($filename, 'a'))
{
echo "Impossible d'ouvrir le fichier ($filename)";
exit;
}
while ($i = mysql_fetch_array($res))
{
$content = $i['nom_ent'] ."§". $i['metier'] ."§". $i 'ville'] ."§". $i['n_mail'] ."\n";


if (fwrite($handle, $content) === FALSE)
{
   echo "Impossible d'écrire dans le fichier ($filename)";
   exit;
}
}
echo "L'écriture dans le fichier ($filename) a réussi";
fclose($handle);
?>


Le script en "include":

CODE
<?php

$r = date('l dS F Y');

echo "Fichier save_data.txt introuvable !==> Création du fichier de sauvegarde:";
$filename = fopen($filename,"w");
if(fwrite($filename, "Création du fichier - ". $r ."\n"))
{
   echo "Création effectuée !";
}
else echo "Erreur création.";
fclose($filename);
?>


Auriez-vous une explication ?

Merci,

xpatval
Titag
Salut,

CODE
if (!file_exists($filename)) include "create_file.php";



Mets des accolades. Et ca devrait enlever une faute pour commencer smile.gif

A Lire
Anonymus
Tu as une erreur ici :
CODE
while ($i = mysql_fetch_array($res))
{
$content = $i['nom_ent'] ."§". $i['metier'] ."§". $i 'ville'] ."§". $i['n_mail'] ."\n";


Tu peux nous dire si ca marche, avec ceci ? (parce que moi, ca parait marcher wink.gif )

CITATION
Création du fichier - Monday 04th October 2004
xpatval
CITATION
Mets des accolades. Et ca devrait enlever une faute pour commencer


C'est mis. A noter tt de même que la condition était respectée, puisque le fichier était à chaque fois créé .


CITATION
$i 'ville']
:
Erreur de copier coller. $i['ville'] bien écrit dans le script.

Je viens de refaire la tentative. (avec la non-existence du fichier):

Le fichier est bien créé. Mais je passe dans la condition du if (!is_writable($filename)), ce que je ne comprends pas. Et je plante sur le chmod() (No such file or directory)....Cannot change the mode of file (Resource id #6)

Niark blink.gif

=> Anonymous, ce que je souhaite, c'est non seulement créer un fichier si celui-ci n'existe pas, puis écrire en mode "Ajout" des lignes supplémentaires Làoù cela plante, c'est dans ce cas bien précis (fichier de départ inexistant, donc création par l'include, puis écriture en mode "a")

xpatval
Anonymus
Pour la création, ca ne résoud pas ton problème, mais d'après la bible :
CITATION
'w' - Ouvre en écriture seule; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.


Sinon, il ne faut pas utiliser la fonction is_writable ( ou is_writeable ), car elle met le résultat en cache. Ou alors, il faut effacer le cache, utiliser la fonction is_writable, puis appeler le cache.

Bref, tu as tout aussi intéret à sauter cette étape, à essayer d'ecrire dedans, et si tu n'y arrives pas, alors tu utilises la boucle d'erreurs ({echo"is not writable..";...)

Cela résoud t il ton problème ? wink.gif
xpatval
Disons que ma volonté (soit faite....) était d'écrire dans un fichier de backup par table, certaines données que j'allais modifier ou deleter, table par table.

Donc, soit le fichier n'est pas créé, auquel cas je le créé (avec une ligne d'info sur le jour de l'action, plus d'autres éléments) puis ajoute les lignes de tables avant modifs ou delete, soit le fichier existe déjà (c-a-d qu'il y a déjà eu modifs ou delete sur cette même table) et j'ajoute seulement les données concernées. Mais en aucun cas supprimer les lignes existantes dans le fichier.

Là où je me pose des questions quant à ce que j'écrivais dans le code, c'est pourquoi le (!is_writable) ne passe pas si je fais au préalable un fopen, fwrite, fclose.

Les deux actions dans un même script sont-elles incompatibles sans un clearcache() entre elles ? Je vais tester cela, histoire de...

xpatval
Titag
Re,

Il me semble avoir eu des (petits) soucis il y a quelques temps avec les fonctions comme is_writable ou is_fic ou is_dir. Le problème venait du paramètre que je lui passait.

Je ne me souvient pas exactement et ca serait trop long à retrouver mais essaye de voir si en mettant le fichier sans le chemin ca ne marche pas mieux (il faudra que tu fasse un chdir() au préalable)

A tester...
Titag
Loin de moi l'idée de proposer la solution universelle biggrin.gif

Il s'avère que ma modeste expérience a déja été confronté a ce type de problème (sous unix) et que dans mon souvenir, la solution a été de modifier le paramètre de la fonction. Enlever ou mettre le chemin, absolu ou relatif ? Je ne m'en souviens pas mais il y avait une solution.

Voili smile.gif Sur PC, je ne vois même pas comment un script peut atteindre un fichier c:\mes document\toto\tata\fichier.txt... je n'ai jamais essayé remarque.
Dan
Bonjour,

La fonction fopen a une particularité lorsqu'elle est utilisée sous Windows. Il faut ajouter un flag complémentaire qui est soit 'b' (binaire) soit 't' (texte).
CITATION
Les systèmes d'exploitation utilisent différents caractères pour les nouvelles lignes. Lorsque vous écrivez un fichier texte, et insérez une nouvelle ligne, vous devez utiliser le bon caractère pour votre système d'exploitation. Les systèmes Unix utilisent \n comme nouvelle ligne, les systèmes Windows utilisent \r\n , et les systèmes MacIntosh utilisent \r .

Si vous n'utilisez pas le bon caractère de nouvelle ligne lors de l'écriture de vos fichiers, vous risquez d'ouvrir vos fichiers avec des applications qui donneront un aspect 'bizarre' au texte.

Windows propose un mode de traduction ( 't' ), qui va traduire automatiquement les caractères \n en \r\n lorsque vous travaillez sur le fichier. A l'inverse, vous pouvez utiliser l'option 'b' pour forcer le fichier a être écrit en mode binaire, sans traduction des données. Pour utiliser ces options, ajoutez 'b' ou 't' comme dernier caractère du paramètre mode .

Le mode de traduction par défaut dépend de l'interface SAPI et de la version de PHP que vous utilisez. Nous vous recommandons de toujours spécifier les options de traductions pour des raisons de portabilité. Vous devriez utiliser 't' lorsque vous écrivez des fichiers de texte, et le caractère \n pour définir vos fin de ligne, dans les scripts, mais que vous vous attendez à ce que le fichier soit relu par une application comme Notepad. Vous devriez toujours utiliser l'option 'b' dans les autres cas.

Si vous ne précisez pas 'b' lorsque vous travaillez avec des fichiers binaires, vous pourriez rencontrer des problèmes avec vos données, comme des images corrompues ou des caractères \r\n inopinés.

Pour des raisons de portabilité, il est recommandé de toujours utiliser l'option 'b' lorsque vous ouvrez des fichiers avec fopen .

A nouveau, pour des raisons de portabilité, il est fortement recommandé de réécrire les scripts qui utilisent l'option 't' , pour qu'ils utilisent le bon caractère de nouvelle ligne, et le mode 'b' .

Depuis PHP 4.3.2, le mode par défaut est binaire pour toutes les plates-formes qui font la différence entre le mode texte et le mode binaire. Si vous avez des problèmes après avoir mis à jour PHP, essayez d'utiliser l'option 't' , jusqu'à ce que vous ayez mis à jour vos scripts.

On s'est tous fait piéger au moins une fois avec ce flag wink.gif
xpatval
:yoot: YYarrrgghhhhh !!! shutup.gif

Je commence à me demander si je ne vais pas travailler dans le batiment !!...

CITATION
Pour des raisons de portabilité, il est recommandé de toujours utiliser l'option 'b' lorsque vous ouvrez des fichiers avec fopen .


Chose faite. Résultat:
CITATION
fopen(C:\Documents and Settings\pc\Mes documents\sites\admin_fnd\save_data.txt): failed to open stream: No such file or directory in c:\documents and settings\pc\mes documents\sites\admin_fnd\create_file.php on line 6


Je redonne mon code (fort simple):
CODE
<?php
$filename = 'C:\\Documents and Settings\\pc\\Mes documents\\sites\\admin_fnd\\save_data.txt';

$r = date('l dS F Y');

    echo "Fichier save_data.txt introuvable !==> Création du fichier de sauvegarde:";
    $filename = fopen($filename,"b");
    if(fwrite($filename, "Création du fichier - ". $r ."\n"))
    {
 echo "Création effectuée !";
    }
    else echo "Erreur création.";
    fclose($filename);
?>


J'ai essayé avec ces paths:

$filename = "save_data.txt";
ou
$filename = 'C:\\Documents and Settings\\pc\\Mes documents\\sites\\admin_fnd\\save_data.txt';
ou
$filename = 'C:/Documents and Settings/pc/Mes documents/sites/admin_fnd/save_data.txt';

J'ai aussi essayé le fopen() en mode "t".
J'ai aussi essayé avec l'include_path à "1".

Seul le fopen() en "w" créé le fichier. Et je bosse sous XP.

Où donc pêche-je ? cerise-je ? fruits de la passion-je ?
xpatval
biggrin.gif laugh.gif rolleyes.gif whistling.gif :yoot: B) d_clap_20.gif

Tout ça, si si !!!

Je récapitule, pour ceux que cela intéresse (il y en a ? non ? bon).

Je souhaitais écrire des données provenant des tables de ma bdd, dans un fichier par table concernée. Ce fichier, s'il n'existait pas, était créé, avec insertion de valeurs telles que la date, l'heure, le nom de table, etc, puis, ajout à la suite des data provenant de la table considérée.
Si le fichier existait déjà, ajout, seulement, dans ce fichier, à la suite des précédentes écritures.

Les scripts sont affichés plus haut.

A chaque fois la création s'effectuait, mais l'ajout était dans les choux (hibou, genou, roudoudou).
Par contre, l'ajout seul se passait bien.

Bah pourquoi ?

Ben parce que je cherche toujours un neurone neuf pour remplacer l'existant, fortement déficient.

Le script de création fonctionnait, mais ne refermait pas le fichier...
D'où la gamelle si en plus, il y avait ajout.

Voici celui qui fonctionne:

CODE
<?php
$r = date('l dS F Y');

    echo "Fichier save_data.txt introuvable !==> Création du fichier de sauvegarde:";
    $point = fopen($filename,"w");
    if(fwrite($point, "Création du fichier - ". $r ."\n"))
    {
 echo "<br>Création fichier $filename effectuée !<br>";
    }
    else echo "<br>Erreur création fichier $filename.<br>";

    if (!fclose($point))
    {
 print "<br>Erreur fermeture fichier $filename<br>";
    }
    else print "<br>Fermeture fichier $filename OK!<br>";
?>


Toute l'étendue (p'tain, y'a des hectares, là..) de l'erreur était que je faisais un
CODE
$filename = fopen($filename,"w")

Bonjour le nom du pointeur....

Dan, j'ai testé la méthode pronée dans ton post. Le path doit être indiqué d'une manière particulière, car en mode "b", je plante à chaque fois. J'ai donc conservé le mode "w". C'est pas bien ?

d_clap_20.gif

Merci à tous.

xpatval
xpatval
CITATION
si si çamarche..je t'assure...je fait des scripts compatible unix/windows..tout en full path sauf qu'il faut replacer _ par / ex c:/tutu/index.php


voir même c:\\tutu\\index.php...

xpatval
Dan
CITATION(xpatval @ 05 Oct 2004, 13:39)
Dan, j'ai testé la méthode pronée dans ton post. Le path doit être indiqué d'une manière particulière, car en mode "b", je plante à chaque fois. J'ai donc conservé le mode "w". C'est pas bien ?
*

Il faut mieux lire le texte ...

Le flag "b" s'ajoute aux autres, donc "r" devient "rb", "w" devient "wb", et "a" devient "ab" laugh.gif

Il ne doit pas être utilisé seul... j'aurais peut-être dû insister sur ce point... mea culpa wink.gif

Dan

PS: je précide que ce flag "b" est ignoré par les serveurs de type Linux... tu peux donc le laisser en place sans crainte wink.gif
xpatval
Exact, je me flagellerai ce soir, car cela fonctionne parfaitement en "wb"....

xpatval
Dan
CITATION(xpatval @ 05 Oct 2004, 20:36)
Exact, je me flagellerai ce soir, car cela fonctionne parfaitement en "wb"....

xpatval
*

Ca résoud tous tes problèmes ? Tant mieux !

J'ai eu à faire face à cette difficulté lors de la création du backoffice de mon premier site internet dynamique. Je me souviens avoir passé des jours à chercher pourquoi ce qui fonctionnait sous Linux ne fonctionnait plus en local... le Hub n'existait pas encore pour y poser ma question blush.gif

C'est le genre d'enseignement qui reste gravé "à vie" biggrin.gif

Dan

PS: par contre tu devrais essayer les ouvertures de fichiers en donnant des liens relatifs, car le "c:\mes documents...\" est tout sauf portable wink.gif
xpatval
CITATION
Ca résoud tous tes problèmes ? Tant mieux !

Ce n'est pas exactement ça.
J'avais attrinué au pointeur d'ouverture de fichier le même nom que ma variable fichier ...

Ce qu'on est con, dès fois...

CITATION
"c:\mes documents...\" est tout sauf portable

C'est déjà modifié smile.gif

xpatval
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.