Недавно я переместил веб-серверы, а новый веб-сервер имеет другую версию PHP.
Новый сервер: PHP 5.5.3-1ubuntu2 (cli) Старый сервер: PHP 5.3.10 (cli)
На сервере базы данных my.cnf настроен на разрешение локального доступа. Я могу использовать локальную информацию из данных загрузки:
- HeidiSQL - The command line client running on the new web server using --local-infile=1 - PHP, using PDO, from the old web server
Однако, когда я пытаюсь подключиться с нового веб-сервера, используя PHP с PDO, я получаю: возникла проблема с базой данных: SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1148 Использованная команда не допускается с этой версией MySQL
php.ini:
[MySQL] ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements ; http://php.net/mysql.allow_local_infile mysql.allow_local_infile = On
Конструктор PDO:
$this->db_conn = new PDO("mysql:host=$host;dbname=$dbname;port=$port", $user, $pass, array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));
Я также попробовал ini_set ('mysql.allow_local_infile', 1) и ini_set ('mysql.allow_local_infile', true) в скрипте PHP.
Ключевое слово LOCAL необходимо, поскольку файлы размещаются на веб-сервере, а не на сервере базы данных.
Что еще хочет от меня PHP 5.5?
Вам нужно настроить и клиент, и сервер, чтобы разрешить эту команду:
Убедитесь, что сервер разрешает LADAL DATA LOCAL INFILE. Измените /etc/my.cnf на сервере MySQL:
[server] local-infile=1
Задайте атрибут PDO в скрипте PHP:
<?php $dsn = "mysql:host=localhost;dbname=test"; $user = "root"; $password = "root"; $pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_LOCAL_INFILE=>1)); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec("LOAD DATA LOCAL INFILE 'foo.csv' INTO TABLE foo FIELDS TERMINATED BY ','");
Это необходимо задать в аргументе параметров драйвера для конструктора, а не в последующем вызове setAttribute()
.
Я просто проверил приведенный выше пример кода с PHP 5.5.8 и Percona Server 5.6.15 на CentOS Linux 6.5.
Если у вас все еще есть проблемы, у вас может быть сборка клиента MySQL или PDO, который не позволяет локально-вторгнуться. Требования описаны в http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html
Параметр mysql.allow_local_infile
в вашем php.ini не относится к PDO.
Ваш код абсолютно правдоподобен, не нужно изменять, поскольку ошибка лежит в вашем файле базы данных.
Причина вашей ошибки вызвана тем, что вы создали резервную копию базы данных через командную строку и пытаетесь загрузить данные через собственный скрипт php.
Существует два решения для решения проблемы: –
Попробуйте загрузить базу данных через командную строку, и если у вас нет доступа к командной строке, вы можете попросить своего поставщика услуг сделать загрузку для вас. Поскольку он должен просто запустить простую команду.
Откройте файл базы данных в текстовом редакторе и проверьте заголовки, в которых используется кодировка. Затем прочитайте данные и де-кодируйте их, затем запустите команду insert.
Если проблема не решена, дайте мне знать ..