php LOAD DATA LOCAL INFILE csv to mysql

时间:2013-02-08 20:58:54

标签: php mysql csv load-data-infile

我已经尝试了一段时间,并在问我第一个问题之前尽可能多地调查一下。

我有一个非常简单的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的事情,我也在查询中使用和不使用该子句尝试了这段代码。

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

真的很感激任何意见。

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

将您的条件更改为:

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

您提供的转储显示表单输入字段为&#34; webcodeupload&#34;,但您的PHP正在检查&#34;上传&#34;。

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

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