Bug #54158 [Ana->Csd]: MYSQLND + PDO MySQL requires #define MYSQL_OPT_LOCAL_INFILE

From: Date: Fri, 09 Sep 2011 07:03:01 +0000
Subject: Bug #54158 [Ana->Csd]: MYSQLND + PDO MySQL requires #define MYSQL_OPT_LOCAL_INFILE
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-163405@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=54158&edit=1

 ID:                 54158
 Updated by:         andrey@php.net
 Reported by:        tamas at ideaweb dot hu
 Summary:            MYSQLND + PDO MySQL requires #define
                     MYSQL_OPT_LOCAL_INFILE
-Status:             Analyzed
+Status:             Closed
 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:

This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.

 For Windows:

http://windows.php.net/snapshots/
 
Thank you for the report, and for helping us make PHP better.




Previous Comments:
------------------------------------------------------------------------
[2011-09-02 13:53:30] andrey@php.net

Automatic comment from SVN on behalf of andrey
Revision: http://svn.php.net/viewvc/?view=revision&revision=316039
Log: Fix for Bug #54158 MYSQLND + PDO MySQL requires #define MYSQL_OPT_LOCAL_INFILE
and a bunch of other small preprocessor fixes

------------------------------------------------------------------------
[2011-04-03 03:57:48] anthon dot pang at gmail dot com

Sorry, you're right.  My "workaround" is actually because MySQL is compiled with
--enable-local-infile.

------------------------------------------------------------------------
[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 https://bugs.php.net/bug.php?id=54158&edit=1


Thread (10 messages)

« previous php.bugs (#163405) next »