Edit report at http://bugs.php.net/bug.php?id=54158&edit=1
ID: 54158 Comment by: anthon dot pang at gmail dot com Reported by: tamas at ideaweb dot hu Summary: MYSQLND + PDO MySQL requires #define MYSQL_OPT_LOCAL_INFILE Status: Analyzed Type: Bug Package: PDO related Operating System: Linux PHP Version: 5.3.5 Assigned To: mysql Block user comment: N Private report: N New Comment: Sorry, you're right. My "workaround" is actually because MySQL is compiled with --enable-local-infile. Previous Comments: ------------------------------------------------------------------------ [2011-04-03 01:08:09] anthon dot pang at gmail dot com As a workaround, I use PDO::ATTR_EMULATE_PREPARES. With 5.2.17 and 5.3.6 (using mysqlndb), both LOAD DATA INFILE and LOAD DATA LOCAL INFILE work on my Ubuntu 10.04 box, using PDO_MYSQL and MYSQLI extensions. ------------------------------------------------------------------------ [2011-03-04 10:21:43] and...@php.net to be fixed after 5.3.6 is released ------------------------------------------------------------------------ [2011-03-04 01:18:56] tamas at ideaweb dot hu Description: ------------ Hi, On php 5.3.x PDO LOAD DATA LOCAL INFILE support seems broken. Running the code below issues a warning: Warning: PDOStatement::execute(): LOAD DATA LOCAL INFILE forbidden in /home/tamas/percona/load3.php on line 17 This is coming from mysqlnd when CLIENT_LOCAL_FILES option is disabled. Looking at the trace file, PDO doesn't call mysql_options (set_client_option) to enable local infile support. I tracked down this is caused by the following ifdef in ext/pdo_mysql/mysql_driver.c: #ifdef MYSQL_OPT_LOCAL_INFILE if (mysql_options(H->server, MYSQL_OPT_LOCAL_INFILE, (const char *)&local_infile)) { pdo_mysql_error(dbh); goto cleanup; } #endif MYSQL_OPT_LOCAL_INFILE is undefined hence the whole block which would enable local infile support is disabled. When the ifdef/endif line is commented out everything works. I also tested with mysqli, that is unaffected and works as expected. And a related bug to this one: http://bugs.php.net/46964 Configure Command => './configure' '--prefix=/home/tamas/percona/php53dbg' '--disable-all' '--with-pdo-mysql=mysqlnd' '--enable-debug' '--enable-pdo' '--with-mysqli=mysqlnd' '--with-mysql=mysqlnd' Thanks, Tamas Test script: --------------- define('MYSQL_ALL_DSN','mysql:host=10.8.0.1;dbname=c'); define('MYSQL_ALL_USER','a'); define('MYSQL_ALL_PASS','b'); $sql = 'LOAD DATA LOCAL INFILE \'/home/tamas/percona/testLoad.data\' INTO TABLE mail_message '. 'FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\n\' '. '(priority, user_id, `to`, template_id, data, custom_text_hash, spam)'; $con = new PDO(MYSQL_ALL_DSN, MYSQL_ALL_USER, MYSQL_ALL_PASS, array( PDO::MYSQL_ATTR_LOCAL_INFILE => 1, )); $stmt = $con->prepare($sql); $stmt->execute(); ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=54158&edit=1