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:
 
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().
 
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?
 
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)
 
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.
 
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?
 
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.
 
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 ;)
 
Ciao,

a te sostituisce no con yes? Perché a me non lo fa, però il bug che non trovava adesso sembra essere fixato.
 
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.
 
Ti consiglio di utilizzare un database per salvare informazioni e dati di questo tipo.


Inviato dal mio iPhone utilizzando Tapatalk
 

Discussioni simili