2012-09-19 23 views
6

Ho provato e cercato una soluzione, ma non ho trovato alcun definitivo.PHP Modifica una singola riga in un file di testo

Fondamentalmente, ho un file txt che elenca nomi utente e password. Voglio poter cambiare la password di un determinato utente.

Contenuto del file users.txt:

user1,pass1 
user2,pass2 
user3,pass3 

che ho provato il seguente codice PHP:

  // $username = look for this user (no help required) 
      // $userpwd = new password to be set 

    $myFile = "./users.txt"; 
    $fh = fopen($myFile,'r+'); 

    while(!feof($fh)) { 
     $users = explode(',',fgets($fh)); 
     if ($users[0] == $username) { 
      $users[1]=$userpwd; 
      fwrite($fh,"$users[0],$users[1]"); 
     } 
    }  

    fclose($fh);  
+1

Il problema con la soluzione è che si gestisce un file di testo (sequenziale) come file binario. La scrittura che stai usando non funzionerà qui. –

+8

il tuo problema è un esempio del perché non dovresti usare un file di testo piatto ma un database –

+0

Inoltre, c'è il problema della sincronizzazione. Quindi, dovresti provare a usare ['flock'] (http://php.net/manual/en/function.flock.php). Oppure potrebbe far impazzire alcuni utenti. – Prasanth

risposta

8

Questo dovrebbe funzionare! :)

$file = "./users.txt"; 
$fh = fopen($file,'r+'); 

// string to put username and passwords 
$users = ''; 

while(!feof($fh)) { 

    $user = explode(',',fgets($fh)); 

    // take-off old "\r\n" 
    $username = trim($user[0]); 
    $password = trim($user[1]); 

    // check for empty indexes 
    if (!empty($username) AND !empty($password)) { 
     if ($username == 'mahdi') { 
      $password = 'okay'; 
     } 

     $users .= $username . ',' . $password; 
     $users .= "\r\n"; 
    } 
} 

// using file_put_contents() instead of fwrite() 
file_put_contents('./users.txt', $users); 

fclose($fh); 
+0

Bel pezzo di codice! – antikbd

2

Penso che quando si ottiene che file_get_contents uso file dopo che l'uso preg_replace per il particolare nome utente

Ho fatto questo in passato alcune cose come qui

   $str = ""; 

     $reorder_file = FILE_PATH; 
     $filecheck = isFileExists($reorder_file); 

     if($filecheck != "") 
     { 
      $reorder_file = $filecheck; 
     } 
     else 
     { 
      errorLog("$reorder_file :".FILE_NOT_FOUND); 
      $error = true; 
      $reorder_file = ""; 
     } 
     if($reorder_file!= "") 
     { 
      $wishlistbuttonhtml="YOUR PASSWORD WHICH YOU WANT TO REPLACE" 
      $somecontent = $wishlistbuttonhtml; 
      $Handle = fopen($reorder_file, 'c+'); 
      $bodytag = file_get_contents($reorder_file); 
      $str=$bodytag; 
      $pattern = '/(YOUR_REGEX_WILL_GO_HERE_FOR_REPLACING_PWD)/i'; 
      $replacement = $somecontent; 
      $content = preg_replace($pattern, $replacement, $str,-1, $count); 
      fwrite($Handle, $content); 
      fclose($Handle); 
     } 

Spero che questo aiuti ....

1

Il modo corretto di fare questo è utilizzare invece un database. I database possono fare facilmente l'accesso casuale, facendo meno con i file di testo.

Se non è possibile passare a un database per qualsiasi motivo e non ci si aspetta di avere più di un migliaio di utenti per il proprio sistema, sarebbe molto più semplice leggere l'intero file, convertire in una struttura dati PHP, apportare le modifiche che è necessario apportare, convertirlo nuovamente in testo e sovrascrivere il file originale.

In questo caso, ciò significherebbe file() per caricare il file di testo in un array con ogni elemento come nome utente e password come stringa, esplodere tutti gli elementi sull'array alla virgola per ottenere separatamente nome utente e password , apportare le modifiche che è necessario apportare, quindi scrivere i dati modificati sul disco.

È inoltre possibile trovare fgetcsv() utile per la lettura dei dati. Se hai SplFileObject e hai una versione recente di PHP, allora anche fputcsv() potrebbe essere disponibile per riscrivere i dati.

Tuttavia, l'utilizzo di un database è una soluzione decisamente migliore. Strumento giusto per il lavoro.

0

Se si utilizza un sistema * nix, è possibile utilizzare sed; Trovo più ordinato che giocare con handle di file, ecc:

exec("sed -i '/^$username,.\+\$/$username,$userpwd/g' ./users.txt 2>&1", $output, $return); 

Se non ero d'accordo con GordonM e analizzare il file in una struttura di dati PHP, manipolarla, poi rimetterlo:

$data = file_get_contents('./users.txt'); 

$users = array_map(function($line) { 
    return explode(',', $line); 
}, explode("\n", $data)); 

foreach ($users as $i => $user) { 
    if ($user[0] == $username) { 
    $user[1] = $userpwd; 
    $users[$i] = $user; 
    } 
} 

file_put_contents('./users.txt', implode("\n", array_map(function($line) { 
    return implode(',', $line); 
}, $users))); 

Ci sono, naturalmente, un numero infinito di modi per farlo!

Problemi correlati