繁体   English   中英

CSV上传适用于本地WAMP,但不适用于使用LOAD DATA的远程LAMP

[英]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

basenamephp8k4jFN每次我运行脚本时都不同,并且没有.csv结尾

filenamephp8k4jFN

完整档案路径:

/tmp/php8k4jFN

$ _FILES ['csv'] ['error']:

0

权限:

mysqlwww-dataroot组的一部分,并且都允许读/写/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的echovar_dumpprint_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM