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

时间:2015-06-19 14:43:07

标签: php mysql file-upload nginx permissions

使用具有正确结构的WinSCP将实际的.csv文件上传到/ tmp文件夹到服务器,然后从LOAD DATA LOCAL INFILE CLI运行mysql完美无瑕。但是,如果您从表单上传,我会触发“抱歉”错误。我已经回显了var_dumped几个全局$ _FILE变量,这是他们的结果:

$ _ FILES [ 'CSV'] [ 'tmp_name的值']

dirname/tmp

basenamephp8k4jFN每次运行脚本都不一样,并且没有.csv结束

filenamephp8k4jFN

完整文件路径:

/tmp/php8k4jFN

$ _ FILES [ 'CSV'] [ '错误']:

0

权限:

mysqlwww-dataroot群组的一部分,两者都可以读/写/tmp

LOAD DATA INFILE LOCAL... CLI执行mysqlmycsv.csv内的/tmp文件正常工作,但有一些警告(可能会触发错误吗? )。

删除apparmor并授予root 1775权限t / tmp

我的表单可让您上传 CSV 文件。

我使用LOAD DATA LOCAl INFILE将CSV的内容上传到MySQL表中。 想法是:用户使用我的表单将计算机上的本地CSV上传到我的远程LAMP服务器。

如果我在本地环境中测试所有内容(在我的计算机上运行WAMP),那么一切正常。我已经解决了所有语法,逻辑和CSV结构错误。

只要我将整个源上传到远程LAMP服务器并尝试将CS​​V从我的笔记本电脑上传到它,我就会触发自定义错误:"Sorry, couldn't upload the CSV"

我测试了它,我在本地没有得到那个错误。后来,我发现我必须在LAMP服务器上local-infilemy.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的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"
}

目前没有关于为什么会发生这种情况的想法。如果重要,我已经使用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
        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

不得不将生产转移到WAMP而不是LAMP。我一定不知道Linux的许可问题。