新:CSV上傳與當地WAMP但不使用遠程LAMP LOAD DATA
實際上傳.csv文件使用WinSCP賦予具有正確的結構到服務器的/ tmp文件夾,然後運行LOAD DATA LOCAL INFILE
從mysql
CLI作品完美無缺。但是,如果您從表單上傳,我會觸發「抱歉」錯誤。我echo'ed和var_dumped幾個全局$ _FILE變量,這裏是他們的研究結果:
$ _FILES [ 'CSV'] [ 'tmp_name的值']:
dirname
是/tmp
basename
是php8k4jFN
(不同的每次我運行該腳本並沒有結束的.csv)
filename
是php8k4jFN
完整文件路徑:
/tmp/php8k4jFN
$ _FILES [ 'CSV'] [ '錯誤']:
0
權限:
mysql
和www-data
是root
組的一部分,兩者都允許讀/寫/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的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
}
}
}
}
您是否測試過是否收到文件? – frz3993
@ frz3993 如果我沒有錯,每次重新啓動後都會清除「/ tmp」。我沒有重啓我的LAMP服務器,因爲'/ tmp'文件夾裏沒有任何東西。因此,我認爲說沒有收到文件必須是安全的。我也嘗試手動將文件上傳到'/ tmp'中,以查看是否存在讀/寫權限問題,但我能夠毫無問題地上傳文件。 – BaddieProgrammer
我認爲'/ tmp'文件中的文件將在PHP腳本完成執行後被刪除。試試'echo pathinfo($ _ FILES ['filename'] ['tmp_name']);'。看看你有什麼收穫。將文件名更改爲您的csv文件名。 – frz3993