Bug #54158 [Com]: MYSQLND + PDO MySQL requires #define MYSQL_OPT_LOCAL_INFILE
| From: | anthon dot pang at gmail dot com | Date: | Sun, 03 Apr 2011 01:57:48 +0000 |
| Subject: | Bug #54158 [Com]: MYSQLND + PDO MySQL requires #define MYSQL_OPT_LOCAL_INFILE | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-159921@lists.php.net to get a copy of this message | ||
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] andrey@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