Вопрос: Почему я не могу использовать LOAD DATA LOCAL с PDO, хотя я могу от клиента cli?


Недавно я обновил свой Ubuntu 10.04 dev до 14.04. Это на самом деле свежая инсталляция. Версия PHP была 5.4.15, и теперь это PHP 5.5.9. MySQL перешел от 5.1.67 до 5.5.37.

Я пытаюсь LOAD LOCAL DATA INFILE на новом сервере. Он работает с командой local client mysql cli. Это не работает при выполнении PDO:

PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version' in /home/ubuntu/mysqltest.php:21
Stack trace:
#0 /home/ubuntu/mysqltest.php(21): PDO->exec('LOAD DATA LOCAL...')
#1 {main}
  thrown in /home/ubuntu/mysqltest.php on line 21

Код, который генерирует ошибку:

ini_set('mysql.allow_local_infile', 1);
echo "mysql.allow_local_infile: ".ini_get("mysql.allow_local_infile").PHP_EOL;

$options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1);
$db = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPassword, $options);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$db->exec("CREATE TEMPORARY TABLE tmp_table ( id INT(4), col1 varchar(128) ) ENGINE MYISAM");

$loadSQL = <<<'EOT'
LOAD DATA LOCAL INFILE '/tmp/test.csv' INTO TABLE `tmp_table` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (id, col1)
EOT;

$db->exec($loadSQL);

Шаги, предпринятые до сих пор для решения проблемы:

  • Я добавил local-infile = 1 в оба раздела [mysql] и [mysqld] /etc/mysql/my.cnf
  • Я проверил, что mysql.allow_local_infile = On находится в /etc/php5/cli/php.ini.
  • Пользователь БД является root и имеет все привилегии.
  • /tmp/test.csv существует, и у пользователя есть полные права на него.

3


источник


Ответы:


Это ошибка в php. Посмотри пожалуйста https://bugs.php.net/bug.php?id=68226  для объяснения и обходного пути.


2



Установка php5-mysqlnd для замены php5-mysql исправила проблему:

sudo apt-get install php5-mysqlnd

Он автоматически удалит php5-mysql.

Я предполагаю, что это ошибка либо в php5-mysql, либо в базовом libmysqlclient.


13