PHP / MySQL检查是否存在值,如果不存在则插入

时间:2010-12-12 21:01:10

标签: php mysql

之前我曾问过这个问题,但无法理解。

我有这样的表格:

<?php
if ( isset ($_REQUEST['fname']{0}, $_REQUEST['lname']{0}, $_REQUEST['mail']{0}, $_REQUEST['url']{0}) ){
   $query = "INSERT INTO table1 (url, fname, lname, mail) VALUES ('".$_REQUEST[url]."', '".$_REQUEST[fname]."', '".$_REQUEST[lname]."', '".$_REQUEST[mail]."')"; 
$result = mysql_query($query)
or die ("Query Failed: " . mysql_error());
}
else{
   echo "One Of The Values Not Entered Correctly. Please Press Back In Your Browser And Enter The Missing Values.";
}
?>

我想知道是否有可能在再次输入之前检查系统中是否存在网址。

5 个答案:

答案 0 :(得分:5)

查看MySQL INSERT ... ON DUPLICATE KEY UPDATE,如果您在数据库中将URL设置为唯一,则可以使用它。

此外,您应确保在插入之前清理输入:http://php.net/manual/en/function.mysql-real-escape-string.php

答案 1 :(得分:2)

替换完全符合您的需要。

http://dev.mysql.com/doc/refman/5.0/en/replace.html

REPLACE的工作方式与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行

答案 2 :(得分:0)

确保db中的url列是PRIMARY或UNIQUE。

ALTER TABLE  `table1` ADD PRIMARY KEY(`url`);

在使用此插入函数之前,必须添加mysql_connect(),mysql_select_db()

function insert($post = array(), $tb, $announce=true, $ignore="",$updateonduplicate=false){

        foreach($post as $k => $v){
            $fields[$k] = $v;
            $values[] = mysql_real_escape_string($v);
        }

        $query = "INSERT {$ignore} INTO `{$tb}` (`".implode("`,`",array_keys($fields))."`)"." VALUES ('".implode("','",$values)."')";

        if($updateonduplicate !== false){

        $query .= " ON DUPLICATE KEY UPDATE ";
        $countfields = 0;
         foreach($fields as $field => $value){

            $query .= " `".$field."`='".$value."'";

            $countfields++;
            if(count($fields) !== $countfields)
            $query .= ",";
         }
        }


//mysql_connect(), mysql_select_db()
// assuming db is connected, database selected
            $result = mysql_query($query)

        if($announce !== true)
        return;


        if(!$result){       
            $announce = "Query Failed: " . mysql_error();

        }else{
            $announce = "insert_success";

        }

        if($updateonduplicate === true && $result === 0 && mysql_affected_rows() >=1){
            $announce = "update_success";
        }   

        return $announce;
    }

$post = array();
$post['url'] = $_REQUEST[url];
$post['fname'] = $_REQUEST[fname];
$post['lname'] = $_REQUEST[lname];
$post['mail'] = $_REQUEST[mail];

insert($post,"table1",true,"",true);

答案 3 :(得分:0)

如果您在网址列上有UNIQUEPRIMARY KEY索引,则INSERT IGNORE会执行您想要的操作。新行将进入,重复项将被忽略。 INSERT ... ON DUPLICATE KEY UPDATE将允许您更新是否存在重复项,如果这是您想要执行的操作。另外,请注意其他人的SQL注入注释。

答案 4 :(得分:0)

鉴于OP和后续注释中的描述(尝试插入,如果存在则抛出错误),我只需确保所需的“唯一”列具有唯一约束或者是主键的一部分。

然后,只需尝试插入并捕获/处理任何唯一约束违规错误。这比检查现有记录要快。

使用PDO并将错误模式设置为抛出异常意味着您可以在try catch块中很好地包装此代码。从内存中,唯一约束违规将异常代码设置为您可以测试的内容。