![](/img/trans.png)
[英]Is it possible to upload only the first 10 rows of a CSV file using MySQL - LOAD DATA LOCAL INFILE?
[英]CSV upload works with local WAMP but not with remote LAMP using LOAD DATA
新:
使用具有正确结构的WinSCP将实际的.csv文件上传到/ tmp文件夹到服务器,然后从mysql
CLI运行LOAD DATA LOCAL INFILE
可以正常工作。 但是,如果您从表单上传,则会触发“对不起”错误。 我已经回显和var_dumped几个全局$ _FILE变量,这是它们的结果:
$ _FILES ['csv'] ['tmp_name'] :
dirname
是/tmp
basename
是php8k4jFN
( 每次我运行脚本时都不同,并且没有.csv结尾 )
filename
是php8k4jFN
完整档案路径:
/tmp/php8k4jFN
$ _FILES ['csv'] ['error']:
0
权限:
mysql
和www-data
是root
组的一部分,并且都允许读/写/tmp
使用/tmp
内的mycsv.csv
文件从mysql
CLI执行LOAD DATA INFILE LOCAL...
可以正常工作,尽管有一些警告( 这会触发错误吗? )。
删除了apparmor并授予root 1775权限t / tmp
我的表单可让您上传CSV文件。
我使用LOAD DATA LOCAl INFILE
将CSV的内容上载到MySQL表中。 想法是:用户使用我的表单将计算机上的本地CSV上传到我的远程LAMP服务器。
如果我在本地环境(计算机上运行的WAMP)中测试了所有内容,则一切正常。 我已经解决了所有语法,逻辑和CSV结构错误。
一旦将整个源上传到远程LAMP服务器,并尝试从笔记本电脑向其上传CSV,就会触发我的自定义错误: "Sorry, couldn't upload the CSV"
。
我对其进行了测试,但从未在本地得到该错误。 后来,我发现必须在LAMP服务器上的[mysqld]
和[mysql]
下的my.cnf
启用local-infile
才能使用LOCAL
关键字。
在进行此更改之前,我曾经获得: The used command is not allowed with this MySQL version
。
我试图在PHP脚本中回显查询,并通过mysql命令行手动执行该查询,并收到以下错误(这是有道理的,因为临时文件不再存在): ERROR 2 (HY000): File '/tmp/phpINUea0' not found (Errcode: 2)
回显查询:
LOAD DATA LOCAL INFILE '/tmp/phpINUea0'
INTO TABLE mydb.suites
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(suite, business_name, business_phone, business_email)
SET location_id = 2
然后,我还尝试使用PHP的echo
, var_dump
和print_r
调试表单,但从所有三个语句中得到的返回均为空/假:
$query_add_suite_csv = $this->db_connection->query($query);
echo $query_add_suite_csv; // returns nothing
var_dump($query_add_suite_csv); // returns boolean false
print_r($query_add_suite_csv); // return nothing
if ($query_add_suite_csv) {
// success message
}else{
echo "Sorry, couldn't upload the CSV"
}
目前尚不知道为什么会发生这种情况。 万一重要,我已使用本指南来设置远程LAMP服务器。
文件上传PHP功能:
private function addSuiteCSV()
{
if (empty($_POST['suite_location_csv'])) {
$this->errors[] = "Must select location of suite";
}else{
// create a database connection
$this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (!$this->db_connection->set_charset("utf8")) {
$this->errors[] = $this->db_connection->error;
}
if (!$this->db_connection->connect_errno) {
$suite_location_csv = $this->db_connection->real_escape_string(strip_tags($_POST['suite_location_csv'], ENT_QUOTES));
if ($_FILES['csv']['size'] > 0) {
$file = addslashes($_FILES['csv']['tmp_name']);
$query =<<<EOF
LOAD DATA LOCAL INFILE '$file'
INTO TABLE mydb.suites
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(suite, business_name, business_phone, business_email)
SET location_id = $suite_location_csv
EOF;
$query_add_suite_csv = $this->db_connection->query($query);
if ($query_add_suite_csv) {
// success
} else {
// sorry
}
}else{
// empty file
}
}else{
// db connection error
}
}
}
}
必须将生产转移到WAMP而不是LAMP。 我一定对Linux的权限问题不了解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.