好吧,经过一周的尝试,我发现没有成功的所有不同的想法答案,我会问。这是针对MySQL的LOAD DATA LOCAL INFILE。有很多相关的帖子,但我仍然无法从Web浏览器中获取它,但是能够从服务器上的mysql命令提示符运行它,使用相同的用户并传递连接到同一个数据库。到目前为止我尝试了什么
在my.cnf中
local-infile=1
在mysqld,mysql,mysql-safe中
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");
}
?>
答案 0 :(得分:1)
$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, 'localhost', $username, $password, $database);
数据库的连接字符串对我有用。我在developerwjk给出的链接的最后一条评论中找到了它。
答案 1 :(得分:0)
您的问题是使用LOCAL
关键字。当您使用LOCAL
时,服务器希望MySQL客户端读取文件并发送它。当客户端软件在远程计算机上运行时,或者当您在服务器上运行MySQL客户端时,这适用。 (这就是您可以从服务器命令行运行查询的原因。)
如果您正在运行PHP,则不涉及客户端软件。 PHP直接调用服务器,因此LOCAL
关键字在此上下文中无效。
要从PHP使用LOAD DATA INFILE
,您必须确保该文件位于MySQL服务器具有读取权限的服务器文件系统中的位置,并且该路径指向该文件作为查询的一部分传递。请勿使用LOCAL
关键字。
如果您尝试从远程客户端加载文件,则需要先将文件上传到文件系统,然后执行查询。
请注意MySQL手册中的这句话:如果指定了LOCAL,则客户端主机上的客户端程序将读取该文件并将其发送到服务器。