代码或csv文件不允许上传

时间:2016-02-10 16:47:04

标签: php mysqli mysqlimport

代码或csv的问题导致导入问题。任何可能与代码或csv有关的问题?

当我运行脚本时,我得到一个默认的messeage:CSV文件不可读

这适用于15个文件中的5个,无法看到明显的问题或解决方案。

http://www.dodgejeffgen.org/gs/issue1.csv

<?php  

ini_set('auto_detect_line_endings',TRUE);
ini_set('post_max_size', '128M');
ini_set('upload_max_filesize', '128M');

function clean($link, $str, $default ='') {
    if (!isset($str)) $str = $default;
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysqli_real_escape_string($link, $str);
}

$host_name  = "some host";
$database   = "some db";
$user_name  = "some user";
$password   = "some pass";

$connect = mysqli_connect($host_name, $user_name, $password, $database);
if (mysqli_connect_errno())
{ echo "Failed to connect to MySQL: " . mysqli_connect_error(); } else {}                       

$lines = $value1 = $value2 = $data = 0;

if ($_FILES["csv"]["size"] > 0) { 

    //get the csv file 
    $file = $_FILES["csv"]["tmp_name"]; 
    $handle = fopen($file,"r"); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        //print_r($data).'<br />';
        if ($data[0]) {
            $sql = "INSERT INTO `articles` (`name`, `reference`) VALUES ('".clean($connect, $data[0])."','".clean($connect, $data[1])."')";
            //echo $sql.'<br />';
            if (mysqli_query($connect, $sql)) { } else { echo "Error: " . $sql . "<br>" . mysqli_error($connect); }
           $lines++;
       }
    }
    echo "<b>Your file has been imported.</b><br>";
    echo "Found a total of ".$lines." records in this csv file.<br />"; 
} else { echo 'CSV File not readable.<br />';}

?>
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data" name="form1" id="form1"> 
  Choose your file: <br /> 
  <input name="csv" type="file" id="csv" /> 
  <input type="submit" name="Submit" value="Submit" /> 
</form>

2 个答案:

答案 0 :(得分:0)

我建议使用LOAD DATA LOCAL INFILE。只需将您的csv文件上传到服务器上的某个位置,然后运行以下mysql查询

LOAD DATA LOCAL INFILE '/path/to/csv_file.csv' INTO TABLE articles 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'  
(@col1,@col2) set `name`=TRIM(@col1),`reference`=TRIM(@col2)

答案 1 :(得分:0)

使用像Indra Kumar S推荐的LOAD DATA LOCAL INFILE可能更好。您可以将其加载到临时表(CREATE TEMPORARY TABLE ...)中,然后使用mysql查询将该数据分发到存储数据的任何永久表中。

除了FIELDS TERMINATED BYLINES TERMINATED BY之外,还请注意FIELDS ESCAPED BY以及其他选项。见这里:http://dev.mysql.com/doc/refman/5.7/en/load-data.html

首先加载到MySQL中的一个很酷的事情就是你可以使用MySQL,有时候在PHP的帮助下,进行大量的数据清理。 MySQL应该很好地修剪边缘,但你可能更喜欢选择PHP然后写回MySQL以进行更复杂的清理,比如删除不间断的空格,字符串中的额外空格或非ASCII字符。 / p>

当我做这样的事情时,我想我会通过CSV来确定每列的数据类型(varcharintdecimaltextdatetime),然后创建具有匹配数据类型的临时表,并为该表创建LOAD DATA INFILE