切换到mysqli后LOCAL INFILE出现问题

时间:2014-05-02 14:09:30

标签: php mysql mysqli file-io

任何知道在PHP中使用LOCAL INFILE的问题的人都会理解我对此的沮丧。

我以前通过在我的连接调用中使用128标志让所有PHP脚本中的LOCAL INFILE正常工作。

mysql_connect(DB_SERVER,DB_USER,DB_PASS,false,128)

我现在正试图切换到mysqli,因为旧的mysql被折旧了。 我已经尝试过在每个论坛上找到的所有东西,但没有运气。

我在mysqli中的连接调用似乎很好:

$connection = mysqli_init();
if (!$connection) {die('mysqli_init failed');}
if (!mysqli_options($connection, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {die('Setting MYSQLI_INIT_COMMAND failed');}
if (!mysqli_options($connection, MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');}
if (!mysqli_options($connection, MYSQLI_OPT_LOCAL_INFILE,true)) {die('Setting MYSQLI_OPT_LOCAL_INFILE failed');}

if (!mysqli_real_connect($connection, DB_SERVER, DB_USER, DB_PASS, DB_SELECT)) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}

我的my.cnf文件包含适当的参数:

[mysql]
local-infile=1

[mysqld]
local-infile=1

我的php.ini还包含适当的参数:

[MySQLi]
mysqli.allow_local_infile = On

[MySQL]
mysql.allow_local_infile = On

查询甚至在执行时返回true!但我仍然没有在我的表格中加载数据。

$query = "LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table} FIELDS TERMINATED BY '{$fieldTerm}' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '{$lineTerm}' IGNORE {$skipLines} LINES";
if(mysqli_query($connection,$query)) {$message .= "Load Complete <br />";} //Message returns with "Load Complete".

除了进行system()调用之外,我不知道如何做到这一点。它与mysql一起运行良好,现在还没有使用mysqli。

为什么LOCAL INFILE如此困难?这一直是一个持续存在的问题。

编辑:

奇怪的是,当我在查询后运行mysqli_info()时,它表示它已正确执行。

Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

测试文件中有4条记录,所以这是正确的。

1 个答案:

答案 0 :(得分:2)

快速谷歌搜索带来了以下PHP Bug条目:https://bugs.php.net/bug.php?id=55737

这个问题似乎围绕着php.ini设置open_basedir: http://www.php.net/manual/en/ini.core.php#ini.open-basedir

  

对于具有open_basedir限制的Debian Wheezy,LOAD DATA LOCAL INFILE函数不能与mysql5.5和php5.4.4一起使用。   当open_basedir被禁用或设置为空时,它完全正常。

EDIT(供参考的解决方案):OP的问题在于“SET AUTOCOMMIT = 0”init命令。它正在加载和处理,但没有提交给db。