Modifier chaine fichier texte

sly456328971 Messages postés 20 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 15 novembre 2010 - 3 nov. 2010 à 14:08
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 - 3 nov. 2010 à 19:52
Bonjour,

je cherche à remplacer une chaine dans une fichier texte sans succes :

if (isset($_GET['ajout'])) // Si on demande de supprimer une ligne
{
$tab = file("affichage.txt");
$num_ligne =1;
for ($i = 0; $i<count($tab);$i++)
{
$position=explode('|',$tab[$num_ligne-1]);
$position[2]='faux';
$num_ligne++;					
}	
header('Location: index.php'); // on recharge cette page pour la réactualiser		
}


Merci de m'aider

13 réponses

cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
3 nov. 2010 à 14:32
salut

<?php

$a_virer="ma ligne à enlever";

$fichier="affichage.txt"; // tu adaptes

//ouverture en lecture et modification 
$text=fopen($fichier,'r') or die("Fichier manquant"); 
$contenu=file_get_contents($fichier); 
$contenuMod=str_replace($a_virer,'',$contenu); 
fclose($text); 

//ouverture en écriture 
$text2=fopen($fichier,'w+') or die("Fichier manquant"); 
fwrite($text2,$contenuMod); 
fclose($text2); 

?> 

0
sly456328971 Messages postés 20 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 15 novembre 2010
3 nov. 2010 à 14:39
Salut cod57 et merci !!

Mon probleme est que mon fichier texte contient :

Truc1|Machin1|faux
Truc2|Machin2|faux
Truc3|Machin3|vrai

J'aimerais ne pas modifier ni supprimer la ligne entiere mais uniquement modifier le troisieme parametre !!
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
3 nov. 2010 à 14:46
C'est pas plus compliqué dans

$a_virer = "Truc1|Machin1|faux";
$new = "Truc1|Machin1|juste";

// tu comprendras

$contenuMod=str_replace($a_virer,'',$contenu);

devient

($a_virer, $new, $contenu)

si tu as beaucoup de lignes écrit une fonction avec un while ...
0
sly456328971 Messages postés 20 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 15 novembre 2010
3 nov. 2010 à 14:56
Mon souci est que je ne peut pas écrire
$a_virer = "Truc1|Machin1|faux";
car je ne connai pas le contenu du fichier celui ci étant alimenté dynamiquement.

Je ne sais pas si tu as fais attention à ma premiere fonction mais c'est lorsqu'un utilisateur clique sur un lien correspondant à une ligne dont je récupére l'id, je modifie cette ligne. Je ne connais donc pas à l'instant t le contenu de la ligne qui devra etre modifié.

Ce n'est pas possible de remplacer le deuxieme parametre avec un explode ?

Merci encore !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
3 nov. 2010 à 15:11
$_GET['ajout'] c'est la ligne ? une condition ...

$_GET['ajout'] c'est ce que moi j'appelle $a_virer ?
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
3 nov. 2010 à 15:17
0
sly456328971 Messages postés 20 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 15 novembre 2010
3 nov. 2010 à 15:32
Non, $_GET['ajout'] fait référence à cela dans ma page php :

print "<td></td>";


S'il clique sur l'image on récupére l'id et je veux aller modifier le troisieme parametre du fichier de la ligne correspondante à l'id.
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
3 nov. 2010 à 15:52
oui

if(isset($_GET['ajout']) && !empty($_GET['ajout')){

$id=$_GET['ajout']);

// $rows ligne de la table ou il y a le $id
// la tu recupéres la ligne à partir de $id
// select * from table where id=$id ... mysqle_query() ... tati tata
// tu construis ta ligne

$a_virer = $rows['truc'].'|'.$rows['truc'].'|faux';

$new = $rows['truc'].'|'.$rows['truc'].'|vrai';

$text=fopen($fichier,'r') or die("Fichier manquant");
$contenu=file_get_contents($fichier);
$contenuMod=str_replace($a_virer,'',$contenu);
fclose($text);

//ouverture en écriture
$text2=fopen($fichier,'w+') or die("Fichier manquant");
fwrite($text2,$contenuMod);
fclose($text2);


}
0
sly456328971 Messages postés 20 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 15 novembre 2010
3 nov. 2010 à 16:05
J'ai réussi a faire une partie de ce que je voulais avec ceci :

if (isset($_GET['ajout'])) // Si on demande de supprimer une ligne
{	
$content = file('affichage.txt');
$num = 0;
$data = explode('|',$content[$num]);
$data[2] = "vrai\r\n";
$content[$num] = implode('|', $data);

file_put_contents('affichage.txt', $content);

}


Cela ne marche que lorsque le num de la ligne est à 0. J'aimerais l'adapter avec ton exemple précédent pour qu'il exécute ceci pour la ligne X correspondant à l'id récupéré dans l'url.
0
sly456328971 Messages postés 20 Date d'inscription mardi 26 octobre 2010 Statut Membre Dernière intervention 15 novembre 2010
3 nov. 2010 à 16:19
Lorsque je mets ceci $id=$_GET['ajout']); il ne m'affiche plus rien synonyme d'erreur.

// la tu recupéres la ligne à partir de $id
// select * from table where id=$id ... mysqle_query() ... tati tata : je ne fonctionne qu'avec des fichiers texte et pas de BDD Mysql
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 nov. 2010 à 19:00
Salut,

@Cod57 :
C'est à mon avis une mauvaise idée que de procéder ainsi (str_replace())
Que se passe t-il si des lignes contiennent la même chaîne ??
Les infos que donne Sly456328971 laisse supposer qu'il n'y a pas de lignes identiques, mais bon, je trouve ce qui suit plus propre, car ça répond à la demande "modifier "la troisième colonne d'un csv" d'une ligne x donnée", et non "modifier une chaîne de caractères"
On pourrait toujours titiller et utiliser les fonctions *csv() ou explode(), mais pour le coup ça n'apporterait vraiment rien de plus.


$aContent = file('affichage.txt');
$sReplace = 'la valeur de remplacement';

$aContent[$_GET['ajout']-1] = substr_replace($aContent[$_GET['ajout']-1], $sReplace, (strrpos($aContent[$_GET['ajout']-1], '|')+1)).PHP_EOL;

file_put_contents('affichage.txt', implode($aContent));




Kohntark -
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 nov. 2010 à 19:08
J'ai oublié de préciser qu'il est impératif de tester les variables externes ($_GET, $_POST, ...) Sans ça ton fichier risque de ne pas vivre longtemps, et ça peut potentiellement poser des problèmes de sécurité.

En ce qui concerne le $_GET['ajout'] qui permet de supprimer une ligne ( je vois comme un non sens là) tu attends un integer; teste donc que cette valeur est correcte, sinon tu vires.
Il faut également gérer les erreurs (pb ouverture fichier, demande de suppression d'une ligne inexistante, etc ...), ce que je ne fais pas dans le code exemple précédent.

Cordialement,


Kohntark -
0
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
3 nov. 2010 à 19:52
@Kohntark en effet ma méthode est brutale c'était une piste ...
oui la répétition j'y ai pensé mais comme il ne peut y avoir qu'un
couple par ligne je suppose

machin1|truc1|faux
machin2|truc2|faux bref.

c'est pour un jeu je crois ?

autrement ta méthode est plus sophistiquée et le code optimisé
je garde ce code en reserve merci !
0
Rejoignez-nous