2012-09-04 99 views
3

我现在导入我的CSV很好,除了一件事情,我如何获得导入忽略第一行中的数据?员工将上传第一行中具有列名称的相同格式。导入CSV,排除第一行

if (isset($_POST['submit'])) { 
    if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
     echo "<h1>" . "File " . $_FILES['filename']['name'] . " uploaded successfully." . "</h1>"; 
     echo "<h2>Displaying contents:</h2>"; 
     readfile($_FILES['filename']['tmp_name']); 
    } 

    //Import uploaded file to Database 
    $handle = fopen($_FILES['filename']['tmp_name'], "r"); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $import = "INSERT into tictoc(employee,taskname,tasktime,sessiontime,sessionstart,sessionend,sessionnotes) values('" . $userinfo['first_name'] . " " . $userinfo['last_name'] . "','$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]')"; 

     mysql_query($import) or die(mysql_error()); 
    } 

    fclose($handle); 

    print "Import done"; 
} 
+2

**你的代码很容易受到SQL注射**你*真的*应该使用[准备好的陈述](http:// stacko verflow。com/a/60496/623041),将您的变量作为参数传递到其中,而这些参数不针对SQL进行评估。如果你不知道我在说什么,或者如何解决它,请阅读[Bobby Tables]的故事(http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain) 。特别是,上传的文件可能包含将被注入到你的INSERT语句中的SQL。 – eggyal

回答

7

只是设置一个变量$i = 0那么只有插入时$i = 1以上

if (isset($_POST['submit'])) { 
    $i=0; //so we can skip first row 

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
     echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded successfully." . "</h1>"; 
     echo "<h2>Displaying contents:</h2>"; 
     readfile($_FILES['filename']['tmp_name']); 
    } 

    //Import uploaded file to Database 
    $handle = fopen($_FILES['filename']['tmp_name'], "r"); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     if($i>0) { 
      $import="INSERT into tictoc(employee,taskname,tasktime,sessiontime,sessionstart,sessionend,sessionnotes) values('".$userinfo['first_name']." ".$userinfo['last_name']."','$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]')"; 

      mysql_query($import) or die(mysql_error()); 
     } 
     $i++; 
    } 

    fclose($handle); 

    print "Import done"; 
} 
+0

虽然 – Hector

+0

@Hector第一行包含标题内容但你的问题是如何跳过第一行。查看更新的答案 – bretterer

+0

这实际上是一种糟糕的形式,在循环内部进行条件检查可以通过简单地在循环之前读取一行来处理。无需计数器或环路条件。 –

3

你可以试试这个:

array_shift($data); 
4

也许你可以,如果你喜欢用这样的方式:

$i=0; 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    $i++; 
    if($i==1) continue; 

    $import="INSERT into tictoc(employee,taskname,tasktime,sessiontime,sessionstart,sessionend,sessionnotes) values('".$userinfo['first_name']." ".$userinfo['last_name']."','$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]')"; 

    mysql_query($import) or die(mysql_error()); 
} 
+0

这工作谢谢! – Hector

3

我已经实现了这个代码,它是测试代码。我觉得这是非常使用全

你必须遵循一些规则: -

贵国的CSV文件根据数据库表名(例如:数据库表名用户,那么CSV应该users.csv)

2.您的CSV文件的第一行应该是数据库表字段名(例如:ID,姓名等)后,开始您的数据录入

3.you可以下载数据源类来源: - http://code.google.com/p/php-csv-parser/,因为我有以下要求代码:require_once'CSV/DataSource.php';

<?php 
ini_set('memory_limit','512M'); 
$dbhost = "localhost"; 
$dbname = "excel_import"; 
$dbuser = "root"; 
$dbpass = ""; 

$conn=mysql_connect ($dbhost, $dbuser, $dbpass) or die ("I cannot connect to the database because: " . mysql_error()); 
mysql_select_db($dbname) or die("Unable to select database because: " . mysql_error()); 


require_once 'CSV/DataSource.php'; 


$filename = "users.csv"; 
$ext = explode(".",$filename); 
$path = "uploads/".$filename; 

$dbtable = $ext[0]; 

import_csv($dbtable, $path); 


function import_csv($dbtable, $csv_file_name_with_path) 
{ 
    $csv = new File_CSV_DataSource; 
    $csv->load($csv_file_name_with_path); 

    $csvData = $csv->connect(); 

    $res=''; 
    foreach($csvData as $key) 
    { 
     $myKey =''; 
     $myVal=''; 
     foreach($key as $k=>$v) 
     { 
      $myKey .=$k.','; 
      $myVal .="'".$v."',"; 
      } 

     $myKey = substr($myKey, 0, -1); 
     $myVal = substr($myVal, 0, -1); 
     $query="insert into ".$dbtable." ($myKey)values($myVal)"; 
     $res= mysql_query($query); 

    } 

    if($res ==1) 
    { 

       echo "record successfully Import."; 

    }else{ 

       echo "record not successfully Import."; 
    } 
} 
6

您可以简单地使用MySQL的LOAD DATA INFILE命令,这将是considerably faster比解析CSV到PHP,构建INSERT声明对每条记录,提交其作为一个字符串到MySQL,并具有MySQL的解析说字符串SQL(在SQL注入的风险):

LOAD DATA INFILE ? INTO TABLE tictoc 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
IGNORE 1 LINES 
(tasktime, sessiontime, sessionstart, sessionend, sessionnotes) 
SET employee = ?, taskname = ? 

使用PDO:

$dbh = new PDO('mysql:dbname='.$dbname, $username, $password); 

if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
    $qry = $dbh->prepare(' 
    LOAD DATA INFILE :filepath INTO TABLE tictoc 
    FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' 
    IGNORE 1 LINES 
    (tasktime, sessiontime, sessionstart, sessionend, sessionnotes) 
    SET employee = :employee, taskname = :taskname 
    '); 

    $qry->execute(array(
    ':filepath' => $_FILES['filename']['tmp_name'], 
    ':employee' => $userinfo['first_name'], 
    ':taskname' => $userinfo['last_name'] 
)); 
} 
+0

这不能由客户端计算机上的php远程使用。 – aahhaa

+0

@wlin:使用'LOCAL'修饰符。 – eggyal

4

没有变量需要。这比这更简单。这是一个需要最少量外国代码的解决方案,并且工作得很好。尝试推出:

$headers = fgetcsv($handle, 1000, ","); 

在获取CSV数据的while()循环之前。这抓住了标题,但是没有将它们插入到数据库中。一旦while循环开始,第一行已经被返回,因此不在mysql插入中。最重要的是它似乎需要标题,所以这也解决了这个问题。

到底

所以,

if (isset($_POST['submit'])) { 
    if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
     echo "<h1>" . "File " . $_FILES['filename']['name'] . " uploaded successfully." . "</h1>"; 
     echo "<h2>Displaying contents:</h2>"; 
     readfile($_FILES['filename']['tmp_name']); 
    } 

    //Import uploaded file to Database 
    $handle = fopen($_FILES['filename']['tmp_name'], "r"); 

    //Grab the headers before doing insertion 
    $headers = fgetcsv($handle, 1000, ","); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $import = "INSERT into tictoc(employee,taskname,tasktime,sessiontime,sessionstart,sessionend,sessionnotes) values('" . $userinfo['first_name'] . " " . $userinfo['last_name'] . "','$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]')"; 

     mysql_query($import) or die(mysql_error()); 
    } 

    fclose($handle); 

    print "Import done"; 
} 
+0

我试过了,它工作。谢谢 ! – jdhaar

1

声明一个变量之前while循环

$row=1; 

然后在while循环把这个条件

if($row==1){ 
    $row++; 
    continue; 
}