我正在创建一个网页,用户可以在其中登录,然后编辑表单中有关自己的信息。我从一个由"分隔的文本文件中读取要插入到表单中的数据:"我无法让文件编辑现有值。
<form name="edit" action="info.php" method="get">
First name: <input type="text" name="firstName" value="<?php echo $arr[2]; ?>"><br>
Last name: <input type="text" name="lastName" value="<?php echo $arr[3]; ?>"><br>
Background color: <input type="text" name="bgcolor" value="<?php echo $arr[4]; ?>"><br>
Title: <input type="text" name="title" value="<?php echo $arr[5]; ?>"><br>
Image: <input type="text" name="bgimg" value="<?php echo $arr[6]; ?>"><br>
<input type="hidden" name="editUpdate" value="true">
<input type="submit" name="test" value="Edit account info" />
</html>
<?php
}
if (isset($_REQUEST['editUpdate'])) {
$open = fopen('account-info.txt', "r+");
$firstName = $_REQUEST['firstName'];
$lastName = $_REQUEST['lastName'];
$bgcolor = $_REQUEST['bgcolor'];
$title = $_REQUEST['title'];
$bgimg = $_REQUEST['bgimg'];
fwrite($open, $firstName, $lastName, $bgcolor, $title, $bgimg);
fclose($open);
$login = true;
}
答案 0 :(得分:1)
确保字段没有哨兵值
验证所有输入始终。在这种情况下,使用htmlentities
函数删除任何HTML标记,并防止您在存储中使用的标记值(:
)位于任何字段中。
<强>锁定强>
您需要获取互斥锁,信号量或锁定。每次写入文件时都应使用此锁(新用户或用户更新)。不这样做会导致竞争条件。
有许多不同类型的锁,但PHP为flock函数提供了一个非常简单的接口:https://secure.php.net/manual/en/function.flock.php
<强>读取强>
然后,您需要打开文件进行读取。 将所有用户读入多维数组:
$users = file_get_contents ('account-info.txt');
$users = explode('\n',$users);
for($user_index = 0;count(users) > $user_index;++$user_index)
{
$users[$user_index] = explode(':',$users);
}
更新阵列
您需要找到要更新的正确记录。这可能需要另一个字段,用户ID号或用户名不能更改;或者,坚持他们的旧名和姓。我把它留给你弄清楚。
将数组写回文件 循环遍历数组并将它们全部写回。
$fp = fopen('account-info.txt', "w+");
foreach($users as $user)
{
foreach($user as field)
{
fwrite($fp,$field . ':');
}
fwrite($fp,"\n");
}
close($fp);
解锁
以与获取它们相反的顺序释放任何和所有互斥锁,信号量和/或锁,以防止出现死锁情况。
如果您可以选择文件格式,那么PHP有更好的功能来读取和编写序列化文件,json,CSV和XML文件,而不是滚动自己的文件。
答案 1 :(得分:0)
尝试
$open = fopen('account-info.txt', "a+");
模式a+
将打开文件进行读写;将文件指针放在文件的末尾。如果该文件不存在,请尝试创建它。
有关详细信息,请查看PHP fopen function