limiter le nombre de ligne inséré dans un fichier texte

Petit nouveau ! | 6 Messages

12 juin 2006, 12:58

Bonjour,

Actuellement je cherche à utiliser cette fonction:
http://www.phpfrance.com/tutoriaux/inde ... s-fichiers
pour créer un petit chat simple genre tagger.
Seulement il me manque deux "fonctions" que je n'arrive pas à faire
1 - n'enregistrer qu'un vingtaine de lignes dans le fichier texte
2 - que la dernière ligne ecrite s'ajoute en haut du fichier texte
J'ai bien essayé la fonction

Code : Tout sélectionner

rewind(); fputs($fb,\n); rewind(); fput($fb,$mon_message);
mais ça ne fonctionne pas...
l'option fopen est (a)

Merci d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 juin 2006, 13:49

rewind() ne fait que rembobiner le fichier lu d'une façon séquentielle.
elle ne permet pas l'insertion de lignes.
D'ailleurs ce n'est pas possible d'insérer une ligne dans les lignes existantes celon l'organisation séquentielle.
Ceci dit il faut passer par un traitement :
  • Si la limite des lignes à enregistrer n'est pas atteinte :
    1. insérer la nouvelle ligne dans un tableau à la case n° 0
    2. lire les lignes existantes et les verser dans le tableau à partir de la case n°1
    3. enregistrer ce tableau dans le fichier en mode écriture (remplacement de tous)
Comment?
<?php 
//lire l'existant du fichier 
$existant = @file ("mon_fichier.txt"); //$existant est un tableau 

//Règle d'enregistrement : enregistrement limité à 20 lignes
if (count($existant) >= 20){
	echo "<p>Limite d'enregistrement atteinte!";
	exit;
}

//insérer la nouvelle ligne dans un tableau 
$t[0] = "donnée1;donnée2;donnée3;....."; 

//verser $existant dans $t à partir de la case n°1 
$case = 1; 
if ($existant) foreach ($existant as $ligne){ 
    if ($ligne) {
		$t[$case] = $ligne; 
		$case++;
	}
} 

//Remplacer le fichier existant
@unlink("mon_fichier.txt"); //suppression
if (file_put_contents("mon_fichier.txt", implode("\n", $t) )) //enregistrer le contenu de $t sous forme de texte multilignes 
	echo "<p>Enregistré.";
else echo "<p>Erreur d'enregistrement!";

?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 6 Messages

12 juin 2006, 23:57

Bonjour Sadeq,

J'ai essayé de mettre en pratique ton script mais malheureusement je n'ai pas la version 5 de PHP alors la fonction "file_put_contents" ne fonctionne pas sur mon server.
J'ai donc modifié comme tel selon les instructions du manuel PHP mais j'ai l'erreur: "Parse error: parse error, unexpected T_STRING in refresh.php on line 31"
line 31 -> fwrite(implode("\n", $t)).

Code : Tout sélectionner

<?php //lire l'existant du fichier $existant = @file ("messages.txt"); //$existant est un tableau //Règle d'enregistrement : enregistrement limité à 20 lignes if (count($existant) >= 20){ echo "<p>Limite d'enregistrement atteinte!"; exit; } //insérer la nouvelle ligne dans un tableau $t[0] = "'pseudo', 'message'"; //verser $existant dans $t à partir de la case n°1 $case = 1; if ($existant) foreach ($existant as $ligne){ if ($ligne) { $t[$case] = $ligne; $case++; } } //Remplacer le fichier existant @unlink("messages.txt"); //suppression if ( fopen("messages.txt") //ouverture du fichier texte fwrite(implode("\n", $t)) //enregistrer le contenu de $t sous forme de texte multilignes fclose()) //refermer le fichier texte echo "<p>Enregistré."; else echo "<p>Erreur d'enregistrement!"; ?>
Il y a un point sur lequelle je me suis mal exprimé et qui change un peu tout c'est que je veux limiter la longeur de mon fichier à 20 lignes mais sans pour autant le verrouiller des ce quotta atteint.
Le but étant d'en faire un mini-chat, ce serait dès la 20ème ligne supprimer la première et ne garder que les 20 lignes les plus récentes.. :?

Eléphant du PHP | 451 Messages

13 juin 2006, 07:46

Hum, ton fwrite() est bizare, il manque le 'ressource handle' (descripteur de fichier) que tu dois récupérer avec le fopen.
D'autre part pour eviter les accès concurents, à ta place, j'essayerais d'utiliser flock.
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)