2012-09-19 36 views
6

Tôi đã thử và tìm kiếm giải pháp, nhưng không thể tìm thấy bất kỳ giải pháp dứt khoát nào.PHP Sửa đổi một dòng trong một tệp văn bản

Về cơ bản, tôi có tệp txt liệt kê tên người dùng và mật khẩu. Tôi muốn có thể thay đổi mật khẩu của một người dùng nào đó.

Nội dung của tập tin users.txt:

user1,pass1 
user2,pass2 
user3,pass3 

Tôi đã thử đoạn code sau:

  // $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

Vấn đề với giải pháp của bạn là bạn đang xử lý tệp văn bản (tuần tự) dưới dạng tệp nhị phân. Các fwrite bạn đang sử dụng sẽ không hoạt động ở đây. –

+8

vấn đề của bạn là một ví dụ về lý do tại sao bạn không nên sử dụng tệp văn bản phẳng nhưng cơ sở dữ liệu –

+0

Ngoài ra, có sự cố đồng bộ hóa. Vì vậy, bạn nên cố gắng sử dụng ['flock'] (http://php.net/manual/en/function.flock.php). Hoặc, nó có thể dễ dàng khiến một số người dùng phát điên. – Prasanth

Trả lời

8

Điều này sẽ hoạt động! :)

$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

Đoạn mã đẹp! – antikbd

2

Tôi nghĩ rằng khi bạn nhận được rằng đào tạo Quản lý sử dụng tập tin sau đó sử dụng preg_replace cho riêng tên người dùng

Tôi đã làm điều này trong quá khứ một số điều như ở đây

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

Hy vọng điều này sẽ giúp ...

1

Cách thích hợp để thực hiện việc này là sử dụng cơ sở dữ liệu thay thế. Cơ sở dữ liệu có thể truy cập ngẫu nhiên dễ dàng, làm việc đó với các tệp văn bản ít hơn.

Nếu bạn không thể chuyển sang cơ sở dữ liệu vì bất kỳ lý do nào và bạn không mong đợi có nhiều hơn một nghìn người dùng cho hệ thống của mình, thì sẽ đơn giản hơn rất nhiều khi chỉ đọc toàn bộ tệp, chuyển đổi nó vào một cấu trúc dữ liệu PHP, thực hiện các thay đổi bạn cần thực hiện, chuyển đổi nó trở lại thành văn bản và ghi đè lên tệp gốc. Trong trường hợp này, điều đó có nghĩa là tệp() để tải tệp văn bản vào một mảng với mỗi phần tử là tên người dùng và mật khẩu dưới dạng chuỗi, phát nổ tất cả các phần tử trên mảng tại dấu phẩy để nhận tên người dùng và mật khẩu riêng biệt , thực hiện các thay đổi bạn cần thực hiện, sau đó ghi dữ liệu đã sửa đổi vào đĩa.

Bạn cũng có thể tìm thấy fgetcsv() hữu ích để đọc dữ liệu. Nếu bạn SplFileObject và có một phiên bản PHP gần đây thì fputcsv() cũng có thể có sẵn để ghi lại dữ liệu.

Tuy nhiên, chỉ cần sử dụng cơ sở dữ liệu là giải pháp tốt hơn nhiều. Công cụ phù hợp cho công việc.

0

Nếu bạn đang sử dụng hệ thống * nix, bạn có thể sử dụng sed; Tôi thấy nó gọn gàng hơn chơi với tập tin xử lý vv:

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

Nếu không được tôi đồng ý với GordonM và phân tích các tập tin thành một cấu trúc dữ liệu PHP, vận dụng nó, sau đó đặt nó trở lại:

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

Có, tất nhiên, vô số cách để làm điều đó!

Các vấn đề liên quan