supprimer ligne dans un fichier texte

Petit nouveau ! | 3 Messages

08 juil. 2008, 16:23

bonjour,

voila mon probleme je fais un formulaire dans lequel l'utilisateur rentre son login je vais ensuite le crypter puis le comparer à des logins présents dans un fichier texte (eux aussi cryptés).
J'aimerais que lorsque le login entré par l'utilisateur est présent dans le fichier texte je le supprime.
voila mon code:

<html>
<p>
Veuillez entrer le login &agrave; rajouter
</p>
<form action="login.php" method="post">
<p>
<input type="text" name="login"/> <input type="submit" value="Valider"/>
</p>
</form>

</html>
<?php
$trouver= false;
if(isset($_POST['login'])){ //verification de l existance de la variable
if(!empty($_POST['login'])){ //verification si elle est n est pas vide
$login = md5(stripslashes($_POST['login']));
$fd = 'loginCrypter.txt';
$fichier= file($fd);
foreach( $fichier as $key=>$ligne) {
$ligne = substr($ligne, 0, strlen($ligne)-2); //on enleve l espace en fin de la ligne
$ligne = strtolower($ligne);//mise en minuscule du login ds le tableau
$cmp= strcmp($login, $ligne);
if (empty($cmp)){
$trouver=true;
}
if ($trouver==true){
//supprimer le login dans le fichier texte
}
}
}
}

Mammouth du PHP | 1353 Messages

08 juil. 2008, 16:44

Je ne comprends pas trop où tu veux en venir mais en tous cas pour moi la solution est la suivante :

Si tu trouves l'id à supprimer, tu stockes le numéro de la ligne (le $key de ton tableau).

Exemple :
	if (empty($cmp)){ 
		$position = $key;
		} 
Une fois la boucle de vérification terminée, si la position de la ligne à supprimer est définie cela veut dire qu'elle a été trouvé, donc tu supprimes cette valeur de ton tableau $fichier
unset($fichier[$position]);
(tu es obligé de faire cela lorsque la boucle foreach est terminée car tu ne peux pas modifier les index d'un foreach à la volée...)

Une fois que c'est fait, tu ouvres ton fichier en écriture (ce qui va l'effacer) et tu copies toutes les autres lignes... un truc du genre :
	if (!$fp = fopen($fd, 'w+'))
    {
        print "Cannot open file ($fd)";
        exit;
     }
    else
    {
        // write the array to the file
        foreach($fichier as $ligne) { fwrite($fp,$ligne); }

        // close the file
        fclose($fp);
	}
Comme ca ca copie toutes les lignes de l'ancien fichier, sauf celle supprimée, dans le nouveau.

Sinon, petite remarque :
if(isset($_POST['login'])){ //verification de l existance de la variable 
if(!empty($_POST['login'])){ //verification si elle est n est pas vide 
Tu peux te contenter de
if(!empty($_POST['login'])){ //verification si elle est n est pas vide 
car si la variable est pas définie le empty renvoi true.
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 398 Messages

08 juil. 2008, 16:47

Met le code entre les balises
 et 
je t'ai dis ^^.

J ai tenté de mettre ceci mais apparement ça ne fonctionne pas :
if ($trouver == true){
	echo '<p> Votre login a &eacute;t&eacute; supprim&eacute;</p>';
	//supprimer le login dans le fichier texte
	$fichier = file_get_contents($fd); 
	$ligne = '/'.$ligne.'/';
	preg_replace($ligne,'',$fichier);
	file_put_contents('fichier.txt' , $fichier); 
}
Les str_replace et ereg_replace apparement en fonctionnent pas. Je n ai pas trouvé de solution, si quelqu'un en a une... :/
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Mammouth du PHP | 1353 Messages

08 juil. 2008, 16:55

Le file_put_contents() est équivalent au bloc que j'ai proposé avec fopen fwrite et fclose et effectivement peut fonctionner après le unset, si toutefois tu es en php5 uniquement.
Sur quelle version de php travailles tu ?
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Petit nouveau ! | 3 Messages

08 juil. 2008, 17:10

je travaille avec la version 5 j'ai essayé ton bout de code voila l'erreur:

Fatal error: Can't use function return value in write context in C:\wamp\www\test\login.php on line 32

Mammouth du PHP | 1353 Messages

08 juil. 2008, 17:18

Quel bout de code as tu essayé ? Le mien ou celui de BaLiSTiK ?

Poste ton code actuel stp (entre les balises

Code : Tout sélectionner

[php][/php]
) en nous indiquant quelle est la ligne 32 :)
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Petit nouveau ! | 3 Messages

08 juil. 2008, 17:50

j'ai essayé le tien voila mon code:

$trouver= false;
if(isset($_POST['login'])){ //verification de l existance de la variable
    if(!empty($_POST['login'])){ //verification si elle est n est pas vide
$login = md5(stripslashes($_POST['login'])); 
		 $fd = 'C:\Users\sonia\Documents\logica\loginCrypter.txt';
		$fichier= file($fd);	
					foreach( $fichier as $key=>$ligne) {
			 $ligne = substr($ligne, 0, strlen($ligne)-2); //on enleve l espace en fin de la ligne
             $ligne = strtolower($ligne);//mise en minuscule du login ds le tableau
			 $cmp= strcmp($login, $ligne);
			 if (empty($cmp)){
			 $position= $key;		 			 
			 }
			 }
			 if (isset($position)){		 	
			 unset($fichier($position)); //ICI L'ERREUR
        }
		$fp = fopen($fd, 'w+')) 
		foreach($fichier as $ligne) { fwrite($fd,$ligne); } 
		fclose ($fd);
}
}


Mammouth du PHP | 1353 Messages

11 juil. 2008, 11:02

Il y a plusieurs erreurs dans ton code.

La première (le message d'erreur) c'est que $fichier est un tableau, il faut donc faire
unset($fichier[$position]);
avec des [] et non pas des ()

Ensuite dans le bloc d'en dessous il y a une parenthèse en trop, un ; qui manque et deux références à $fd à la place de $fp. Voici la correction :
        $fp = fopen($fd, 'w+'); 
        foreach($fichier as $ligne) { fwrite($fp,$ligne); }  
        fclose ($fp); 
Voila qui devrait mieux marcher.

Apres je ne connais pas la structure de ton fichier mais fait quand meme un echo de chaque ligne au moment de la création de $fichier parce que le fait de couper avec le substr peut etre un probleme sur la derniere ligne du fichier...
Tell me and I forget. Teach me and I remember. Involve me and I learn.