新
使用具有正确结构的WinSCP将实际的.csv文件上传到/ tmp文件夹到服务器,然后从LOAD DATA LOCAL INFILE
CLI运行mysql
完美无瑕。但是,如果您从表单上传,我会触发“抱歉”错误。我已经回显了var_dumped几个全局$ _FILE变量,这是他们的结果:
$ _ FILES [ 'CSV'] [ 'tmp_name的值'] :
dirname
是/tmp
basename
是php8k4jFN
(每次运行脚本都不一样,并且没有.csv结束)
filename
是php8k4jFN
完整文件路径:
/tmp/php8k4jFN
$ _ FILES [ 'CSV'] [ '错误']:
0
权限:
mysql
和www-data
是root
群组的一部分,两者都可以读/写/tmp
从LOAD DATA INFILE LOCAL...
CLI执行mysql
,mycsv.csv
内的/tmp
文件正常工作,但有一些警告(可能会触发错误吗? )。
删除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服务器上local-infile
和my.cnf
下的[mysqld]
内启用[mysql]
,让我使用LOCAL
关键字。< / p>
在我做出改变之前,我曾经得到: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"
}
目前没有关于为什么会发生这种情况的想法。如果重要,我已经使用THIS指南来设置我的远程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
}
}
}
}
答案 0 :(得分:0)
不得不将生产转移到WAMP而不是LAMP。我一定不知道Linux的许可问题。