Хорошо, поэтому после недели попыток найти ответы на разные идеи, которые я нашел безуспешно, я собираюсь спросить. Это для LOAD DATA LOCAL INFILE, для MySQL. Было много сообщений об этом, но я все еще не могу заставить его работать из веб-браузера, но я могу запустить его из командной строки mysql на сервере с тем же пользователем и пропустить соединение с той же базой данных. Что я пробовал до сих пор
В my.cnf
local-infile=1
в mysqld, mysql, mysql-safe
loose-local-infile=1
клиент
Перезапущенный MySQL Server. В этот момент я смог запустить запрос из командной строки, а раньше этого не делал.
Я дал каталог, в котором файлы извлекаются из доступа 777.
Я подтвердил, что в php.ini включен локальный параметр файла.
Я обновил apparmor.
Актуальный запрос:
LOAD DATA LOCAL INFILE '/var/www/ui/uploads/r_import.csv' INTO TABLE r_data FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (first_name,last_name,apt,user_id)
Вышеупомянутый запрос работает из команды mysql без специальных аргументов при подключении к серверу.
Если у кого-то есть идеи по этому поводу, я был бы рад попробовать что-нибудь ….
Заранее спасибо.
<?php
include 'includes/header.php';
if($_FILES['file']['type'] != "application/vnd.ms-excel"){
die("This is not a CSV file.");
}
elseif(is_uploaded_file($_FILES['file']['tmp_name'])){
$filename = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
copy( $filename, 'uploads/'.$name ) or die( "Could not copy file!");
$file_to_import = '/var/www/ui/uploads/'.$name;
$query = 'LOAD DATA LOCAL INFILE \''.$file_to_import.'\' INTO TABLE r_data FIELDS TERMINATED BY \',\' ENCLOSED BY \'"\' LINES TERMINATED BY \'\n\' IGNORE 1 ROWS (first_name,last_name,apt,user_id)';
echo $query;
$result = mysqli_query($link,$query) or die(mysqli_error($link));
}
else{
die("You shouldn't be here");
}
?>
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, 'localhost', $username, $password, $database);
Строка подключения к базе данных — это то, что сработало для меня. Я нашел это в последнем комментарии в ссылке, предоставленной developerwjk
Ваша проблема заключается в использовании LOCAL
ключевое слово. Когда вы используете LOCAL
сервер ожидает, что клиент MySQL прочитает файл и отправит его. Это применимо, когда клиентское программное обеспечение работает на удаленном компьютере или когда вы запускаете клиент MySQL на самом сервере. (Вот почему вы можете выполнить свой запрос из командной строки сервера).
Если вы используете PHP, клиентское программное обеспечение не используется. PHP делает звонки прямо на сервер, поэтому LOCAL
ключевое слово недопустимо в этом контексте.
Использовать LOAD DATA INFILE
из PHP вы должны убедиться, что файл находится в месте в файловой системе сервера что сервер MySQL имеет доступ для чтения, и что полный путь к этому файлу передается как часть вашего запроса. Не используйте LOCAL
ключевое слово.
Если вы пытаетесь загрузить файл с удаленного клиента, вам сначала нужно загрузить его в файловую систему, а затем выполнить запрос.
Обратите внимание на это предложение из руководства MySQL: Если указан LOCAL, файл читается клиентской программой на клиентском хосте и отправляется на сервер.
Ссылка: http://dev.mysql.com/doc/refman/5.5/en/load-data.html