簡體   English   中英

PHP / MySQL檢查值是否存在,如果不插入它

[英]PHP/MySQL Check If Value Exists, If So-Do Not Insert It

我之前曾問過,但無法弄清楚。

我有這個表格:

<?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.";
}
?>

我想知道是否有可能在再次輸入之前檢查系統中是否存在網址。

檢出MySQL INSERT ... ON DUPLICATE KEY UPDATE ,如果您在數據庫中將URL設置為唯一,則可以使用它。

另外,在插入輸入之前,請務必清除輸入內容: http : //php.net/manual/zh/function.mysql-real-escape-string.php

替換功能完全滿足您的需求。

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

REPLACE的工作方式與INSERT完全相同,不同之處在於,如果表中的舊行與PRIMARY KEY或UNIQUE索引的新行具有相同的值,則在插入新行之前刪除該舊行

確保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);

如果您確實在url列上具有UNIQUEPRIMARY KEY索引,則INSERT IGNORE將做您想要的。 新行將進入,重復項將被忽略。 INSERT ... ON DUPLICATE KEY UPDATE將允許您更新是否有重復項(如果您要這樣做)。 另外,請注意此處其他人的SQL注入注釋。

給定OP中的描述和后續注釋(嘗試插入,如果存在則拋出錯誤),我只要確保所需的“唯一”列具有唯一約束或屬於主鍵即可。

然后,只需嘗試插入並捕獲/處理任何唯一的違反約束的錯誤。 這比檢查現有記錄更快。

在錯誤模式設置為引發異常的情況下使用PDO意味着您可以將此代碼很好地包裝在try catch塊中。 從內存中,唯一的約束違例會將異常代碼設置為可以測試的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM