Fwrite sur une seule ligne d'un .txt

cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012 - 28 janv. 2010 à 13:07
cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012 - 29 janv. 2010 à 11:29
Bonjour !
Je sèche complètement devant un script permettant de modifier le contenu d'un fichier texte.
J'explique :
J'affiche une page de présentation d'un produit (titre, images, liens et surtout la description).
Jusqu'ici tout fonctionne à merveille (merci neoxen ;)), j'ai un .txt annexe dans lequel j'ai écrit sous la forme :
Nom_article_1|....Description_1
Nom_article_2|....Description_2
etc...
et je me sers donc du nom de l'article pour aller chercher la description avec ce code :
<?php
$description=  fopen('../../contenu/descriptions.txt','r+');
while(!feof($description))
{
$data=fgets($description);
$explode=explode('|....',$data);
$array[$explode[0]]=$explode[1];
}
fclose($description);
echo $array[$titre];
?>

Pour améliorer ce script, j'ai décidé d'y apporter un éditeur en ligne, permettant donc de modifier la description voulue.
Je récupère donc la description de la même manière que plus haut et l'affiche dans le textarea d'un formulaire, après parsage bien entendu , le texte s'affiche correctement.
Vachement content de moi, je poursuis avec la partie sauvegarde de la description modifiée, le script écrit bien la ligne comme je le veux, mais malheureusement me supprime toutes les autres lignes du .txt !!
voilà donc le problème qui m'amène vers des gens plus expérimentés que moi, comment faire pour ne modifier qu'une seule ligne de mon fichier.txt, en conservant toutes les autres intactes ?
ci-dessous le (pseudo) code sur lequel je me casse les dents : (commenté et raccourci pour l'occas')
<?php
//////////////////////////////////////////////////////////////////////////////////////////////////////////		
// Configuration
$cfg['page_name'] = "admin.php";
$cfg['file_to_edit'] = "contenu/descriptions.txt";

// Code de lecture ecriture (ne fonctionne pas)
if ( isset($_POST['texte']) )	// Si le formulaire à été envoyé
{
$description = fopen($cfg['file_to_edit'],"r");  // Ouverture du .txt en lecture
$contenu=fgets($description);	// Récupération du contenu
$explode=explode('|....',$contenu);	 // Tableau avec séparateur	
$array[$explode[0]]=$explode[1];
$data1=$explode[0];	// Récupération du titre
fclose($description);	// Fermeture du .txt

$data2 = '|....' . $_POST['texte'];	// Ajout du  séparateur 
$donnees = $data1 . $data2;			// + la description éditée
$avant_str = array("", "", " ", " ", "\'", "<retour>");	// Préparation 
$apres_str  = array(" ", " ", "", "", "'", "
");			// de la regex
$resultat  =  str_replace($avant_str, $apres_str, $donnees);								// Execution
$description =  fopen($cfg['file_to_edit'],"w");  // Ouverture du .txt en écriture
fwrite($description, $resultat . $reste);	// Ecriture
fclose($description);	// Fermeture du .txt
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else	// Sinon édition 
{
?>
<form action="<?php echo $cfg['page_name']; ?>" method="post">
<textarea name="texte" onkeyup="preview(this, 'previewDiv');" onselect="preview(this, 'previewDiv');" id="textarea" cols="60" rows="10">
<?php
///////////////////////////////////////////////////////////////////////////////////////////////
// Code qui affiche la description voulue dans le textarea (fonctionne)
$description = fopen($cfg['file_to_edit'],"r");
while (!feof($description))
{
$contenu=fgets($description);
$explode=explode('|....',$contenu);
$array[$explode[0]]=$explode[1];		
$avant_str = array(" ", " ", "", "", "\'", "&amp;");
$apres_str  = array("", "", " ", " ", "'", "et");
$resultat  = str_replace($avant_str, $apres_str, ($array[$titre]));		
}
echo $resultat;
fclose($description);
///////////////////////////////////////////////////////////////////////////////////////////////
?>
</textarea>




</form>
<?php			
}
?>

Je précise que oui via mysql ce serait plus simple, mais je m'entraine à manipuler les fichers...Merci d'avance!

4 réponses

cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012
28 janv. 2010 à 13:14
oups, j'ai oublié de préciser que dans cette tentative, j'essaie d'ajouter avec le fwrite une valeur $reste qui correspondrait au reste du .txt, en vain...
PS: Ou est le bouton "editer message" ??
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 19
28 janv. 2010 à 14:31
Pourquoi tu ne prends pas le contenu du fichier et fais un remplacement de la chaine Nom_article_1|....Description_1 par Nom_article_1|....Nouvelle_Description_1
Une petite expression régulière et voila !!
Et enfin tu sauvegarde le tout..
Mais es-tu obligé de passer par un fichier plat et en plus txt ?? Tu peux toujours passer par un XML avec DOM, c'est assez puissant come solution.
S.
0
cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012
28 janv. 2010 à 22:39
Bonsoir syndrael,
merci de ta réponse rapide qui m'a permis d'avoir eu le temps de tester tes conseils.
J'ai donc retouché un peu au code pour y ajouter un petit str_replace ...
tout fonctionne à part le fait que la ligne modifiée vient s'ajouter au début du fichier .txt et ne remplace donc pas la description voulue.
Je suis sûr d'avoir foireauté quelque part
	$data2 =   '|....' . $_POST['texte'];	// Ajout du  séparateur
$donnees = $titre . $data2;			// + la description éditée
$avant_str = array("", "", " ", " ", "\'", "<retour>");	// Préparation
$apres_str  = array(" ", " ", "", "", "'", "
");			// de la 1°regex
$resultat  = str_replace($avant_str, $apres_str, $donnees);								// Execution
$array[$titre]=$resultat;
$file = file_get_contents($cfg['file_to_edit']);
$avant_str2 = array($file);																// Préparation
$apres_str2 = array($resultat);															// de la 2°regex									
$final = str_replace($avant_str2, $apres_str2, $file); 										// Execution
//	$final .= $file;	// ne fonctionne pas car AJOUTE la ligne au début du .txt
if ($description = fopen($cfg['file_to_edit'],"w"))  // Ouverture du .txt en écriture
{														
fwrite($description, $final);	// Ecriture	
}
?>
0
cs_harmonyk Messages postés 37 Date d'inscription samedi 16 septembre 2006 Statut Membre Dernière intervention 5 juillet 2012
29 janv. 2010 à 11:29
Bonjour !
Bon j'ai planché pas mal cette nuit et j'en suis arrivé à un résultat presque concluant...
la description modifiée s'écrit parfaitement dans le .txt, le reste aussi, sauf la ligne d'après celle qui est modifiée.
Le script y ajoute 6 tabulations, je ne comprend pas pourquoi ??
// Code de lecture ecriture (ne fonctionne pas)
if ( isset($_POST['texte']) )	// Si le formulaire à été envoyé
{
$description =   fopen($cfg['file_to_edit'],"r");  // Ouverture du .txt en lecture
while (!feof($description))
{		
$contenu=fgets($description);	// Récupération du contenu
$explode=explode('|....',$contenu);	 // Tableau avec séparateur
$array[$explode[0]]=$explode[1];		
}
fclose($description);	// Fermeture du .txt

$avant_str = array("", "", " ", " ", "\'", "<retour>");	// Préparation
$apres_str  = array(" ", " ", "", "", "'", "
");			// de la 1°regex
$resultat  = str_replace($avant_str, $apres_str, $_POST['texte']);						// Execution

$file = file_get_contents($cfg['file_to_edit'], true);
$aData=explode('|....',$file);
$nbr_data=count($aData);
foreach($aData as $key=>$value)
{
if($key%2==0)
{	
$array[$key]=$value;
$array[$key+1]=$aData[$key+1];
}
}
$avant_str2 = array($array[$titre]);													// Préparation
$apres_str2 = array($resultat);															// de la 2°regex									
$final = str_replace($avant_str2, $apres_str2, $file);									// Execution
if ($description = fopen($cfg['file_to_edit'],"w"))  // Ouverture du .txt en écriture		{													fwrite($description, $final);	// Ecriture	 
}
else
exit('Impossible d\'ouvrir le fichier');
fclose($description);	// Fermeture du .txt
///////////////////////////////////////////////////////////////////////////////////////////////////////////
}
0