2012-09-18 62 views
0

我有这个php代码,旨在将csv文件中的所有行和列导入到mysql表中作为记录。它成功地从csv插入到名为“import_items”的mysql表中但是如果我重新导入,它会插入重复的记录。我需要的是适合查询更新的地方,它应该检查如果表名中存在项目 - >更新值,如果不存在 ..插入记录!使用更新从CSV导入到MySQL

这里是我的代码:

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 

File to import:<br /> 

<input size='30' type='file' name='filename'> 

<input type="submit" name="submit" value="Upload"></form> 



<?php 
require_once('connect_db.php'); 

    //Upload File 
    if (isset($_POST['submit'])) { 
    if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 


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


    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 

       //Update Database Values 

     $import="insert into import_items (item_no,qty,actual_price,discount_price,difference_price,date) VALUES('".mysql_real_escape_string($data[0])."', '".mysql_real_escape_string($data[1])."', '".mysql_real_escape_string($data[2])."', '".mysql_real_escape_string($data[3])."', '".mysql_real_escape_string($data[4])."', '".$date = date('Y-m-d')."')"; 

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

    } 



    fclose($handle); 
    } 
} 
    ?> 

谢谢

回答

2

查看INSERT INTO ... ON DUPLICATE KEY UPDATE ...语法。哦,并确保你的桌子上有主键,这几乎总是一个好主意。

+0

非常感谢你,它的作品像一个魅力:)! – Alihamra

0

MySQL有这将检查现有的行且仅当它不存在插入的声明。使用

REPLACE INTO import_items... 

而不是INSERT INTO。语法在其他方面是相同的。

该声明将检查表中主键的重复项。如果该键不存在,则会插入一行。如果密钥存在,它将更新该行中的其他字段。这相当于你先做一个SELECT,然后分支做一个UPDATE或INSERT。

+0

更换通常通过主键覆盖,而不是只有当主键不存在时才插入... – Orbling

+0

@Matt S,我试过更换,并且我仍然有重复:( – Alihamra

+0

@Alihamra,无论哪个解决方案,确保你有一个主键在桌子上,以避免重复。 –

0

您需要共享您的表架构。如果您不希望为其强制执行任何重复操作的列中没有正确的密钥,则使用REPLACE INTOINSERT ... ON DUPLICATE KEY UPDATE将不起作用。另一件很容易做的事情(一个是放置桌子),就是在要防止重复的列上放置一个唯一的键。