Newsgroup: it.comp.www.php
Titolo: Eliminare una riga in un file

Sto creando il mio primo script in php, una mailing list molto semplice.
Grazie a voi ho risolto molti problemi ma ora mi trovo di fronte ad un
ostacolo che per quanto credo sia semplice da risolvere non mi permette di
andare avanti.
Il problema e' questo:
gli indirizzi vengono conservati in un file (l'ho lasciato senza estensione
per comodita') uno per riga.
Con un ciclo faccio stampare a video al php una serie di form quanti sono
gli indirizzi. Ogni form ha un text field con dentro l' indirizzo nel file
ed accanto un tasto submit. I tasti submit puntano ad un file esterno dove
vorrei far avvenire la cancellazione.
Come posso fare a cancellare o modificare gli indirizzi?
Grazie 1000 a tutti e W il PHP!
Danilo

Nessuno ha idee su come aiutarmi? Io non riesco proprio a venirne a caso, mi
basterebbe anche del codice di una ml da guardare che fa cio che mi serve
oppure sapere il ragionamento logico da fare qual' e'.
Grazie nuovamente a tutti
Danilo

Come posso fare a cancellare o modificare gli indirizzi?
Devi ricreare il file con tutti gli indirizzi TRANNE quello. E' l'unico
modo.
Leonardo
-- 
".signature": bad command or file name

 Leonardo
uffa, speravo di sentire una risposta da quella che già sapevo. Se davvero
non c'è altro modo vi voglio avvertire: il server ha i suoi tempi per
scrivere un file, anche se brevissimi. Maneggiando file molto lunghi bisogna
fare molta attenzione a come vengono scritti i file. Io ho un programma che
manipola continuamente un file che va oltre i 500Kb, quindi neanche tanto, e
a volte, forunatamente solo a volte, il file mi viene troncato. Il file in
questione veniva letto, cambiato, scritto, riletto, riscritto ecc.. un po'
di volte. Attenzione =)

di volte. Attenzione =)
Prima di usare i semafori, facevo qualcosa del tipo:
	$status = "OK";
	for ($try = 0; $try < $maxtries; $try++)
	{
		$newname = randomfile();
		if (file_exists("$filename"))
		{
			rename($filename, $newname);
			if (file_exists($newname))
			{
				$status="OK";
				break;
			}
		}
		clearstatcache();
		sleep(1);
		$status = "FAILED";
	}
	if ($status == "FAILED")
	{
		...
	}
	// Qui si legge il file $newname, e si salvano i risultati
	// in un TERZO file, "$newname.NEW"
	rename("$newname.NEW", "$filename");
	unlink("$newname");
Tutte le sessioni concorrenti si beccano randellate nelle gengive TRANNE
una, che e' quella che passa al file system e ha successo con la rename,
e il FS garantisce che sia una sola, ovviamente, usando dei kernel locks
dei quali non dobbiamo preoccuparci.
Le altre sessioni dormono la maggior parte del tempo. Il file rimane NON
DISPONIBILE finche' e' in modifica, e l'operazione che lo rende di nuovo
disponibile e' atomica (rename, garantisce il FS :-) ).
Ovviamente, qualsiasi punto dove compaia
	$fp = fopen($filename, "r");
dovra' diventare
	while (!($fp = fopen($filename, "r"))
		sleep(1);
...e bisogna essere sicuri che il FS non consenta una rename() ai files,
se sono aperti, oppure mantenga i flussi coerenti, se lo sono. Linux qui
non ha problemi (rename() non cambia gli inodes), per cui io posso senza
alcun problema LEGGERE dal file che e' NON DISPONIBILE :-)... e lo leggo
COSI' COM'ERA PRIMA DELLA MODIFICA. Per quanto riguarda i lettori, tutto
il file risulta leggibile e intatto, e la modifica "sembra" richiedere i
pochi millisecondi richiesti dalla rename(), indipendentemente da quanto
e' lungo il file.
Si puo' fare di MOLTO meglio, anche con i files, sia chiaro :-)


 ...[...]