Sostituire una riga specifica in un file di testo senza cancellare il rimanente

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Ciao a tutti,

sto cercando di sostituire una riga specifica all'interno di un file di testo. Sono già riuscito a fare questo, ma solo in parte. In particolare, con un ciclo while controllo gli utenti all'interno di un file di testo, con lo scopo di trovare l'utente che sta effettuando al momento l'attivazione dell'account. Vi mostro come funziona il mio codice:

Codice:
function Login($username,$email,$password,$activate)
{
      $count = 0;
      $temp = array();
      if(file_exists("utenti.txt") == true)
      {
             $handle = fopen("utenti.txt","a+");
             if($handle)
             {
                    while(($line = fgets($handle)) !== false)
                    {
                          $count++;
                          $temp[$count] = $line;
                          $array = explode(";" , $temp[$count]);
                          if($array[0] == $email)
                          {
                                if($array[1] == $username)
                                {
                                       if($array[2] == $password)
                                       {
                                             if($array[3] == $activate)
                                             {
                                                   $filename = "utenti.txt";
                                                   $lines = file($filename);
                                                   $lines[$count] = "yes;" . "\r\n;"; //qui sostituisco la riga dell'utente da attivare
                                              ...
                                             }else... //ci sono gli else ma non sono importanti
                                       } 
                                }
                          }
                    }
             }
      }
}

Come potete vedere in
Codice:
 $temp[$count];
salvo la linea corrispondente, e poi confronto l'array splittato con i vari indici passati alla funzione. Quello che sto cercando di fare è di inserire alla fine della riga dell'utente da attivare la scritta "yes", questo il codice lo fa, ma il problema è che se io ho per esempio:

utente A
utente B
utente C

e l'utente B sceglie di attivarsi, allora automaticamente nel file "nuovo" avrò utente A e utente B, mentre C verrà cancellato; questo perché il ciclo while non è ancora terminato.
Non so se esiste un meccanismo meno complesso del mio e più efficace, mi affido a voi esperti nella speranza di riuscire a risolvere.

Buona giornata. :fonzie:
 

BayLollo

Utente Attivo
28 Ago 2014
84
0
6
Potresti "prendere" il file con file_get_contents(), modificare la stringa con substr_replace() (e strpos()), aprire il file con fopen() in modalità "w+" (lo apre in scrittura e lettura, cancellandone il contenuto) e scrivendoci il testo modificato con fwrite().
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Ciao, seguendo i tuoi consigli ho provato a modificare la funzione come segue:

Codice:
function login($username,$email,$password,$activate)
{
	$count = 0;
	$temp = array();
	$open = fopen("utenti.txt", "w+");
	$filename = file_get_contents("utenti.txt"); //utilizziamo questa modalità per accedere alle linee specifiche del file
	if(file_exists("utenti.txt") == true)
		{
			$handle = fopen("utenti.txt", "a+");
			if($handle) 
			{
				while (($line = fgets($handle)) !== false) 
				{
					$count++;
					$temp[$count] = $line;
					$array = explode(";", $temp[$count]);
					if($array[0] == $email) //eseguiamo una serie di condizioni a cascata per controllare la correttezza dei valori inseriti
					{
						 	if($array[1] == $username)
						 	{
								if($array[2] == $password)
								{
									if($array[3] == $activate)
									{	
										/*$filename = "utenti.txt";
                                        $lines = file($filename);
                                        $lines[$count] = "yes;" . "\r\n;"; //qui sostituisco la riga dell'utente da attivare
										file_put_contents($filename,implode($lines),FILE_APPEND);	*/
										$findme   = 'no';
										$pos = strpos($temp[$count], $findme); //qui sarà salvata l'esatta posizione
										if ($pos === false) 
										{
											echo "L'utente corrente è già stato attivato!";
										}
										else 
										{
											$activation_string = $temp[$count] . "yes";
											$replace_string = substr_replace($pos, $activation_string, 0);
											fputs($open, $replace_string); //qui passo il buffer
										}
										//l'utente è riuscito ad attivare il suo account
										//header("Location: home.php?username=".$username."&email=".$email."&password=".$password); 	
									}else{echo "Il codice di attivazione non corrisponde! Inseriscilo nuovamente"; exit;}
								}else{echo "La password inserita non è corretta";}
						 	}else{echo "L'username inserito non è corretto"; }
					}else{echo "L'email non è presente nei nostri database";}
				}
			} 
			else 
			{
				echo "Sembra che l'archivio sia stato danneggiato o non è disponibile!";
			} 
			fclose($handle); 
		}
		else
		{
			echo "L'archivio è danneggiato!";
		}	
}

Il problema è che il file viene cancellato tutto e non capisco il motivo, cosa c'è che non va in questo codice?
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Quando la registrazione di un utente viene completata ecco la singola riga come si compone:

[email protected];Heisenberg;123;roLHATOmcq;no;

ti spiego i vari indici:

[email protected] -> email utente registrato
Hesinberg -> Username
123 -> Password
roLHATOmcq -> Codice casuale che viene generato casualmente
no -> stato dell'attivazione (il codice postato in alto dovrebbe aggiungere: yes)
 

BayLollo

Utente Attivo
28 Ago 2014
84
0
6
PHP:
<?php
function login($username,$email,$password,$activate) {
    $file = file_get_contents("utenti.txt"); //ottengo il contenuto di utenti.txt
    
    if(strpos($file, $email)) { //cerco nel file l'e-mail e controllo se è stata trovata
        if(strpos($file, $username)) { //cerco nel file l'username e controllo se è stata trovato
            if(strpos($file, $password)) { //cerco nel file la password  e controllo se è stata trovata
                $account = $email . ";" . $username . ";" . $password . ";"; //combinazione email-username-password
                $find_account = strpos($file, $account) //cerco la combinazione email-username-password
                if($find_account) { //controllo se riesco a trovare l'account con la combinazione data
                    $fo = fopen("utenti.txt", "w+"); //apro il file per la lettura e scrittura e ne cancello il contenuto
                    if($fo) {
                        if(strpos($account . "no;")) { //controllo se è possibile trovare l'account con "no;"
                            $newfile = str_replace($account . "no;", $account . "yes;", $file); //sostituzione della riga con 'no;' con 'yes;'
                            fwrite($fo, $newfile); //scrivo nel file la nuova versione con "yes;" di fianco all'account
                            fclose($fo); //chiudo il file
                        } else {
                            echo "L'account non ha 'no;'"; // (?)
                        }
                    } else {
                        echo "Non è stato possibile aprire il file";
                    }
                } else {
                    echo "Account non trovato.";
                }
            } else {
                echo "Password non trovata";
            }
        } else {
            echo "Username non trovato.";
        }
    } else {
        echo "Email non trovata.";
    }
}
?>

È abbastanza basic. Non conoscevo la funzione di $activate e del codice casuale.
Non ho avuto modo di testarlo, ma l'ho controllato e dovrebbe essere OK.
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Innanzitutto ti ringrazio per il tuo prezioso tempo.
Il codice mi dice che la mail non è stata trovata. Ho provato a fare una echo di $email e di $file e ottengo in email:
la mail che è stata passata alla funzione, in file: l'intera riga.
Ora non conosco la funzione strpos(); ma sei sicuro che va a leggere l'intera riga?
 

BayLollo

Utente Attivo
28 Ago 2014
84
0
6
strpos() restituisce, in questo caso, la posizione di $email all'interno di $file.
 

BayLollo

Utente Attivo
28 Ago 2014
84
0
6
No, sia perché una parentesi la devi spostare in fondo, sia perché significherebbe che $email è stato trovato alla posizione 0.
Appena sono da PC testo il codice.
 

BayLollo

Utente Attivo
28 Ago 2014
84
0
6
OK, testato e funzionante: ho modificato i controlli con strpos() aggiungendo null !==, ho aggiunto la scrittura della vecchia versione del file in caso di errore nel trovare l'account con 'no;' e ho corretto alcuni errori di distrazione (es. mancanza di punto e virgola a fine riga).

PHP:
<?php
function login($email, $username, $password) {
    $file = file_get_contents("utenti.txt"); //ottengo il contenuto di utenti.txt
    
    if(null !== strpos($file, $email)) { //cerco nel file l'e-mail e controllo se è stata trovata
        if(null !== strpos($file, $username)) { //cerco nel file l'username e controllo se è stata trovato
            if(null !== strpos($file, $password)) { //cerco nel file la password  e controllo se è stata trovata
                $account = $email . ";" . $username . ";" . $password . ";"; //combinazione email-username-password
                if(null !== strpos($file, $account)) { //controllo se riesco a trovare l'account con la combinazione email-username-password
                    $fo = fopen("utenti.txt", "w+"); //apro il file per la lettura e scrittura e ne cancello il contenuto
                    if($fo) {
                        if(null !== strpos($file, $account . "no;")) { //controllo se è possibile trovare l'account con "no;"
                            $newfile = str_replace($account . "no;", $account . "yes;", $file); //sostituzione della riga con 'no;' con 'yes;'
                            fwrite($fo, $newfile); //scrivo nel file la nuova versione con "yes;" di fianco all'account
                            fclose($fo); //chiudo il file
                        } else {
                            echo "L'account non ha 'no;'"; // (?)
                            fwrite($fo, $file); //riscrivo nel file la vecchia versione
                            fclose($fo); //chiudo il file
                        }
                    } else {
                        echo "Non è stato possibile aprire il file";
                    }
                } else {
                    echo "Account non trovato.";
                }
            } else {
                echo "Password non trovata";
            }
        } else {
            echo "Username non trovato.";
        }
    } else {
        echo "Email non trovata.";
    }
}
?>

Dimmi se qualcosa non ti è chiaro ;)
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Ciao,

a te sostituisce no con yes? Perché a me non lo fa, però il bug che non trovava adesso sembra essere fixato.
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
UPDATE:

Ho rivisto ora il codice e ho fixato anche questo bug, in pratica non gli veniva passata la riga correttamente ma ora si.
Grazie infinite per l'aiuto sei stato molto gentile :)

Ti auguro una buona giornata.
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Ti consiglio di utilizzare un database per salvare informazioni e dati di questo tipo.


Inviato dal mio iPhone utilizzando Tapatalk
 
Discussioni simili
Autore Titolo Forum Risposte Data
L sostituire un carattere in una stringa acquisita da input jQuery 1
P Sostituire immagine in una cartella. PHP 6
C In una textarea sostituire il carattere \n in <br/> Javascript 14
A Sostituire una sottostringa a una stringa data PHP 11
D Sostituire img con altre img Photoshop 1
P [MS Access] Sostituire un carattere in tutta la tabella MS Access 11
Shyson [MySQL] Sostituire testo in in articolo MySQL 0
elpirata [MySQL] Sostituire valori campi con dati casuali MySQL 4
P [Photoshop] Sostituire i colori in modo preciso Photoshop 0
C [PHP] SOSTITUIRE VALORI DENTRO STRINGA PHP 0
elpirata [PHP] Sostituire if ed elseif con operatore ternario switch PHP 9
L [PHP] Sostituire link da stringa PHP 3
ecosito [WORDPRESS] Sostituire la cartella d'installazione? WordPress 2
S [Javascript] Sostituire elemento HTML preso randomicamente dentro array Javascript 1
M Sostituire le funzioni mysql con mysqli, ma quali? PHP 4
S Sostituire link con button. PHP 1
M sostituire parte di URL con espressioni regolari PHP PHP 8
Marco_88 Come sostituire valori in un campo per più oggetti. MySQL 2
A sostituire "onload" nel tag <img> con Js Javascript 17
max_400 Sostituire un div con un altro il comando innerHTML è bloccato Javascript 0
C Sostituire virgola con punto form PHP 2
P sostituire form con jquery jQuery 0
F sostituire un'immagine con jquery jQuery 2
felino Temperatura processore: soglia massima per sostituire pasta termica Hardware 2
Trapano sostituire iframe PHP 5
C Sostituire molte righe di codice PHP 2
S sostituire codice html in molti file HTML e CSS 1
N [RISOLTO] Sostituire Input con a href PHP 10
Shyson Sostituire onclick Javascript 2
M sostituire bottone con onchange submit Javascript 7
S Sostituire immagini in sequenza Javascript 4
C Sostituire il comando body onload Javascript 30
Erzsébeth Sostituire richiamo immagini PHP 4
IImanuII Php sostituire un iframe PHP 4
zighy Sostituire dati database PHP 7
M sostituire un valore con un altro corrispondente PHP 11
L Sostituire file_get_contents ? PHP 10
N leggere/sostituire/restituire file txt PHP 1
Z Onclick : sostituire odiosi "button" con semplici Links Javascript 13
U Sostituire le funzionalità di un pulsante con un testo HTML e CSS 0
S E' possibile sostituire un dominio con un altro? Domini 4
webbetto Sostituire un campo vuoto Database 4
P C# Salvare una colonna del DataGridView XML 0
M pulsante per aprire una maschera che contiene controllo schede MS Access 0
M Leggere in un report il valore di una casella combinata di una maschera Database 0
D Miglior modo per estrarre le occorrenze di un elemento in un set di più file xml e quindi scrivere il risultato in una tabella Excel o magari in JSON XML 0
S [VB.NET]: Coordinate immagini dentro una PictureBox Visual Basic 0
I stampare una stringa echo PHP 2
MarcoGrazia Riprendere una sessione interrotta PHP 0
L Rendere una parte trasparente Photoshop 3

Discussioni simili