Aller au contenu

Ecriture dans un fichier


Sujets conseillés

Posté

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:


<?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":

<?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

Posté

Salut,

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

Mets des accolades. Et ca devrait enlever une faute pour commencer :)

A Lire

Posté

Tu as une erreur ici :

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 ;) )

Création du fichier - Monday 04th October 2004
Posté
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éé .

$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:

=> 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

Posté

Pour la création, ca ne résoud pas ton problème, mais d'après la bible :

'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 ? ;)

Posté

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

Posté

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...

Posté

Loin de moi l'idée de proposer la solution universelle :D

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 :) 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.

Posté

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).

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 ;)

Posté

:yoot: YYarrrgghhhhh !!! :shutup:

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

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:

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):

<?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 ?

Posté

:D:lol::rolleyes::whistling::yoot:B):clap:

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:

<?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

$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 ?

:clap:

Merci à tous.

xpatval

Posté
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

Posté
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" :lol:

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

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 ;)

Posté

Exact, je me flagellerai ce soir, car cela fonctionne parfaitement en "wb"....

xpatval

Posté
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:

C'est le genre d'enseignement qui reste gravé "à vie" :D

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 ;)

Posté
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...

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

C'est déjà modifié :)

xpatval

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...