Не удается загрузить данные из загруженного (локального) файла с момента обновления mysql (текущая версия: версия сервера: 5.5.44-0 + deb8u1 (Debian)), подразумеваются следующие файлы:
dbconnection.php
<?php
$server = "localhost";
$user = "TheUser";
$pass = "ThePass";
$db_name = "DbName";
$link = mysql_connect($server, $user, $pass);
mysql_select_db($db_name);
mysql_set_charset('utf8', $link);
?>
send2db.php
<?php
include 'dbconnection.php';
mysql_select_db("DbName") or die(mysql_error());
$query = "LOAD DATA LOCAL INFILE '$file' INTO TABLE `T1` FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' ";
mysql_query($query) or die(mysql_error());
?>
Ошибка говорит:
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Внутри mysql:
SHOW GLOBAL VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
1 row in set (0.00 sec)
Но если я получу доступ к mysql таким образом, файлы могут быть загружены:
mysql --local-infile -p
Итак, мой вопрос, могу ли я установить эту опцию в файле dbconnection.php, я уже много раз пробовал безуспешно, я читал посты о конфигурации my.cnf и некоторых других вещах, но у меня ничего не работает, любой предложение?
Спасибо
ОБНОВИТЬ:
Я отсутствовал, меняя код всей сети на mysqli, уффф !!, хорошо следуя советам из приведенных ниже ответов, я сделал следующий код, но безуспешно, но все равно получаю сообщение: «Используемая команда не разрешена с эта версия MySQL «. Подразумеваемые файлы следующие:
acessdb.php
<?php
$link = new mysqli($server, $user, $pass, $dbname);
?>
send2db.php
<?php include 'acessdb.php';
$link->options(MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_query($link, "LOAD DATA LOCAL INFILE 'upfiles/file.csv' INTO TABLE `T1` FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"'") or die(mysqli_error($link));
$link->options(MYSQLI_OPT_LOCAL_INFILE, false);
?>
Какие-либо предложения?
Установите параметр в my.cnf (или в файле конфигурации mysql в вашей системе):
local-infile=1
Перезапустите службу MySQL, и это должно решить проблему для вас.
ОБНОВИТЬ
Еще один вариант попробовать с PHP
$conn = mysqli_init();
$conn->options(MYSQLI_OPT_LOCAL_INFILE, true);
Попробуйте и посмотрите, работает ли это. Опция ссылка mysqli options
LOCAL INFILE
это механизм, с помощью которого сервер базы данных может запросить более или менее любой файл у клиента базы данных (= сервер PHP). Если вы не можете полностью доверять своему серверу и сети, это может быть опасно. Следовательно LOCAL INFILE
должно быть разрешено как на сервере (как вы сделали), так и на клиенте базы данных.
Вы используете старый устаревший и не поддерживается mysql
расширение PHP. Это расширение не поддерживает установку флага. Вы должны переключиться на mysqli
который имеет MYSQLI_OPT_LOCAL_INFILE
возможность включить этот режим.
<?php
$m = new mysqli(...);
$m->option(MYSQLI_OPT_LOCAL_INFILE, true);
$m->query("LOAD DATA LOCAL INFILE ....");
$m->option(MYSQLI_OPT_LOCAL_INFILE, false);
?>
Хорошо, наконец-то я нашел способ, вот рабочий код:
файл: connectdb.php
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $server, $user, $pass, $dbname);
файл: send2db.php
mysqli_query($link, "LOAD DATA LOCAL INFILE 'upfiles/file.csv' INTO TABLE `T1` FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"'") or die(mysqli_error($link));
Я надеюсь, что это помогает.
Поскольку mysql_connect () устарела начиная с PHP 5.5.0 (и будет удален в будущем), не исключено, что проблема исходит от вашего веб-сервера (Apache?), А не от версии SQL.
Еще одна вещь, которая может вызвать эту проблему, — это содержимое вашего файла, которое в конечном итоге содержит команду depreacted (это то, что вам кажется в сообщении об ошибке).