在处理之前检查条目

时间:2011-05-22 18:58:06

标签: php mysql

嘿伙计们! 我有一个脚本应该将图像添加到数据库中。它做到了。唯一的问题是它不仅会添加新图像,还会添加现有图像。 我确定这对你来说非常简单,对我来说太过分了!

因此,此代码应再次检查条目是否存在,然后添加图像(如果不存在)。 谢谢:))

    <?php

include('mysql.php');

if ($handle = opendir('images')) {

    /* This is the correct way to loop over the directory. */
    while (false !== ($file = readdir($handle))) {
        if($file!='.' && $file!='..') {
            $images[] = "('".$file."')";
        }
    }

    closedir($handle);
}

$query = "INSERT INTO images (filename) VALUES ".implode(',', $images)." ";
if (!mysql_query($query)) {
    print mysql_error();
}
else {
    print "finished installing your images!";
}


?>

4 个答案:

答案 0 :(得分:2)

我们来看看。要检查退出的文件名是否已存储在数据库中,您必须执行以下操作:

  • 从数据库中检索文件名
  • 检查当前文件是否在他们之间

PS:你应该要求你的mysql.php文件,没有它,你的脚本的其余部分将无法工作。

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

$existing_files = array();
$qry = mysql_query("SELECT filename FROM images WHERE 1");
while($row = mysql_fetch_assoc($qry)) {
    array_push($existing_files, $row['filename']);
}


if ($handle = opendir('images')) {
    while (false !== ($file = readdir($handle))) {
        if($file!='.' && $file!='..' && !in_array($file, $existing_files)) {
            $images[] = "('".$file."')";
        }
    }

    closedir($handle);
}

$query = "INSERT INTO images (filename) VALUES ".implode(',', $images)." ";
if (!mysql_query($query)) {
    print mysql_error();
}
else {
    print "finished installing your images!";
}

答案 1 :(得分:2)

您可以将filename字段设为唯一(CREATE UNIQUE INDEX filename_idx ON images (filename)),然后将INSERT INTO images替换为INSERT IGNORE INTO images

作为一个额外的好处,您现在还可以将filename字段编入索引,这将SELECT加快filename的速度。

答案 2 :(得分:1)

您应该在数据库中添加filename作为唯一键。

或者,你可以使用这个PHP脚本:

$exists = mysql_query("SELECT * FROM images 
   WHERE filename LIKE '%".mysql_real_escape_string($images[0])."%'");
if(mysql_num_rows($exists == 0)){
  $query = "INSERT INTO images (filename) VALUES ".implode(',', $images)." ";
  if (!mysql_query($query)) {
    print mysql_error();
  }
  else {
    print "finished installing your images!";
  }
}

答案 3 :(得分:1)

为什么不对文件执行md5sum,并将其用于唯一性,然后执行select以查看文件是否存在,如果不是插入文件并将id作为批准状态返回,或者如果它已经存在现有记录的id。通过文件名来做是好的,除非有几个人上传相同的文件但命名不同。这样做的缺点是如果文件很大,那么你需要一些资源才能做到这一点。