2012-09-19 69 views
6

Intenté y busqué una solución, pero no encuentro ninguna definitiva.PHP Modificar una sola línea en un archivo de texto

Básicamente, tengo un archivo txt que enumera nombres de usuario y contraseñas. Quiero poder cambiar la contraseña de un determinado usuario.

Contenido archivo de users.txt:

user1,pass1 
user2,pass2 
user3,pass3 

He intentado el siguiente código 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

El problema con su solución es que está manejando un archivo de texto (secuencial) como un archivo binario. El fwrite que está utilizando no funcionará aquí. –

+8

su problema es un ejemplo de por qué no debe usar un archivo de texto plano sino una base de datos –

+0

Además, existe el problema de la sincronización. Por lo tanto, debería intentar usar ['flock'] (http://php.net/manual/en/function.flock.php). O bien, podría enloquecer a algunos usuarios. – Prasanth

Respuesta

8

Esto debería funcionar! :)

$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

Hermosa pieza de código! – antikbd

2

creo que cuando usted consigue que file_get_contents uso de archivos después de que el uso preg_replace para el particular, nombre de usuario

he hecho esto en el pasado alguna cosa como aquí

   $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); 
     } 

Espero que esto ayude ....

1

La forma correcta de hacer esto es utilizar una base de datos en su lugar. Las bases de datos pueden hacer acceso aleatorio fácilmente, haciéndolo con archivos de texto menos.

Si no puede cambiar a una base de datos por el motivo que sea, y no espera tener más de unos mil usuarios para su sistema, entonces sería mucho más simple leer todo el archivo en, convertir a una estructura de datos PHP, realice los cambios que necesita hacer, conviértalo nuevamente en texto y sobrescriba el archivo original. En este caso, eso significa que file() carga el archivo de texto en una matriz con cada elemento como nombre de usuario y contraseña como una cadena, explota todos los elementos en la matriz en la coma para obtener el nombre de usuario y la contraseña por separado. , realice los cambios que necesita hacer, luego escriba los datos modificados en el disco.

También puede encontrar fgetcsv() útil para leer los datos. Si tiene SplFileObject y tiene una versión reciente de PHP, entonces fputcsv() también puede estar disponible para volver a escribir los datos.

Sin embargo, el uso de una base de datos es una solución mucho mejor. Herramienta correcta para el trabajo.

0

Si está en un sistema * nix puede usar sed; Me resulta más limpio que juega con los manejadores de archivo, etc:

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

Si no estoy de acuerdo con GordonM y analizar el archivo en una estructura de datos PHP, manipularlo, a continuación, poner de nuevo:

$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))); 

¡Hay, por supuesto, infinidad de formas de hacerlo!

Cuestiones relacionadas