2015-11-12 4 views
0

Я пытался удалить из массива значение без успеха, я пытаюсь редактировать значения из файла 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); 

ответ

1

Допустим, вы посетите index.php?page=edit&[email protected] , Я понимаю, что вам нужно проконсультироваться с вашим 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); из editGET(). Обновите форму, чтобы отправить на нужную страницу:
<form action="index.php?page=edit" method="POST">
добавить также ссылку на адрес электронной почты пользователя, как скрытое поле под другим ключом, в случае, если пользователь хочет изменить свою электронную почту:
echo '<input type="hidden" name="oldemail" value="'.htmlentities($Remail).'">';
(да, убедитесь, что всегда избежать ввода пользователя при отображении его в HTML)

Затем создайте новый метод POST() в своем классе edit с логикой:

public function POST($p_oldEmail, $p_Fname, $p_Lname, $p_Email) 
{ 
    $filename = 'testfile.csv'; 
    $lines = file($filename) or die("Unable to open file!");; 
    $out = ''; 
    foreach($lines as $info) 
    { 
    $fields = explode(',', $info); 
    $email=trim(explode("=", $fields[0])[1]); 
    if($email === $p_oldEmail) 
    { 
     $record=array('Email'=>$p_Email,'FirstName'=>$p_Fname, 'LastName'=>$p_Lname); 
     $new=array(); 
     foreach($record as $key => $value) 
     { 
     $new[] = $key.'='.$value; 
     } 
     $out.=implode(",", $new).PHP_EOL; 
    }else{ 
     $out.=$info; 
    } 
    } 
    $myfile = fopen($filename, "w") or die("Unable to open file!"); 
    fwrite($myfile, $out); 
    fclose($myfile); 
} 

(Обратите внимание, что выше не тестировался, возможно, придется сделать небольшую корректировку к ней)

В будущем, я бы посоветовал использовать fgetcsv() для разбора CSV файла одну строку за один раз или str_getcsv для разбора целой CSV-файл, представленный как строка в одном патроне. И fputcsv для записи строки в файл CSV. Использование этих функций обеспечивает правильное экранирование, поэтому ваш файл CSV не будет поврежден, если кто-то войдет в неожиданный ввод. Несмотря на то, что если кто-то вводит новую строку в поле, даже если сбежал должным образом, если вы читаете файл CSV за строкой, независимо от того, какая новая строка находится между кавычками, тогда вы столкнетесь с проблемой с функциями PHP который читает файл по одной строке за раз, не заботясь о том, находится ли эта строка между кавычками. Поэтому, если вам нужно сохранить новые строки, которые могут вводить пользователи, я бы предложил преобразовать их в их эквиваленты объектов HTML при их хранении в CSV-файле.Но если вы серьезно относитесь к подобным вещам, вы действительно должны использовать базу данных, а не файл CSV.

+0

Профессор хотел, чтобы мы начали с файлов CSV, позже мы перешли в mysql. И im gettig эта ошибка Предупреждение: отсутствует аргумент 4 для edit :: POST(), вызванный в /var/www/html/index.php в строке 19 и определенный в /var/www/html/controllers/edit.php on строка 6 Примечание: Неопределенный индекс: электронная почта в /var/www/html/controllers/edit.php on line 38 Примечание: Неопределенное свойство: edit :: $ Fname в/var/www/html/controllers/edit. php on line 63 Примечание: Неопределенное свойство: edit :: $ Lname в /var/www/html/controllers/edit.php в строке 65 Email: – Royce

+0

Вы неправильно вызываете мою функцию. Это требует 4 аргументов, как говорит ваша ошибка. Моя функция ожидает, что первым аргументом будет '$ _POST ['oldemail']'. Остальные три: '$ _POST ['fname']', '$ _POST ['lname']', '$ _POST ['email']'. Я думал, что это будет ясно из префиксов 'p_' моих переменных. Мой код также не ссылается на свойства '$ this-> Fname' или' $ this-> Lname'. Если вы получаете ошибки относительно этих свойств, которые мой код не использует, ваша ошибка в другом месте кода, который вы еще не показали нам. – Ultimater

+0

Получил эту часть работы, теперь моя последняя часть удаляет пользователя. на основе параметра электронной почты. Я заметил, что мой сервер не поддерживает методы DELETE или PUT только GET и POST. Мне нужно добавить кнопку удаления в форме редактирования. – Royce

Смежные вопросы