2013-02-08 46 views
1

我一直在尝试这一段时间,并调查尽可能多的渠道,因为我可以在此之前问我的第一个问题。php LOAD数据本地INFILE csv到mysql

我有一个非常简单的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文件夹修改日期得到更新,但我看不到文件。我甚至尝试过更大的文件,因为我的测试文件非常简单。 提交表单后,我已打印出$ _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的事情,我也试过这个代码,在查询中有和没有这个子句。

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

任何输入,将不胜感激。

谢谢。

+0

检查'mysql_query()'的返回值。负载查询可能会失败,但是您没有捕获任何返回值,这意味着您已经简单地认为它已成功。至少:'$ result = mysql_query(...)或死(mysql_error())'。 – 2013-02-08 21:14:47

+0

请参阅此问题的答案:http://stackoverflow.com/questions/6114651/php-mysql-load-data-infile-help – freejosh 2013-02-08 21:37:59

回答

0

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

  1. 权限在/tmp/php文件夹。
  2. 以MySQL的是能够从/tmp/php目录中读取文件,在linux下,不要忘记设置的AppArmor配置/etc/apparmor.d/usr.sbin.mysqld通过加入这一行/tmp/php/** rwk,
0

更改条件:

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

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

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

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