LOAD DATA LOCAL INFILE не работает с php 5.5 с использованием PDO

Недавно я переместил веб-серверы, а новый веб-сервер имеет другую версию 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?

Вам нужно настроить и клиент, и сервер, чтобы разрешить эту команду:

  1. Убедитесь, что сервер разрешает LADAL DATA LOCAL INFILE. Измените /etc/my.cnf на сервере MySQL:

     [server] local-infile=1 
  2. Задайте атрибут 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.

решение

Существует два решения для решения проблемы: –

  1. Попробуйте загрузить базу данных через командную строку, и если у вас нет доступа к командной строке, вы можете попросить своего поставщика услуг сделать загрузку для вас. Поскольку он должен просто запустить простую команду.

  2. Откройте файл базы данных в текстовом редакторе и проверьте заголовки, в которых используется кодировка. Затем прочитайте данные и де-кодируйте их, затем запустите команду insert.

Если проблема не решена, дайте мне знать ..