从表单上载加载文件中的数据

时间:2016-06-30 21:00:19

标签: php mysql

我正在尝试使用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);

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

LOAD DATA INFILE要求数据库进程可以读取该文件。我怀疑临时上传文件是否具有世界可读性,它可能只能由网络服务器用户ID读取。

您可以尝试的一件事是首先更改临时文件的权限:

chmod($file["tmp_name"], 0444);

但是,如果包含临时文件的目录不是世界可读的,那么这仍然可能不起作用。另一种解决方案是使用LOAD DATA LOCAL INFILE。这将在PHP中读取文件,而不是数据库服务器,因此可以加载PHP进程可以读取的任何文件。它不那么有效,因为所有文件数据都必须通过数据库连接发送,但它避免了权限问题。

首先尝试第一种方法,如果它不起作用,请尝试第二种方法。