此 MySQL 版本不允许使用的命令

The used command is not allowed with this MySQL version

好吧,在尝试了一周的所有不同想法答案后,我发现都没有成功,我要问了。这是针对 MySQL 的 LOAD DATA LOCAL INFILE。有很多关于这个的帖子,但我仍然无法从网络浏览器让它工作,但我可以从服务器上的 mysql 命令提示符 运行 它,使用相同的用户和通过连接到同一个数据库。到目前为止我尝试了什么

  1. MySQL 版本 5.5
  2. Ubuntu 12.04
  3. PHP 版本 5.3

在my.cnf local-infile=1 在 mysqld,mysql,mysql-安全 loose-local-infile=1 客户

重新启动 MySQL 服务器。此时我可以从命令提示符 运行 进行查询,而以前没有。 我已经给出了从 777 访问中提取文件的目录。 我已经确认 php.ini 启用了本地文件参数。 我已经更新了 apparmor。 实际查询:

LOAD DATA LOCAL INFILE '/var/www/ui/uploads/r_import.csv' INTO TABLE r_data FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (first_name,last_name,apt,user_id)

以上查询来自 mysql 命令,在与服务器的连接中没有特殊参数。

如果有人对此有任何想法,我很乐意尝试任何事情...... 提前致谢。

<?php
include 'includes/header.php';
if($_FILES['file']['type'] != "application/vnd.ms-excel"){
   die("This is not a CSV file.");
}
elseif(is_uploaded_file($_FILES['file']['tmp_name'])){
    $filename = $_FILES['file']['tmp_name'];
    $name = $_FILES['file']['name'];
    copy( $filename, 'uploads/'.$name ) or die( "Could not copy file!");
    $file_to_import = '/var/www/ui/uploads/'.$name;
   $query = 'LOAD DATA LOCAL INFILE  \''.$file_to_import.'\' INTO TABLE r_data FIELDS TERMINATED BY  \',\' ENCLOSED BY  \'"\' LINES TERMINATED BY  \'\n\' IGNORE 1 ROWS (first_name,last_name,apt,user_id)';
   echo $query;
   $result = mysqli_query($link,$query) or die(mysqli_error($link));
}
else{
   die("You shouldn't be here");
}
?>

您的问题是使用了 LOCAL 关键字。当您使用 LOCAL 时,服务器期望 MySQL 客户端读取文件并发送它。这适用于客户端软件 运行ning 在远程计算机上,或者当您 运行ning 服务器本身上的 MySQL 客户端时。 (这就是为什么您可以 运行 从服务器命令行进行查询的原因)。

如果您运行正在PHP,则不涉及客户端软件。 PHP 直接调用服务器,因此 LOCAL 关键字在此上下文中无效。

要使用 PHP 中的 LOAD DATA INFILE,您必须确保该文件位于服务器文件系统 中的 位置,MySQL 服务器具有读取权限,并且该文件的完整路径作为查询的一部分传递。不要使用 LOCAL 关键字。

如果您尝试从远程客户端加载文件,您需要先将文件上传到文件系统,然后再执行查询。

请注意 MySQL 手册中的这句话:如果指定了 LOCAL,则文件由客户端主机上的客户端程序读取并发送到服务器。

参考:http://dev.mysql.com/doc/refman/5.5/en/load-data.html

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, 'localhost', $username, $password, $database);

数据库的连接字符串对我有用。我在developerwjk

给出的link的最后一条评论里找到了