如何判別多組表單欄位IP是否重複申請

edited 十月 2013 in 進階PHP討論
各位PHP高手您好:

小弟詢問一問題請教大老,關於多組IP申請判斷是否重複的程式!

表單欄位呈現如下:

埠號1 來源IP1 目的IP1
埠號2 來源IP2 目的IP2
埠號3 來源IP3 目的IP3
埠號4 來源IP4 目的IP4
埠號5 來源IP5 目的IP5
埠號6 來源IP6 目的IP6
埠號7 來源IP7 目的IP7
埠號8 來源IP8 目的IP8

當沒有重複時可以寫入IP紀錄資料表,重複時秀出提醒!
注意:必須精準判斷每一組IP是否重複 ,不管來源或目的!

我是寫出來了,是採用逐一比對方式,但考量若資料庫上萬筆時,效能可能不彰,請問各位大老可否有更簡單簡潔的撰寫判斷方式呢?
可否提供程式供參考! 若不方便張貼於此,可否寄Email給我呢?
我的Email: [email protected] 先謝謝各位!

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3328

評論

  • edited 四月 2008
    不大懂你的意思

    是指
    ipa ipb ipc
    來源 目的
    ipa ipb ok
    ipa ipc ok
    ipc ipb ok
    ipb ipa ok
    ipa ipc 跳提醒??

    如果是這樣 可以考慮由資料庫方面著手
    兩個欄位都設成primary key
    這樣重複的就會發生衝突無法新增
  • edited 四月 2008
    八組IP 是由USER 端在表單畫面輸入,但只要每一次輸入的IP跟已經紀錄申請過的IP使用紀錄資料表比對後,若無重複會再紀錄新的一筆IP組到IP使用記錄資料表,反之,只要任何一組IP跟IP使用紀錄表發生重複,會發生提醒訊息!
    這樣的描述應該就很清楚了!


    資料庫有個TABLE(指得是IP使用紀錄資料表) 專門紀錄申請過IP!
    PORT號不管 可以重複填寫!
  • edited 四月 2008
    若還是不懂 ,想像一下 你是一位負責開發IP使用申請系統的網管,公司員工要使用電腦前,必須先上系統註冊,由您統一管理,但每位員工只限申請一次,一次可以有多台PC申請,但每台IP位址不能重複申請使用,系統必須做細部驗證。


    例如USER A 申請過的IP位址,USER B 不能再使用!
    我試過了,採用資料庫逐一比對每個IP欄位是可以的,但效能不彰! (須考量多人同時上線申請狀況)
  • edited 四月 2008
    資料庫用什麼格式記錄 IP ?字串?如果是這樣,可以試著轉為數字:
    ip2long() long2ip()
    數字的比對會比文字快上許多
  • edited 四月 2008
    資料庫用varchar紀錄IP,但我認為轉數字多此一舉了!
    xxxx.xxxx.xxxx.xxxx 整個當一個字串來比較比較省事!
    若有一千組IP 用數字比會很沒效率!
  • edited 四月 2008
    恩,那就期待你找出完美的答案來教教我們了 ;)
  • edited 四月 2008
    底下是小弟利用資料庫的IP使用紀錄表記錄使用過的IP,當使用者在表單輸入兩組新IP時,會判斷是否重複,若沒有重複則新增新的IP紀錄到IP使用紀錄表中! 反之秀出警告提示並顯示IP使用紀錄資料表現有的所有IP!

    <?php

    include('func/sqlConn.php');

    $ip1 = $_POST;
    $ip2 = $_POST;
    $ip_lists=array();


    $sql=@mssql_query(";select DISTINCT IP from IP使用紀錄表");

    do{
    $ip_lists[]= $info;

    }while($info = @mssql_fetch_array($sql));



    if($_POST=='form1' && (!empty($ip1) && !empty($ip2))){

    $error=0;

    for($i=0; $i<count($ip_lists); $i++){

    if (!strcasecmp ($ip1, $ip_lists[$i]) || !strcasecmp ($ip2, $ip_lists[$i])) {

    $error+=1;

    }else{
    $error=$error;

    } //end...if

    } // end...for


    if($error>0) {

    foreach($ip_lists as $ip){
    echo $ip." ";
    }
    echo "<script>alert('抱歉! 您IP已經申請過了,請不要重複申請!');</script>";

    }else{

    //IP 沒有重複就新增到清單
    $sql = "insert into IP使用紀錄表(IP)values('$ip1') " ;
    $result = @mssql_query($sql, $conn);

    $sql = "insert into IP使用紀錄表(IP)values('$ip2') " ;
    $result = @mssql_query($sql, $conn);

    }
    }

    ?>
  • edited 四月 2008
    剛剛試了一下,把文字改成數字的差異不大,但是改成透過資料庫判斷速度快了30 倍,測試資料十萬筆 :)

    簡單的說,你的問題在於你把所有資料抓出來一一比對,速度的瓶頸在於比對的次數與資料傳輸。

    看來我跟 sam0228 把問題看的太複雜了 ^^||
  • edited 四月 2008
    恩! 而且使用資料庫比對可以去除重複比對,速度可以快一些!

    其實這些都是小問題,如果今天要來寫一支程式依據使用者上網購物習性行為及年度銷售分析細目資料來預設某消費者未來可能喜愛的消費商品及商品廣告,系統可以自動判別哪一類型的消費者給哪一類型商品及廣告,這就很有挑戰性的!
Sign In or Register to comment.