2015-01-12 203 views
-4

我有這個反饋表我做了,但我需要一些幫助。我想阻止人們發佈反饋,如果他們已經使用存儲在數據庫中的同一個ip進行反饋的話。下面是代碼:如何檢查一個IP是否已經存儲在mysql中?

<?php 
if(isset($_POST['add'])){ 
    $name = $_POST['name']; 
    $email = $_POST['email']; 
    $comment = $_POST['comment']; 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $datetime = date('Y-m-d H:i'); 
    $checkIp = mysql_query("SELECT ip from comments WHERE ip = '$ip'"); 
    if (mysql_num_rows($checkIp) > 0) { 
     echo "Only 1 feedback per IP allowed!"; 
     $IP = mysql_fetch_array($checkIp); 
     print_r($IP); 
    } 
    if($name){ 
     if($email){ 
      if($comment){ 
       if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
        mysql_query("INSERT INTO comments (id, name, email, comment, ip, datetime) VALUES ('','$name','$email','$comment','$ip','$datetime')"); 
       } 
       else       
        echo "The email address is invalid!<br><br>"; 
      } 
      else 
       echo "You haven't entered any comment!<br><br>"; 
     } 
     else 
      echo "You haven't entered an email address!<br><br>"; 
    } 
    else 
     echo "You haven't entered your name!<br><br>"; 
} 

我想有一個自己去,但沒有成功(你可以在我嘗試了一些功能上看到的),有人可以告訴我怎麼辦呢?

+3

*不要*使用IP,它不是唯一的人類 –

+3

此外,不要使用mysql_ *函數,因爲它們是官方棄用!,看看[預備聲明](http://php.net/manual/en/ mysqli.quickstart.prepared-statements.php) – Neat

+3

如果你只需要一個,只需在表中的該字段設置一個「唯一」約束。 – developerwjk

回答

1

您應該使用PDO或mysqli_,並使用已準備的語句而不是mysql_,因爲它已被棄用且將被刪除。另外,如果您確實希望IP地址在此表中是唯一的,則應在該字段上設置一個unique約束。

,不過也許你可以簡單地通過在要檢查的行數的if語句添加exit;得到這個代碼就工作,因爲這點(病例的約90-98%):

if (mysql_num_rows($checkIp) > 0) { 
    echo "Only 1 feedback per IP allowed!"; 
    $IP = mysql_fetch_array($checkIp); 
    print_r($IP); 
    exit; //stop execution here so nothing else happens 
} 

的代碼將是開放的SQL注入,但是,如果你繼續mysql_,也不會是那麼簡單,會選擇離開打開同一IP的多個數據庫中莫名其妙地結束了技術可能性。

例如,如果兩個請求同時進入,並且都將數據庫讀爲沒有IP,那麼兩個請求都會被插入。在表中有一個限制,這種情況不會發生,因爲數據庫服務器本身會管理約束。

相關問題