我正在尝试使用load data infile查询将数据插入MySQL表。我有一个HTML表单,接受上传文本文件,然后尝试处理。
文件
00|Oakleaf Forest|Norfolk|VA|United States|PC
01|Igo|Lowell|MA|United States|PC
02|Mint|Lawrence|MA|United States|PC
03|Hosa|Boston|MA|United States|PC
HTML
<p>Please upload file below:</p>
<form action="process.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" accept="text/plain">
<input type="submit">
</form>
PHP
/* processFile
* Process the submitted file
*
* @param Array - file for processing
*/
function processFile($file) {
// Get global variable
global $DB;
// file contents
$file_contents = $file["tmp_name"];
$SQL_statement = "LOAD DATA INFILE '$file_contents' INTO TABLE organization FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n' IGNORE 2 LINES
(ein, legal_name, city_name, state_name, country_name, description);";
// Run SQL query
$DB->execute($SQL_statement);
}
当我上传文件时,表格中没有插入任何内容。
我尝试使用echo($SQL_statement);
进行调试,返回以下查询:
LOAD DATA INFILE '/Applications/XAMPP/xamppfiles/temp/phpOtL2q1' INTO TABLE organization FIELDS TERMINATED BY '|' LINES TERMINATED BY ' ' IGNORE 2 LINES (ein, legal_name, city_name, state_name, country_name, description);
我在这里缺少什么?
答案 0 :(得分:2)
LOAD DATA INFILE
要求数据库进程可以读取该文件。我怀疑临时上传文件是否具有世界可读性,它可能只能由网络服务器用户ID读取。
您可以尝试的一件事是首先更改临时文件的权限:
chmod($file["tmp_name"], 0444);
但是,如果包含临时文件的目录不是世界可读的,那么这仍然可能不起作用。另一种解决方案是使用LOAD DATA LOCAL INFILE
。这将在PHP中读取文件,而不是数据库服务器,因此可以加载PHP进程可以读取的任何文件。它不那么有效,因为所有文件数据都必须通过数据库连接发送,但它避免了权限问题。
首先尝试第一种方法,如果它不起作用,请尝试第二种方法。