Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加载数据本地加密失败-从php到mysql(在Amazon rds上)_Php_Mysql_Amazon Rds_Load Data Infile - Fatal编程技术网

加载数据本地加密失败-从php到mysql(在Amazon rds上)

加载数据本地加密失败-从php到mysql(在Amazon rds上),php,mysql,amazon-rds,load-data-infile,Php,Mysql,Amazon Rds,Load Data Infile,我们正在将数据库从Web服务器上移动到单独的服务器(从AmazonEC2WebServer到RDS实例) 我们有一个加载数据填充,它在之前工作过,现在需要添加本地关键字,因为数据库将位于Web服务器的另一台机器上 在我的开发服务器上进行测试,结果表明它不起作用: 我仍然可以像以前一样从php加载数据填充 我可以从mysql命令行加载数据本地填充(使用--LOCAL_infle=1) 我无法从php加载数据本地填充 在这两件事之间,它排除了: sql或php代码的问题 上载文件存在问题,包括

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

我们有一个加载数据填充,它在之前工作过,现在需要添加本地关键字,因为数据库将位于Web服务器的另一台机器上

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

  • 我仍然可以像以前一样从php加载数据填充
  • 我可以从mysql命令行加载数据本地填充(使用--LOCAL_infle=1)
  • 我无法从php加载数据本地填充
在这两件事之间,它排除了:

  • sql或php代码的问题
  • 上载文件存在问题,包括语法和文件权限
  • mysql服务器设置问题
我得到的错误是: 错误1148(42000):此MySQL版本不允许使用该命令 (如果不使用--local_infle=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\u local\u infle=On
  • 我在AmazonRDS上试过(以防在我的开发服务器上出现问题),但在那里也不起作用。(本地_infle参数处于启用状态。)
我所读到的唯一一件我没有尝试过的事情是在我的开发服务器上编译mysql服务器,并启用允许本地填充的标志。。。但是,即使我在我的开发服务器上使用它,它也不能帮助我使用AmazonRDS。(除此之外,从mysql命令行加载数据本地infle也可以工作。)


这似乎是php的mysql_connect()的一个问题


任何使用LOAD DATA LOCAL Infle(可能来自Amazon RDS)的人都知道如何实现这一点吗?

我已经放弃了这一点,因为我认为这是php中的一个缺陷,尤其是mysql\u connect代码,现在已经不推荐使用了。可能可以通过使用与@eggyal提到的bug报告中提到的步骤类似的步骤,通过修改源代码自己编译php来解决这个问题:

相反,我将通过调用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");
这对我来说很有效。

如中所述,需要向mysql\u connect添加第3个和第4个参数才能使加载本地数据填充正常工作。它帮助了我。任何其他建议(apparmor,my.cnf中的local infle=1,在互联网上广泛讨论)都没有帮助。下面的PHP代码为我工作

mysql_connect(HOST,USER,PASS,false,128);

True,这也在中。

使用客户端使用infle True激活的以下行


mysql——local infle=1-u root-p

这里有一个检查列表来排除这个讨厌的bug:


1-在MySQL中授予用户文件权限,phpMyAdmin通常不包括此权限:

GRANT FILE ON *.* TO 'db_user'@'localhost';
2-在/etc/mysql/或您的mysql路径中编辑my.cnf:

[mysql]
local-infile=1
[mysqld]
local-infile=1
3-在php.ini的/etc/php5/cli/或类似版本中:

mysql.allow_local_infile = On
也可以在脚本中运行
ini\u set

ini_set('mysql.allow_local_infile', 1);
4-数据库处理程序库必须使用正确的选项。
PDO:

mysqli:

5-确保infle命令使用文件的绝对路径,并且该路径存在:

$sql = "LOAD DATA INFILE '".realpath(is_file($file))."'";
6-检查目标文件和父目录是否可由PHP和MySQL读取

$ sudo chmod 777 file.csv
7-如果您在本地工作,您可以从SQL中删除
LOCAL

LOAD DATA INFILE
而不是:

LOAD DATA LOCAL INFILE

注意:如果编辑MySQL和PHP服务的配置文件,请记住重新启动它们


希望这能对其他人有所帮助。

如果您在2020年这样做,那么有一个建议是检查phpinfo.php或php--ini以查找配置文件的位置。对我来说,我使用virtualmin并更改了PHPINI文件,但我的站点有自己的特定ini文件。一旦我找到了它的位置并更改了它,一切都恢复了正常。

谢谢,根据PHP5.3.9中修复的问题,我正在使用PHP5.3.10-1ubuntu3.4,不过如果没有其他人有任何建议的话,我可能会尝试自己编译带有更改的php。事实上,再看看,这个bug似乎纯粹与PDO有关(您没有使用)。对于稍后来看这个的其他人来说,@eggyal提到的bug是值得的,它看起来实际上是一个PHP5.3.X bug。我看到了完全相同的问题,看起来PDO MySQL驱动程序的PHP源代码缺少了一个“local_infle=1”;据推测,5.4版本解决了这个问题,虽然我还没有亲自验证过这一点。@Redzarf为什么这些转义斜杠也是必要的?@codecowboy首先转义是因为它在php字符串(“)中,然后转义是因为它在sql字符串(”)中。它确实有点疯狂,但在第一行\\\\\最终被用作单个字符\n我得到一个错误1046(3D000)在第1行:No database selectedGreat checklist@pachanka!当我昨天对7.2.17进行PHP更新时,我的LOAD LOCAL DATA INFILE脚本给了我权限错误。你的No.3-解决了这个问题。似乎我的/etc/PHP/7.2/cli/PHP.ini被覆盖了,我修复了/取消了mysql.allow_LOCAL_inflie=On行的注释。由于我的脚本使用,我不需要重新启动PHP现在一切都正常了。
LOAD DATA INFILE
LOAD DATA LOCAL INFILE