【问题标题】:Load data in file from form upload从表单上传加载文件中的数据
【发布时间】:2016-06-30 21:00:18
【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

  • pdo/mysqli 默认在失败时返回布尔值 false,并且您不会检查它。永远不要假设数据库调用成功。始终假设失败,检查失败,并将成功视为惊喜。

标签: php mysql


【解决方案1】:

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

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

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

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

所以先试试第一种方法,如果不行就试试第二种。

【讨论】:

  • 我可以在 PHPMyAdmin 中成功执行 LOAD DATA INFILE 查询,但在我的 PHP 脚本中不行
  • 因为您从不同的文件加载,并且该文件是世界可读的。
  • 将文件值设置为 1 是什么意思? chmod() 不修改任何变量,它只是更改文件的权限。这是 Unix/Linux 服务器吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多