【问题标题】:php LOAD DATA LOCAL INFILE csv to mysqlphp LOAD DATA LOCAL INFILE csv 到 mysql
【发布时间】:2013-01-24 17:32:58
【问题描述】:

在我在这里提出第一个问题之前,我已经尝试了一段时间并尽可能多地调查了途径。

我有一个非常简单的 csv 文件。一列,数据由 linux 换行符分隔。我想将它导入到表(代码)的第二列(密码)中。第一列是主键自增。

这是简单的 csv 数据(linux 换行 - \n)

A12345678911
A12345678912
A12345678913
A12345678914

这是收集文件的表格。

<form enctype="multipart/form-data" action="upload_webcodes.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
        <input type="hidden" name="success" value="success" />
    Send this file: <input name="webcodeupload" type="file" />
    <input type="submit" value="Send File" />
</form>  

这是试图运行查询以将 tmp 文件加载到数据库中的 php。

<?php

function dbconnect(){
$db = mysql_connect('localhost', 'root', 'root');
mysql_select_db("mydatabase", $db);
return $db;
}

if ($_FILES['upload']['type'] === 'text/csv') { 
    $database = dbconnect();
    $getfile = $_FILES['upload']['tmp_name'];   
    $sql = " LOAD DATA LOCAL INFILE $getfile INTO TABLE codes (`passcode`) LINES TERMINATED BY '\n' ";
    mysql_query($sql);   
}
?>

我无法让它工作。我正在用 MAMP 在本地尝试这个。 /tmp/php 文件夹 Date Modified 得到更新,但我在那里看不到文件。我什至尝试过更大的文件,因为我的测试文件非常简单。 我在提交表单后打印出了 $_FILES 数组。

Array
(
    [webcodeupload] => Array
        (
            [name] => Aimport.csv
            [type] => text/csv
            [tmp_name] => /Applications/MAMP/tmp/php/phpsp9ezx
            [error] => 0
            [size] => 52
        )

)

看来预期的结果是有的?我已经在 phpmyAdmin 中尝试过查询,如果我删除了 LINES TERMINATED BY 子句,它就可以工作。我怀疑这是 phpmyAdmin 的问题,我也尝试过在查询中使用和不使用该子句的这段代码。

此外,加载页面时还会出现一些“未定义索引”错误。我有点理解为什么,并且已经阅读了这里的线程,指出了掩盖错误的方法,但我有兴趣知道如何避免它们而不是隐藏它们。

任何意见都将不胜感激。

谢谢。

【问题讨论】:

  • 查看mysql_query()的返回值。加载查询可能失败,但您没有捕获任何返回值,这意味着您只是假设一切都成功了。至少:$result = mysql_query(...) or die(mysql_error()).
  • 查看这个问题的答案:stackoverflow.com/questions/6114651/…

标签: php mysql csv load-data-infile


【解决方案1】:

首先,您分析正确,文件应该在/tmp/php。所以,你应该检查

  1. /tmp/php 文件夹中的权限。
  2. 为了让 MySQL 能够从 /tmp/php 目录中读取文件,在 linux 中,不要忘记在 /etc/apparmor.d/usr.sbin.mysqld 中设置 apparmor 配置,方法是添加此行 /tmp/php/** rwk,

【讨论】:

    【解决方案2】:

    将您的条件更改为:

    if ($_FILES['webcodeupload']['type'] == 'text/csv') {
        // what you have now
    }
    

    您提供的转储显示表单输入字段是“webcodeupload”,但您的 PHP 正在检查“upload”。

    脚本结束时文件不存在的原因很好,这就是 php 的工作原理。必须调用move_uploaded_file函数才能真正将上传的文件移动到某处,否则PHP会在脚本结束时将其删除(以防止资源消耗攻击)。

    请注意,您的 if 语句中的内容可能存在其他问题,但这会让您更接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 2012-06-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多