2012-08-09 89 views
3

我知道还有其他类似的帖子,但是大家都推荐直接在PHPMyAdmin中将其转换为MySQL(这很好用,但我需要导入通过一个HTML表格到PHP到MySQL使用PHP代码和HTML格式将excel(.csv)导入到MySQL中

我想要一个HTML表单来收集文件,然后将该文件传递给PHP脚本,我想知道是否可以简单地调用PHP函数该转换逗号delimeted .csv文件到MySQL并将其添加到数据库中。

或者是解析由行的文件行并添加每个记录的唯一途径?

+0

PHPMyAdmin使用HTML表单和PHP。阅读其来源,看看他们是如何做到的。 – 2012-08-09 23:44:21

+0

查看http://code.google.com/p/php-csv-parser/它会将.csv转换为数组。然后,您可以循环访问数组并构建INSERT查询。 – JDavis 2012-08-10 00:05:28

回答

7

我还没有完全测试过这个,但我看不出有什么理由不起作用。

<?php 

if (isset($_FILES['userfile'])) 
{ 
    $csv_file = $_FILES['userfile']['tmp_name']; 

    if (! is_file($csv_file)) 
    exit('File not found.'); 

    $sql = ''; 

    if (($handle = fopen($csv_file, "r")) !== FALSE) 
    { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
     { 
      $sql .= "INSERT INTO `table` SET 
      `column0` = '$data[0]', 
      `column1` = '$data[1]', 
      `column2` = '$data[2]'; 
      "; 
     } 
     fclose($handle); 
    } 

    // Insert into database 

    //exit($sql); 
    exit("Complete!"); 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>CSV to MySQL Via PHP</title> 
</head> 
<body> 
    <form enctype="multipart/form-data" method="POST"> 
    <input name="userfile" type="file"> 
    <input type="submit" value="Upload"> 
    </form> 
</body> 
</html> 

当然,您需要先验证数据。

+0

+1这是非常有用的:) – 2012-08-27 01:04:53

+0

进行得很好,只需要为其他数据库稍微修改一下。你能告诉我如何导出?我将非常感激。 – Kasnady 2013-12-30 06:59:53

1

我们之前使用过它,它工作得很好。只要看你的文件和目录权限。 csv_upload_mysql_conf.inc就是数据库链接。这将一次解析多个文件,并将它们放入一个名为import的表中。相应更新。

<?php 

/* The conf file */ 
include_once "csv_upload_mysql_conf.inc"; 

$php_self = $_SERVER['PHP_SELF']; 
$file_open = 0; 
$file_exts = array 
('csv'); 

#Our Form..... 

$form = <<< EOFFORM 
<div align='center' style='border: 1px solid #CCC; background-color: #FAFAFA;padding: 10px; color: #006699; width: 620px; font-family: palatino, verdana, arial, sans-serif;' > 
<table align=center style='border: 1px solid #CCC; background-color: #FFF;padding: 20px; color: #006699;' cellspacing=1><tbody> 
<tr><td> 
<form enctype='multipart/form-data' action='$php_self' method='post'><input type='hidden' name='MAX_FILE_SIZE' value='2000000' /><input type='hidden' name='selected' value='yes' /> Selected file: <input name='userfile[]' type='file' id='userfile[]' multiple='' onChange='makeFileList();' /><br /><br /><input type='submit' value='Upload CSV' /> 
</td></tr></tbody></table></div> 
<p> 
     <strong>Files You Selected:</strong> 

    </p> 
    <ul id="fileList"><li>No Files Selected</li></ul> 
<script type='text/javascript'> 
     function makeFileList() { 
      var input = document.getElementById('userfile[]'); 
      var ul = document.getElementById('fileList'); 
      while (ul.hasChildNodes()) { 
       ul.removeChild(ul.firstChild); 
      } 
      for (var i = 0; i < input.files.length; i++) { 
       var li = document.createElement('li'); 
       li.innerHTML = input.files[i].name; 
       ul.appendChild(li); 
      } 
      if(!ul.hasChildNodes()) { 
       var li = document.createElement('li'); 
       li.innerHTML = 'No Files Selected'; 
       ul.appendChild(li); 
      } 
     } 
    </script> 
EOFFORM; 

#End Form; 

if(!isset($_POST['selected'])){ 

      echo "$form"; 

     } 

     elseif($_POST['selected'] == "yes"){ 
      $uploaddir = 'uploads/'; 
      if(count($_FILES['userfile']['name'])) { 
       foreach ($_FILES['userfile']['name'] as $key => $error) { 
       if ($error == UPLOAD_ERR_OK) { 
        $tmp_name = $_FILES['userfile']['tmp_name'][$key]; 
        $name = $_FILES['userfile']['name'][$key]; 
        $f_type = trim(strtolower(end(explode('.', $name)))); 
        if (!in_array($f_type, $file_exts)) die("Sorry, $f_type files not allowed"); 
       } 
     $uploadfile = $uploaddir . $name; 
     if (! file_exists($uploadfile)) { 
      if (move_uploaded_file($tmp_name, $uploadfile)) { 
       print "File is valid, and was successfully uploaded. "; 
       $flag = 1; 
       chmod($uploadfile, 0777); 
       } else { 
       print "File Upload Failed. "; 
       $flag = 0; 
       } 

     $flag = 1; 

     if ($flag == 1) { 
     echo "\n parsing Data..."; 
     flush(); 

     if (file_exists($uploadfile)) { 
     $fp = fopen($uploadfile, 'r') or die (" Can't open the file"); 
     $fileopen = 1; 
     $length = calculate_length($uploadfile); 
     } 

     $replace = "REPLACE"; 
     $field_terminater = ","; 
     $enclose_option = 1; 
     $enclosed = '"'; 
     $escaped = '\\\\'; 
     $line_terminator = 1; 
     $local_option = 1; 

     $sql_query  = 'LOAD DATA'; 

      if ($local_option == "1") { 
       $sql_query  .= ' LOCAL'; 
      } 

      $sql_query  .= ' INFILE \'' . $uploadfile . '\''; 
      if (!empty($replace)) { 
       $sql_query .= ' ' . $replace; 
      } 
      $sql_query  .= ' INTO TABLE ' . "`import`"; 
      if (isset($field_terminater)) { 
       $sql_query .= ' FIELDS TERMINATED BY \'' . $field_terminater . '\''; 
      } 
      if (isset($enclose_option) && strlen($enclose_option) > 0) { 
       $sql_query .= ' OPTIONALLY'; 
      } 
      if (strlen($enclosed) > 0) { 
       $sql_query .= ' ENCLOSED BY \'' . $enclosed . '\''; 
      } 
      if (strlen($escaped) > 0) { 
       $sql_query .= ' ESCAPED BY \'' . $escaped . '\''; 
      } 
      if (strlen($line_terminator) > 0){ 
       $sql_query .= ' LINES TERMINATED BY \'' . '\r\n' . '\''; 
      } 

     $result = mysql_query ($sql_query); 
     echo mysql_error() ; 

     if(mysql_affected_rows() > 1) { 
       echo " <div align=center><b><font color=#66CC33>The csv data was added.</font></div> "; 
     } 
     else { 
      error_log(mysql_error()); 
      echo " <div align=center><b><font color=#E96B10> Couldn't enter the data to db </font></div>"; 
     } 

     if ($file_open ==1) { 
     fclose($fp) or die("Couldn't close the file"); 
     } 
    } 
} 
} 
echo "<meta http-equiv='refresh' content='0; url=index.php'>"; 
} 
} 

function calculate_length($fp) { 
    $length = 1000; 
    $array = file($fp); 
    for($i=0;$i<count($array);$i++) 
    { 
     if ($length < strlen($array[$i])) 
     { 
      $length = strlen($array[$i]); 
     } 
    } 
    unset($array); 
    return $length; 
} 

?> 
+0

90%不是我的代码,也不是这样声称。使用它需要您自担风险......这一切都在谷歌搜索结果。我相信可以做出一些改进。另外,请原谅我们的懒惰文件扩展名数组。我们有时会允许txt文件,所以我们只用一个值来保留数组代码。 – 2012-08-10 02:27:16

1

您的代码中的所有内容都很好,唯一的错误是您没有使用mysql_query将数据插入表中。 Mysql查询未在您的脚本中运行。更正后的代码如下...

<?php 

if (isset($_FILES['userfile'])) 
{ 
    $csv_file = $_FILES['userfile']['tmp_name']; 

    if (! is_file($csv_file)) 
    exit('File not found.'); 

    $sql = ''; 

    if (($handle = fopen($csv_file, "r")) !== FALSE) 
    { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
     { 
      $sql = mysql_query("INSERT INTO `table` SET 
      `column0` = '$data[0]', 
      `column1` = '$data[1]', 
      `column2` = '$data[2]'; 
      "); 
     } 
     fclose($handle); 
    } 

    // Insert into database 

    //exit($sql); 
    exit("Complete!"); 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>CSV to MySQL Via PHP</title> 
</head> 
<body> 
    <form enctype="multipart/form-data" method="POST"> 
    <input name="userfile" type="file"> 
    <input type="submit" value="Upload"> 
    </form> 
</body> 
</html> 
+0

我不想实际将数据放入数据库中,因为没有必要回答他的问题。我只是想展示一个可以运行和测试的工作示例,以查看查询的外观。我很确定你的例子会失败,如果你试图运行它。理想情况下,您可以使用'PDO'和'bindParam',而不是连接一系列'INSERT INTO'语句。 – JDavis 2013-03-12 19:28:56