Использование PHP для импорта CSV-данных в MySQL, часть 2

#php #mysql #csv

#php #mysql #csv

Вопрос:

Продолжение моей последней темы. Попытка импортировать сгенерированный пользователем CSV-файл в MySQL с помощью скрипта загрузки PHP. Загрузка выполнена успешно, но я не могу использовать ЗАГРУЖАЕМЫЕ ДАННЫЕ из-за проблемы с разрешениями. Вот что я пытаюсь сделать вместо этого:

 $row = 1;
if (($handle = fopen($target_path, "r")) !== FALSE) 
  {
   while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    {
     $num = count($data);
     echo "<p> $num fields in line $row: <br /></p>n";
     $row  ;
 for ($c=0; $c < $num; $c  ) 
 {
  $fullRow = $fullRow . $data[$c] . "," ;
 }
 echo $fullRow;
mysql_query("INSERT INTO foo (field1, field2, field3, field4) VALUES ('$fullRow')");
$fullRow = NULL;
}
   fclose($handle);
  }
  

echo $fullRow выдает дословную копию строки из CSV-файла, за исключением дополнительной запятой в конце. Именно поэтому вставка работает некорректно? Когда я выполняю ручную загрузку через phpMyAdmin, CSV-файл импортируется без проблем. Или есть проблема с VALUE ('$fullRow') битом кода?

Ответ №1:

Вы можете просто убрать последнюю запятую.

 for ($c=0; $c < $num; $c  ) 
 {
  $fullRow = $fullRow . $data[$c] . "," ;
 }
 echo $fullRow;
 $fullRow = substr($fullRow,0,-1);
  

А также ваш скрипт не в порядке.

 mysql_query(" INSERT INTO foo (field1, field2, field3, field4) VALUES ('$fullRow') " );
$fullRow = NULL;
  

Ответ №2:

Исправления Paolo_NL_FR должны помочь вам начать работу. Однако скрипт может использовать некоторый TLC и не имеет даже базовой защиты от sql-инъекций. Возможно, попробуйте что-то подобное:

 if (($handle = fopen($target_path, "r")) !== FALSE) 
{
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    {
        $values = implode(",", array_map('mysql_real_escape_string', $data));
        mysql_query("INSERT INTO foo (field1, field2, field3, field4) VALUES ($values);");
    }

    fclose($handle);
}