我试过并寻找解决方案,但找不到任何明确的解决方案。
基本上,我有一个列出用户名和密码的txt文件。我希望能够更改某个用户的密码。
users.txt文件的内容:
user1,pass1
user2,pass2
user3,pass3
我尝试过以下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);
答案 0 :(得分:8)
这应该有效! :)
$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);
答案 1 :(得分:2)
我认为当你获得该文件后使用file_get_contents使用preg_replace作为特定用户名
我过去曾经做过这样的事情,比如这里
$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);
}
希望这会有所帮助......
答案 2 :(得分:1)
这样做的正确方法是使用数据库。数据库可以轻松地进行随机访问,使用较少的文本文件。
如果由于某种原因无法切换到数据库,并且您不希望系统拥有超过一千个用户,则只需读取整个文件就可以轻松实现,转换它到PHP数据结构,进行需要进行的更改,将其转换回文本并覆盖原始文件。
在这种情况下,这意味着file()将文本文件加载到一个数组中,每个元素都是用户名和密码作为字符串,在逗号上爆炸数组上的所有元素以分别获取用户名和密码,进行您需要进行的更改,然后将修改后的数据写入光盘。
您可能还会发现fgetcsv()对于读取数据非常有用。如果您使用SplFileObject并拥有最新版本的PHP,那么fputcsv()也可用于将数据写回。
然而,仅使用数据库是一个更好的解决方案。适合工作的正确工具。
答案 3 :(得分:0)
如果您使用的是* nix系统,则可以使用sed
;我发现它比使用文件句柄等更整洁:
exec("sed -i '/^$username,.\+\$/$username,$userpwd/g' ./users.txt 2>&1", $output, $return);
如果不是我同意GordonM并将文件解析为PHP数据结构,操纵它,然后将其放回去:
$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)));
当然,有很多方法可以做到这一点!
答案 4 :(得分:0)
$fn = fopen("test.txt","r") or die("fail to open file");
$fp = fopen('output.txt', 'w') or die('fail to open output file');
while($row = fgets($fn))
{
$num = explode("++", $row);
$name = $num[1];
$sex = $num[2];
$blood = $num[3];
$city = $num[4];
fwrite($fp, "Name: $name\n");
fwrite($fp, "Sex: $sex\n");
fwrite($fp, "Blood: $blood\n");
fwrite($fp, "City: $city\n");
}
fclose($fn);
fclose($fp);