我一直试图从数组中取消设置值而没有成功,我正在尝试从CSV文件中编辑值。当我点击编辑它应该打开值加载它本地取消设置它并重新保存数组与新值。我的问题是所有的值都与新的编辑值一起被添加两次。
这是我的编辑功能
class edit extends index{
public function GET(){
$Remail = ($_REQUEST['email']);
$filename = 'testfile.csv';
$lines = file($filename);
foreach($lines as $info) {
$CSVString = explode(',', $info);
$this->email = trim(explode("=", $CSVString[0])[1]);
if ($Remail === $this->email){
$this->Fname = trim(explode("=", $CSVString[1])[1]);
$this->Lname = trim(explode("=", $CSVString[2])[1]);
unset($CSVString[0]);
}
$this->person = array('Email'=>$this->email,'FirstName' =>$this- >Fname, 'LastName' =>$this->Lname);
$this->save($this->person);
}
echo '<form action="index.php?page=adduser" method="POST">
<label for="email">Email:</label></br>
<input type="text" name="Email" value="' . $Remail . '"></br>
<label for="fname">First Name:</label></br>
<input type="text" name="Fname" value="' . $this->Fname . '"></br>
<label for="lname">Last Name:</label></br>
<input type="text" name="Lname" value="' . $this->Lname . '"></br>
<input type="submit">
</form>';
}
这是我的保存功能
public function save($arr){
$filename = 'testfile.csv';
$myfile = fopen($filename, "a+") or die("Unable to open file!");
foreach($arr as $key => $value){
$new [] = $key.'='.$value;
$final = implode(",", $new);
}
fwrite($myfile, $final.PHP_EOL);
fclose($myfile);
}
这是表单正在调用的adduser
class adduser extends index {
public function GET(){
include('add.html');
}
public function POST($Fname, $Lname, $Email){
$this->Fname = $Fname;
$this->Lname = $Lname;
$this->Email = $Email;
$this->person = array('Email'=>$this->Email,'FirstName' =>$this->Fname, 'LastName' =>$this->Lname);
$this->save($this->person);
答案 0 :(得分:1)
假设您访问index.php?page=edit&email=example@example.com
。我了解您,然后想查阅您的CSV文件并提取该用户的数据,并在您可以编辑和提交的表单中显示他们的名字和姓氏。但问题是,您要提交index.php?page=adduser
,这会添加用户,而不是对其进行编辑。我看到你有两个班级edit
和adduser
。正如您的adduser
课程采用GET()
和POST()
方法一样,您的GET()
课程也应该采用POST()
和edit
方法。您看到重复数据的原因是,当首先没有要保存的数据时,edit
类的GET()
方法实际上正在调用save()
。并且它也不会编辑数据,它会为每个循环引用您的$this->Fname
和$this->Lname
,我认为这不是首先设置的。因此,您最终会使用正确的电子邮件将一堆行附加到CSV文件中,但每行使用相同的FirstName和LastName,从而破坏您的数据。
就此处的解决方案而言,只需不要使用$this->save($this->person);
的{{1}}方法拨打edit
。更新表单以提交到正确的页面:
GET()
如果用户想要更改其电子邮件,请将用户电子邮件的引用添加为不同密钥下的隐藏字段:
<form action="index.php?page=edit" method="POST">
(是的,确保在用HTML格式显示时始终转义用户的输入)
然后使用逻辑
在echo '<input type="hidden" name="oldemail" value="'.htmlentities($Remail).'">';
类中创建一个新的POST()
方法
edit
(请注意,以上是未经测试的,您可能需要稍作调整)
将来,我建议使用fgetcsv()一次解析一行CSV文件,或str_getcsv解析整个CSV文件在一个卡盘中表示为字符串。并fputcsv用于将行写入CSV文件。使用这些功能可确保正确转义,以便在有人输入意外输入时您的CSV文件不会被破坏。虽然如果有人在字段中输入新行,即使正确转义,如果您逐行读取CSV文件,无论引号之间是否有新行,那么您将遇到PHP设计函数的问题如果该行在引号之间,则一次读取一行文件而不关心。因此,如果您需要保留用户可能输入的新行,我建议将它们存储在CSV文件中时将它们转换为HTML实体等效项。但如果您对这些事情非常认真,那么您应该使用数据库而不是CSV文件。