2015-06-19 52 views
1

新:CSV上傳與當地WAMP但不使用遠程LAMP LOAD DATA

實際上傳.csv文件使用WinSCP賦予具有正確的結構到服務器的/ tmp文件夾,然後運行LOAD DATA LOCAL INFILEmysql CLI作品完美無缺。但是,如果您從表單上傳,我會觸發「抱歉」錯誤。我echo'ed和var_dumped幾個全局$ _FILE變量,這裏是他們的研究結果:

$ _FILES [ 'CSV'] [ 'tmp_name的值']

dirname/tmp

basenamephp8k4jFN不同的每次我運行該腳本並沒有結束的.csv

filenamephp8k4jFN

完整文件路徑:

/tmp/php8k4jFN

$ _FILES [ 'CSV'] [ '錯誤']:

0

權限:

mysqlwww-dataroot組的一部分,兩者都允許讀/寫/tmp

mysql CLI執行LOAD DATA INFILE LOCAL...mycsv.csv文件中/tmp做工精細儘管有一些警告(這可能觸發的錯誤?)。

刪除的AppArmor,給根權限1775噸/ tmp目錄


我的表格,您可以上傳CSV 文件

我用LOAD DATA LOCAl INFILE將CSV的內容上傳到MySQL表中。 想法是:用戶使用我的表單將他的計算機上的本地CSV上傳到遠程LAMP服務器。

如果我測試本地環境中的所有內容(WAMP在我的電腦上運行),那麼一切正常。我已經解決了所有的語法,邏輯和CSV結構錯誤。

當我將整個源代碼上傳到遠程LAMP服務器並嘗試從我的筆記本電腦上傳一個CSV文件到我的觸發器時,我觸發了我的自定義錯誤:"Sorry, couldn't upload the CSV"

我測試了它,並且我沒有在本地得到這個錯誤。後來,我發現我必須啓用local-infile裏面的my.cnf下的[mysqld][mysql]在LAMP服務器上讓我使用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" 
} 

目前出於想法,爲什麼會發生這種情況。萬一它很重要,我已經使用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

您是否測試過是否收到文件? – frz3993

+0

@ frz3993 如果我沒有錯,每次重新啓動後都會清除「/ tmp」。我沒有重啓我的LAMP服務器,因爲'/ tmp'文件夾裏沒有任何東西。因此,我認爲說沒有收到文件必須是安全的。我也嘗試手動將文件上傳到'/ tmp'中,以查看是否存在讀/寫權限問題,但我能夠毫無問題地上傳文件。 – BaddieProgrammer

+1

我認爲'/ tmp'文件中的文件將在PHP腳本完成執行後被刪除。試試'echo pathinfo($ _ FILES ['filename'] ['tmp_name']);'。看看你有什麼收穫。將文件名更改爲您的csv文件名。 – frz3993

回答

0

只好把生產轉移到WAMP,而不是LAMP。對我來說,對於Linux的權限問題一定是未知的。