2011-03-21 155 views
3


如何檢查數據庫中是否存在重複條目?我不想阻止它,只是一個警告。所以如果它已經存在,它只是給出一個警告,取決於用戶是否忽略它。
在此先感謝!PHP MySQL檢查重複條目?

+0

有點困惑,你是否試圖查看記錄是否存在比不運行插入命令,或者你想通過在mysql中使用鍵和其他約束來防止重複條目? – Incognito 2011-03-21 13:46:17

+0

更好地使用['UNIQUE' constraint](http://dev.mysql.com/doc/refman/5.5/en/create-table.html)禁止重複值:「一個'UNIQUE'索引創建一個約束索引中的所有值必須是不同的。如果嘗試使用與現有行匹配的鍵值添加新行,則會發生錯誤。對於所有引擎,'UNIQUE'索引允許多個'NULL'值可以包含NULL的列。「 – Gumbo 2011-03-21 13:46:50

+0

不,我只是想檢查一下,如果它已經存在,它會發出警告,用戶可以忽略它,但可以也取消它。 – 2011-03-21 13:47:29

回答

7
$key_id = 123; 

$result = mysql_query("SELECT * FROM table WHERE key_id='$key_id'"); 
$num_rows = mysql_num_rows($result); 

if ($num_rows) { 
    trigger_error('It exists.', E_USER_WARNING); 
} 
+0

謝謝!這很簡單,呵呵。如果我理解正確,它會檢查'$ result'是否爲true/not-null,對嗎? – 2011-03-21 13:54:01

+2

實際上它檢查'$ result'內的行數。如果它不是零,那麼你有一個副本。 – Saul 2011-03-21 14:00:53

+0

我使用:'if($ result)'而不是num_rows來檢查$ result是否爲true,是保存嗎? – 2011-03-21 14:01:50

0

另一種選擇是使用SELECT COUNT()查詢它會告訴你複製數量,而不是隻檢查任何行返回的。

SELECT COUNT(*) FROM table WHERE field = '$field'

如果使用NUM行的方法,這將是更有效的,如果你不選擇,當你不打算使用它們所有領域 - 不要讓MySQL的引擎的工作比更難它需要。

4

我做了一個友好的方式來處理重複的東西像用戶ID。例如,如果用戶輸入一個id約翰並且該ID已經存在,它將自動更改爲john1。如果john1存在,它會自動變爲john2等

// Force the while statement to execute once 
    $usercount = 1; 
    // The number to append to the duplicate value 
    $incrementcount = 0; 
    // Store the original value 
    $origuserid = $userid; 

    while ($usercount != 0) { // Query the database for the current ID 
     $query = "SELECT COUNT(*) FROM userlist WHERE userid = '$userid'"; 
     if ($stmt = $con->prepare($query)) { 
      $stmt->execute();                   
      $stmt->close(); 
      $stmt->bind_result($usercount); 
      $stmt->fetch(); 
     } else { 
     die('Query error'); 
     } 
    if ($usercount != 0) { 
    // if count is anything other than zero, it's a duplicate entry 
      $incrementcount++; // value to append 
      $userid = $origuserid . $incrementcount; // append value to original user id 
      // the while loop will execute again and keep incrementing the value appended 
      // to the ID until the value is unique 
     } 
    } 
+0

歡迎來到SO,希望發佈。 ;) – vdbuilder 2012-11-02 18:53:22

0

我意識到這是一個老帖子,但我有錯誤,與選定的答案,因爲它總是會返回true,當它是假的,精確複製從上面的答案,所以我寫了一個微小的變化。

function checkValid($ipCheck){ 
    $con=mysqli_connect("localhost","******","******","$DB_NAME"); 

    $result = mysqli_query($con,"SELECT * FROM $TBL_NAME"); 
    $end = true; 
    while($row = mysqli_fetch_array($result) && $end) 
    { 
     if(strcmp($row['IP'],$ipCheck) == 0) 
      $end = false; 
    } 
    return $end; 
} 

這個做什麼,是掃描所有,直到它到達虛假陳述。如果不是,那麼它將保持爲真,意味着沒有重複,繼續前進,否則,它會發現重複並返回false,並觸發counter語句。

那麼假設我試圖知識產權的從我的數據庫進行比較,該列是IP:

if (!empty($_SERVER['HTTP_CLIENT_IP'])){ 
    $ip=$_SERVER['HTTP_CLIENT_IP']; 
//Is it a proxy address 
}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
}else{ 
    $ip=$_SERVER['REMOTE_ADDR']; 
} 
if(checkValid($ip)){ 
    $sql = "INSERT INTO $TBL_NAME (IP) VALUES ('$ip')"; 
    if (!mysqli_query($con,$sql)) 
    { 
     die('Error: ' . mysqli_error($con)); 
    } 
} 
else 
    echo "IP Already Exists In Database"; 

我非常新到PHP,但是這工作得很好,我的目的,並且不加載頁面時似乎會影響我的速度。