我需要检查导入excel中的重复记录。当我单击导入时,重复的记录也会插入数据库表中。我不想在数据库表中插入重复的数据,但是我的代码在数据库表中插入了重复的记录。
这是我的代码
<?php
if (isset($_POST["import"])) {
ini_set('max_execution_time', 120); //300 seconds = 5 minutes
//$filename = $_FILES['file']['name'];
$file = $_FILES['file']['tmp_name'];
//$ext=substr($file,strrpos($file,"."),(strlen($file)-strrpos($file,".")));
//if($ext=="csv")
$handle = fopen($file, "r");
$c = 0;
while(($filesop = fgetcsv($handle,",")) !== false)
{
//$filesop[] = fgetcsv($handle,",");
$c++;
if ($c == 1) { continue; }
//$id = mysqli_real_escape_string($conn,$filesop[0]);
$category = mysqli_real_escape_string($conn,$filesop[0]);
$tags = mysqli_real_escape_string($conn,$filesop[1]);
$title = mysqli_real_escape_string($conn,$filesop[2]);
$url =mysqli_real_escape_string($conn,$filesop[3]);
$description = mysqli_real_escape_string($conn,$filesop[4]);
$date = date('Y-m-d', strtotime($filesop[5]));
$check="SELECT * FROM `report` WHERE title='$title' AND url='$url'";
$result=mysqli_query($conn,$check)or die($check."<br/><br/>".mysql_error());
if(mysqli_num_rows($result) == 0) //If no rows are returned
{
//print_r($filesop[0]);
var_dump($filesop);
//echo $filesop[0];
$sql = "insert into report(category,tags,title,url,description,date) values ('$category','$tags','$title','$url','$description','$date')";
$result=mysqli_query($conn,$sql)or die($sql."<br/><br/>".mysql_error());
//echo $sql;
print_r($_FILES);
//
//echo $filesop[1];
//echo "success";
}
else
echo "duplicates found";
}
//if($result){
//echo " upload success";
exit();
//ini_set('auto_detect_line_endings',FALSE);
fclose($handle);
// }
//else
// echo "cannot upload csv file";
}
mysqli_close($conn);
?>
答案 0 :(得分:0)
您的代码看起来有些疯狂。首先,您应该让数据库完成这项工作。在几乎所有用例中,数据库都比php快。为此,请在数据库表中定义一个唯一列。在唯一列中,值只能出现一次。这样,您可以更新此重复的唯一键上的条目。
如您的代码示例所示,您检查标题和URL。我建议根据条目的标题和网址构建一个哈希。该哈希将是唯一标识符。
$identifier = hash('sha256', $title . $url);
使用此唯一标识符,您可以通过一个查询轻松地插入或更新数据库。
$sql = "
INSERT INTO
report
(category, tags, title, url, description, date, identifier)
VALUES
(?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
category = VALUES(category),
tags = VALUES(tags),
description = VALUES(description),
";
在此示例中,我们正在使用所谓的准备好的语句。我们这样做是为了以安全的方式执行您的sql语句。此外,我们避免调用使用预处理语句时真正不需要的这些真正的转义函数。
$stmt = mysqli_prepare($connection, $sql);
if (!$stmt) {
// error handling here
}
$result = $stmt->bind_param('sssssss',
$category,
$tags,
$title,
$url,
$description,
$date,
$identifier
);
if (!$result) {
// error handling
}
// executing the insert statement
$result = $stmt->execute();
if (!$result) {
// error handling
}
请记住,您需要数据库表中的唯一键索引才能使用重复键更新语法。因此,创建一个具有唯一索引的新列“标识符”。
CREATE UNIQUE INDEX index_name ON table_name(index_column_1);
希望对您有帮助。