一尘不染

LOAD DATA LOCAL INFILE失败-从php到mysql(在Amazon rds上)

mysql

我们正在将数据库从位于Web服务器上的移动到单独的服务器(从Amazon EC2 Web服务器到RDS实例)。

由于数据库将位于与Web服务器不同的计算机上,因此在此之前需要有一个LOAD DATA INFILE才能正常工作。

在我的开发服务器上进行测试,结果证明它不起作用:

  • 我仍然可以像以前一样从php加载数据文件
  • 我可以从mysql命令行加载数据本地文件(使用–local_infile = 1)
  • 我无法从php加载数据本地文件。

在起作用的两件事之间,它排除了:

  • SQL或PHP代码的问题
  • 上传文件的问题,包括语法和文件权限
  • mysql服务器设置问题

我得到的错误是:错误1148(42000):此MySQL版本不允许使用命令(如果我不使用–local_infile =
1,我将从mysql命令行中获取该错误)


其他一些相关信息:

  • Ubuntu 12.04,MySQL 5.5.24,PHP 5.3.10
  • 我正在使用php的mysql_connect(而不是mysqli,因为我们正计划使用不支持mysqli的facebook的hiphop编译器。)
  • 因此,connect命令需要一个额外的标志集:

    mysql_connect($dbHost, $dbUser, $dbPass, false, 128);
    
  • 我已经用phpinfo()来确认 mysql.allow_local_infile = On

  • 我已经在Amazon RDS上尝试过它(以防万一这是我的开发服务器中的问题),并且在那儿也无法正常工作。(启用local_infile参数。)

我唯一没有尝试过的事情就是在我的开发服务器上编译mysql服务器,并打开允许本地infile的标志…但是即使我在我的开发服务器上正常工作,它也不会帮助我使用Amazon
RDS。(此外,LOAD DATA LOCAL INFILE确实可以从mysql命令行运行。)


似乎是php的mysql_connect()特有的问题

任何使用LOAD DATA LOCAL INFILE(也许来自Amazon RDS)的人都知道使它起作用的技巧吗?


阅读 314

收藏
2020-05-17

共1个答案

一尘不染

我已经放弃了这一点,因为我认为这是php中的错误-
特别是mysql_connect代码,现已弃用。可以通过使用与@eggyal提到的错误报告中提到的步骤类似的步骤自行编译php,对源代码进行更改来解决该问题:https
://bugs.php.net/bug.php ? id
=
54158

相反,我将通过执行system()调用并使用mysql命令行来解决此问题:

$sql = "LOAD DATA LOCAL INFILE '$csvPathAndFile' INTO TABLE $tableName FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\\"' ESCAPED BY '\\\\\\\\' LINES TERMINATED BY '\\\\r\\\\n';";
system("mysql -u $dbUser -h $dbHost --password=$dbPass --local_infile=1 -e \"$sql\" $dbName");

那对我有用。

2020-05-17