读取文本文件并更新 php 中的值

Reading a text file and updating values in php

我正在创建一个网页,用户可以在其中登录,然后编辑表单中关于他们自己的信息。我从一个用“:”分隔的文本文件中读取要插入到表单中的数据我无法获取该文件来编辑现有值。

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

尝试

$open = fopen('account-info.txt', "a+");

mode a+ 将打开文件进行读写;将文件指针放在文件末尾。如果该文件不存在,请尝试创建它。

有关详细信息,请参阅 PHP fopen function

确保字段没有标记值

始终验证所有输入。在这种情况下,使用 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);

解除锁定

释放任何和所有互斥量、信号量、and/or 锁以与获取它们相反的顺序来防止死锁情况。

如果您可以选择文件格式,PHP 具有比滚动您自己的文件更好的读取和写入序列化文件、json、CSV 和 XML 文件的功能。