【问题标题】:Problems with LOCAL INFILE after switching to mysqli切换到 mysqli 后 LOCAL INFILE 出现问题
【发布时间】:2014-05-02 14:09:29
【问题描述】:

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

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

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

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

$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条记录,所以这是正确的。

【问题讨论】:

  • 嘿,我进行了一些编辑,以使您的帖子更符合网站的意图,并帮助它获得更好的曝光(特别是标题,并没有它具体可能)。祝你好运,希望你得到一个有用的答案!

标签: php mysql mysqli file-io


【解决方案1】:

通过 google 快速搜索发现以下 PHP 错误条目: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 被禁用或设置为空时,它工作得很好。

编辑(参考解决方案):OP 的问题在于“SET AUTOCOMMIT = 0”初始化命令。它正在加载和处理,但未提交到数据库。

【讨论】:

  • 感谢您的回复!我也看过那个帖子。我在 PHP5.5.11 上并且 open_basedir 无论如何都关闭了。不过谢谢!
  • 现在我只是在黑暗中进行刺探,看看有什么坚持:ini_get('values') 会给你预期的结果吗?您能否从查询中删除关键字 LOCAL,并将文件名设置为文件的绝对路径?
  • 非常好的建议。不幸的是,ini_get 对 mysql 和 mysqli.allow_local_infile 参数都返回 true。我删除了 LOCAL 并尝试使用绝对文件路径,它产生了与我得到的相同的结果。数据不加载。奇怪的是,当数据库中没有实际更改时,mysqli_info 会返回适当的受影响记录数。
  • 哦,我的上帝……我非常抱歉浪费了您的时间。就是这样。我从“mysqli 入门”指南中提取了 SET AUTOCOMMIT=0 并且真的没有想到这一点。非常感谢您的帮助,再次为浪费时间的问题道歉。
  • 不要浪费时间——其他人不可避免地会遇到类似的问题(特别是如果他们使用与您相同的入门指南工作)。感谢您的贡献!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多