Non è che mi sono alzato stamattina ed ho aperto un file a caso di joomla ed ho cominciato a cancellare qualche parola strana qui e la e ad aggiungere altre robe che non stanno ne in cielo ne in terra.
Progammo in c++ e java da diversi anni, con il php ho iniziato da poco, ma non è molto differente dai linguaggi che conosco. Certo non sono così presuntuoso da dire che già domani faccio un bel componente, ma per qualche stupida modifica tipo quella che stò facendo credo di esserne capace, anche perchè ne ho già fatte alcune di modifiche su alcuni file ed il risultato l'ho ottenuto.
per quanto riguarda il metodo fgets() ti assicuro che legge riga per riga, prima di provarlo mi sono informato sul sito di php alla pagina
http://php.net/manual/en/function.fgets.php dove c'è proprio l'esempio "Reading a file line by line". Credo legga una riga contenente al massimo 4096 byte, ed un indirizzo email ne contiene parecchi di meno.
Ho anche visto il metodo fgetc() che legge carattere per carattere.
I metodi suggeriti da te li ho provati, ma file_get_contents() inserisce in un unica stringa tutto il file e quindi il controllo non si potrebbe fare; il metodo file() è ottimo, crea un array riga per riga ma quando sono andato per leggerlo con un for tipo:
...
...
$var2=file("spamlist.txt"); //estraggo l'array dal file .txt
$i=count($var2); //conto gli elementi nell'array
for($a=0; $a<=$i; $a++){ //uso il ciclo for per guardare nell'array
$buffer=$var2[$a];
...
...
nella variabile $buffer quando vado a stamparla me la da cmq vuota.
Tengo a precisare che il file txt lo vede e che il numero di righe del contatore $i le vede correttamente (stampata a video la variabile i).
per quanto riguarda il mio "esperimento" precedente ho notato che ad ogni riga tranne l'ultima inserisce due caratteri spazio anche se nel file txt non c'è (il carattere a capo lo vede come doppio spazio insomma), quindi l'indirizzo email da controllare risulterà ovviamente differente da quello inserito poichè questo carattere spazio inficia l'uguaglianza.
Allora ho risolto in maniera davvero brutta e brutale, ma almeno funziona:
$lista=fopen("spamlist.txt","r"); //apre il file
while (!feof($lista)) {
$buffer = fgets($lista,4096); //prende la riga , ma aggiunge un doppio spazio
$rest = substr($buffer, 0, -2); // tronca di due caratteri finali la stringa precedente
if($rest==$this->email){
fclose ($lista); //chiude il file
$this->setError( JText::_( ' Indirizzo presente nella lista spam ' ) );
return false;
}
}
fclose ($lista); //chiude il file
unica accortezza e che anche l'ultimo indirizzo email inserito nel file txt deve avere alla fine "a capo" altrimenti verrebbe troncato. Il file spamlist.txt va inserito nella root del sito web.