У меня есть функция, которая должна загружать данные в MySQL DB из файла CSV, поэтому я написал некоторый код:
try {
$pdo = new PDO('mysql:host=localhost;dbname=borsino_ittico',
'XXXXX', 'XXXXX',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4",
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);}
catch (PDOException $e) {
$mex= "database connection failed: ".$e->getMessage();
return $mex;
}
другой код
try {
$affectedRows = $pdo->exec("LOAD DATA LOCAL INFILE ".$pdo->quote($file)." INTO TABLE ".
$pdo->quote($dbTable)." FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n,\\n'");
$mex= "Loaded a total of $affectedRows records from this csv file.\n";
return $mex;
}
catch (PDOException $e) {
$mex= "ATTENZIONE, ERRORE CARICAMENTO DATI: ".$e->getMessage();
return $mex;
}
На самом деле это, кажется, не работает, и бросил исключение:
SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL имеется ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с полем » asta ‘TERMINATED BY’; ‘ ЛИНИИ, ПРЕКРАЩЕННЫЕ ‘, \ n’ ‘в строке 1
Первый вопрос о $ file (ресурс):
должен быть в абсолютной / относительной форме (например, c: \ xxx \ csvfile.csv или .. \ xxx \ csvfile.csv), или я должен предоставить его с помощью функции like $csvFile=fopen($file,"r");
Затем я должен использовать родную функцию pdo $pdo->quote()
для вставки аргументов (таких как файл, имя таблицы, разделитель, строки, оканчивающиеся на) в запросе $ disabledRows?
Как я могу форсировать выполнение запроса даже с некоторыми ошибками в некоторой строке?
Вы цитируете свое имя таблицы, производя
... INTO table 'asta' ...
'
Кавычки превращают вещи в строки. Так asta
больше не имя таблицы, это просто строка с буквами a
, s
, так далее…
Идентификаторы должны быть заключены в кавычки:
... INTO table `asta` ...
^----^---
LINES TERMINATED BY '\n,\\n'
не работает для меня !!!! после многих испытаний единственное решение состоит в том, чтобы удалить двойной побег \\n
Так
`LINES TERMINATED BY '\n'`
работает, даже если где-то я читал о необходимости «экранировать» символ «\» для PHP.