我正在创建一个网页,用户可以登录该网页,然后编辑表单中关于自己的信息。我从一个用":"分隔的文本文件中读取要插入表单的数据。我无法获取用于编辑现有值的文件。
<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;
}
确保字段没有sentinel值
始终验证所有输入。在这种情况下,请使用htmlentities
函数剥离任何HTML标记,并防止存储中使用的sentinel值(:
)出现在任何字段中。
锁定
您需要获取一个互斥、信号量或锁。该锁应在向其写入文件(新用户或用户更新)时使用。不这样做将导致比赛条件。
有很多不同类型的锁,但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文件方面比滚动自己的文件具有更好的功能。
试用
$open = fopen('account-info.txt', "a+");
模式a+
将打开文件进行读写;将文件指针放在文件的末尾。如果文件不存在,请尝试创建它。
有关更多详细信息,请参阅PHP fopen函数