suppression ligne txt mais avec tableau

Eléphanteau du PHP | 13 Messages

04 janv. 2007, 19:25

Bonjour, tout d'abord bonne année à ceux à qui je ne l'est pas encore dit!

j'ai un fichier texte dans lequel sont noté les membres bannis des serveurs de jeux de ma team.

il a la forme:
pseudo;ip;raison

ex:

Code : Tout sélectionner

gign;83.194.18.106;Raison Inconnue °•.£ørÐ.•°ÐëÐøûm;81.250.24.66;Cheat Balalaikanicolavitch;83.148.148.2;Raison Inconnue end
pour aider à la gestion je veux créer une page qui liste le contenus et permet d'en retirer. Ma page est bien lister, je coche ceux que je veux retirer, mon problème est à ce niveaux:

comment retirer les lignes dont l'ip est présente dans mon tableaux $_POST['ip']? Merci de votre aide. Ci dessous ma page:
<?

$pass = "test";
$fichier = "bans.txt"; // Nom de votre fichier

function affichage($fichier)
{
	$bgcolor1 = "#" . $_GET['bgcolor1'];
	$bgcolor2 = "#" . $_GET['bgcolor2'];
	$bgcolor3 = "#" . $_GET['bgcolor3'];
	echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"
	. "<html xmlns=\"http://www.w3.org/1999/xhtml\">"
	. "<head>"
	. "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />"
	. "<title>liste bannis</title>"
	. "<style type=\"text/css\">"
	. "<!--"
	. ".titre {"
	. "	font-size: 18px;"
	. "	color: #FF0000;"
	. "}"
	. "-->"
	. "</style>"
	. "</head>"
	. "<body>"
	. "<form method=\"post\" action=\"ban3.php?pass=" . $_GET['pass'] . "&bgcolor1=" . $_GET['bgcolor1'] . "&bgcolor2=" . $_GET['bgcolor2'] . "&bgcolor3=" . $_GET['bgcolor3'] . "\">\n"
	. "<div align=\"center\"><strong><big>Liste Joueurs Bannis</big></strong><br />"
	. "<table style=\"background: " . $bgcolor2 . ";border: 1px solid " . $bgcolor3 . ";\" cellpadding=\"2\" cellspacing=\"1\">\n"
	. "<tr style=\"background: " . $bgcolor3 . ";\">\n"
	. "<td>&nbsp;</td>\n"
	. "<td><strong>IP</strong></td>\n"
	. "<td><strong>Pseudo</strong></td>\n"
	. "<td><strong>Raison</strong></td></tr>\n";	
	$fp = fopen($fichier,"r"); // Ouverture du fichier en lecture
	while (!feof($fp)) 
	{ // Parcours du fichier
		$ligne = fgets($fp,4000); // On récupère la ligne
		preg_match('`(.*);([[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3});(.*)`',$ligne,$resultat);
		if (count($resultat) == 4)
		{	
            if (isset($j))
            {
                $bg = $bgcolor2;
                unset($j);
            } 
            else
            {
                $bg = $bgcolor1;
                $j = 1;
            } 
			echo "<tr style=\"background: " . $bg . ";\">\n"
			. "<td><input type=\"checkbox\" class=\"checkbox\" name=\"ip[]\" value=\"" . $resultat[2] . "\" /></td>\n"
			. "<td>" . $resultat[2] . "</td>\n"
			. "<td>" . $resultat[1] . "</td>\n"
			. "<td>" . $resultat[3] . "</td></tr>\n";
		}
	}
	fclose($fp);
	echo "</table><input name=\"ok\" type=\"submit\" value=\"Débannir Joueurs Selectionnés\" />&nbsp;"
	. "</form></div><br /></body>"
	. "</html>";
}

function delip($fichier)
{
	$bak = "save/" . date("d.m.Y-H.i.s") . "_" . $fichier;
	copy($fichier,$bak); 
	echo "<br /><div align=\"center\"><strong>Joueurs débannis!</strong><br /><br />";
	$fp = fopen($bak,"r"); // Ouverture du fichier en lecture
	$fp_temp = fopen("bans.txt","w+"); // Ouverture du fichier temporaire	
	//while
	$nbip = count($_POST['ip']);
	echo "tttt " . $nbip . " tttt";
	while (!feof($fp)) 
	{
		$ligne = fgets($fp,4000); // On récupère la ligne
		$nbipt = 0;
		$ipfound == false;
		while($nbipt < $nbip)
		{	
			if ($ipfound == false)
			{
				$ipfound = strpos($ligne,$_POST['ip'][$nbipt]);
			}
			$nbipt++;
		}
		if ($ipfound == false)
		{
			fwrite($fp_temp,$ligne);
		}	
	}
	fclose($fp);
	fclose($fp_temp);	
}

if (!isset($_GET['pass']) || ($_GET['pass'] != $pass))
{
	die("Page protégé");
} else
{
	if (isset($_POST['ip']))
	{
		delip($fichier);
	}
	affichage($fichier);
}

?>
Mauvais code:
	function delip($fichier)
{
	$bak = "save/" . date("d.m.Y-H.i.s") . "_" . $fichier; //emplacement ou faire sauvegarde
	copy($fichier,$bak);  // creation sauvegarde
	echo "<br /><div align=\"center\"><strong>Joueurs débannis!</strong><br /><br />";
	$fp = fopen($bak,"r"); // Ouverture du fichier en lecture
	$fp_temp = fopen("bans.txt","w+"); // Ouverture du fichier temporaire pour ecrire resultat
	$nbip = count($_POST['ip']); // on compte le nb d'ip a effacer car $_POST['ip'] contient le tableau des ip cochés pour etre effacé
	while (!feof($fp)) //on lis le fichier jusqu'a la fin 
	{
		$ligne = fgets($fp,4000); // On récupère la ligne
		$nbipt = 0; //on initialise le nombre d'ip tester
		$ipfound == false; // on initialise comme quoi l'ip n'est pas trouvé
		while($nbipt < $nbip) // tant quon a pas tester toute les ips a effacer on essaye de la trouver dans la ligne
		{	
			if ($ipfound == false) // si on trouve pas on ressaye avec ip du tabeau suivante
			{
				$ipfound = strpos($ligne,$_POST['ip'][$nbipt]);
			}
			$nbipt++; // on augmente le nb d'ip tester
		}
		if ($ipfound == false) // si apres avoir tester toute les ip du tableau $_POST['ip'] et que sa a oujours été negatif pas de position trouvé
		{
			fwrite($fp_temp,$ligne); //on écrit la ligne dans le nouveau fichier
		}	
	}
	fclose($fp); //on ferme la sauvegarde
	fclose($fp_temp); // on ferme le nouveau fichier
}

merci.
Modifié en dernier par ouiouioui le 06 janv. 2007, 20:06, modifié 3 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 janv. 2007, 10:56

A mon avis le plus simple est de lire le fichier, supprimer les ip dont tu ne veux plus (ou plutôt conserver celles que tu veux) et écraser le fichier avec le resultat obtenu.

Il te faudrait donc lire ton fichier ligne par ligne (avec fread() par exemple), puis pour chaque ligne vérifier si l'ip doit être retirée (un explode() pour récupérer l'ip de la ligne et un while pour tester chaque ip sélectionnée). Si ce n'est pas le cas et donc que la ligne doit être conservée, tu la concatènes dans une variable que tu n'auras plus qu'à utiliser pour écrire le nouveau fichier avec fwrite() :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 13 Messages

06 janv. 2007, 19:56

voila j'ai réecris en faisant comme tu dit, maintenant sa fonctionne à moitié

les lignes effacés sont pas les bonnes, je comprend pas mon erreur :cry:

j'ai édité mon 1er message avec le nouveau code et ajouter le max de commentaire sur ce que j'ai fait dans ma fonction qui ne fonctionne pas

merci.

Eléphanteau du PHP | 13 Messages

06 janv. 2007, 21:08

bon finalement j'ai trouvé:
function delip($fichier)
{
	$bak = "save/" . date("d.m.Y-H.i.s") . "_" . $fichier; //emplacement ou faire sauvegarde
	copy($fichier,$bak);  // creation sauvegarde
	echo "<br /><div align=\"center\"><strong>Joueurs débannis!</strong><br /><br />";
	$fp = fopen($bak,"r"); // Ouverture du fichier en lecture
	$fp_temp = fopen("bans.txt","w+"); // Ouverture du fichier temporaire pour ecrire resultat
	$nbip = count($_POST['ip']); // on compte le nb d'ip a effacer car $_POST['ip'] contient le tableau des ip cochés pour etre effacé
	while (!feof($fp)) //on lis le fichier jusqu'a la fin 
	{
		$ligne = fgets($fp,4000); // On récupère la ligne
		$nbipt = 0; //on initialise le nombre d'ip tester
		$ipfound = false; // on initialise comme quoi l'ip n'est pas trouvé
		while($nbipt < $nbip) // tant quon a pas tester toute les ips a effacer on essaye de la trouver dans la ligne
		{	
			if ($ipfound === false) // si on trouve pas on ressaye avec ip du tabeau suivante
			{
				$ipfound = strpos($ligne,$_POST['ip'][$nbipt]);
			}
			$nbipt++; // on augmente le nb d'ip tester
		}
		if ($ipfound == false) // si apres avoir tester toute les ip du tableau $_POST['ip'] et que sa a oujours été negatif pas de position trouvé
		{
			fwrite($fp_temp,$ligne); //on écrit la ligne dans le nouveau fichier
		}	
	}
	fclose($fp); //on ferme la sauvegarde
	fclose($fp_temp); // on ferme le nouveau fichier
}

par contre je voudrais l'avis d'un expert est-ce la bonne méthode ou c'est pas optimisé du tout et une autre méthode plus rapide éxiste?

merci.