Я выкладываю разрешение, так как оно сводило меня с ума на несколько дней — оказалось, что это настройки AppArmor. Эта тема, наконец, дала мне понять:
Как обойти MySQL Errcode 13 с помощью SELECT INTO OUTFILE?
Я вижу, что это помечено как дубликат, но все другие предложения указывают на редактирование my.cnf, который не работает для меня.
Я не могу заставить Load Data Local Infile работать. Моя версия сервера MySQL 5.5.41, а моя версия Ubuntu — 14.04.2. Мой my.cnf имеет «local-infile» под mysql, mysqld и client. Я ниже указываю флаг 128 в строке подключения для другого сообщения в Stackoverflow. Приведенный ниже код прекрасно работает, когда я запускаю его на клиенте, но теперь, когда он живет на сервере, он постоянно выбрасывает
Msgstr «Используемая команда не разрешена в этой версии MySQL.
РЕДАКТИРОВАТЬ, выполнение этого из командной строки успешно:
mysql> LOAD DATA LOCAL INFILE '/home/aa/ER.csv'
-> INTO TABLE ER_import
-> FIELDS TERMINATED BY ','
-> LINES TERMINATED BY '\r\n'
-> IGNORE 1 LINES
-> (Paid_Amount,
-> Pro_Number,
-> Invoice,
-> Ship_Date,
-> BL,
-> Carrier_Name,
-> Check_Number,
-> Paid_Date,
-> Shipper_City,
-> Shipper_State,
-> Shipper_Name_1,
-> Recipient_City,
-> Recipient_State,
-> Recipient_Name_1,
-> Batch_Number,
-> Actual_Weight,
-> Billed_Amount
-> );
Query OK, 8585 rows affected, 4 warnings (0.21 sec)
Records: 8585 Deleted: 0 Skipped: 0 Warnings: 4
все же это повторяет, что файл не найден: «Файл ‘/home/aa/ER.csv’ не найден (код ошибки: 13)» файл определенно существует, и права доступа правильны:
$delete = "DELETE FROM ER_import";
if (!mysqli_query($conn,$delete))
{
echo("Error description: " . mysqli_error($conn));
}
$query = <<<eof
LOAD DATA INFILE '/home/aa/ER.csv'
INTO TABLE ER_import
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(Paid_Amount,
Pro_Number,
Invoice,
Ship_Date,
BL,
Carrier_Name,
Check_Number,
Paid_Date,
Shipper_City,
Shipper_State,
Shipper_Name_1,
Recipient_City,
Recipient_State,
Recipient_Name_1,
Batch_Number,
Actual_Weight,
Billed_Amount
);
eof;if($results = mysqli_query($conn, $query)){
echo $file. " has been imported!";
} else die(mysqli_error($conn));
Это что-то очевидное ??
попробуй так
$query = <<<eof
LOAD DATA LOCAL INFILE DIR_FILE
INTO TABLE ER_import
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
eof;
$query = str_replace('DIR_FILE',$dir.$file,$query);
так как <<<eof
означает, что вы не хотите, чтобы php анализировал что-либо внутри вашей следующей строки. Но вы пытаетесь $dir$file
это означает, что вы ожидаете, что phta заменит эти значения значениями.
Есть неинтуитивный поворот к значению LOCAL
в LOAD DATA LOCAL INFILE
, Вам нужно только использовать LOCAL
когда загружаемый файл не локально по отношению к серверу. LOCAL
сообщает клиенту MySQL, что нужно взять локальный файл и поместить его во временный каталог на сервере. https://dev.mysql.com/doc/refman/5.5/en/load-data.html
Попробуй взять слово LOCAL
вне вашей команды, когда вы запускаете этот скрипт php на вашем сервере.
У меня была такая же проблема несколько лет назад.
local-infile должен быть включен как для клиента, так и для сервера.
Я бы порекомендовал вам попробовать запустить LOAD DATA LOCAL INFILE
из интерфейса командной строки, прежде чем пытаться в PHP. Чтобы убедиться, что соединение с клиентом включает локальный infile, выполните эту команду:
mysql --local-infile=1 -h REPLACE_HOST_IP -u username -p
Удачи!