2010-12-28 3 views
1

ユーザーにIPアドレスに基づいて1回だけデータをデータベースに保存します。私は、URL、日付、時間とipsリストを持つデータベースを持っています。 IPが既に存在するかどうかを確認する方法はありますか?そうでない場合は - データをデータベースに挿入します。これまでのところ私のコードです:ユーザーのIPが一意である場合にのみクエリを実行します。

<Check if IP already exists in the database - if no - insert:> 


$query = "INSERT INTO link (url, date, time, ip) VALUES ('$ref','$date','$time', '$someip')"; 
mysql_query($query) or die('Error, insert query failed'); 

} 
else { 

echo 'This ip already exists'; 

} 
+0

あなたはIP..thatの道を格納するためip2long機能を使用することができますあなたは本当にIPアドレスを使用する理由がないか(または練習中です)、varchar – Oli

+0

の代わりに、より小さいintフィールドを使うことができます。代わりに、クッキーを使って作業する必要があります。多くの人が同じIPを共有できるため、そのうちの1人だけがクエリを実行できます。代わりに、人のIPアドレスを変更して、1人でクエリを複数回実行できるようにし、他の誰かがクエリを実行するために "IPを使用した"チャンスを得ないようにすることができます。また、最初の行は、HTMLまたはPHPのコメントではありません。 –

答えて

8

一致するIPを持つ行をデータベースに照会してください。 mysql_num_rowsを使用して、戻された行の数を判別できます。

$sql = "SELECT * FROM link WHERE ip = '127.0.0.1' LIMIT 1"; 
$query = mysql_query($sql); 

if(mysql_num_rows($query) == 0) 
{ 
    // IP does not exist, proceed with insert. 
} 

127.0.0.1は明らかに可変であるべきである。あなたは$_SERVER['REMOTE_ADDR']でユーザーのIPを得ることができます。

+0

これはきれいな方法ですが、DBへの呼び出しが1回だけ行われるため、@マークのソリューションは2倍高速です。 – Dave

+0

@Daveはあなたに知らせるために、データベースのタイミングは数に比例しません"呼び出し"。 –

+0

@Col。 Shrapnel、私は、結合を使ったクエリには、インデックス付きのキーに対するクエリがはるかに長くかかるという事実に同意します。しかし、この例のような単純な呼び出しのボトルネックは、DBからアプリケーションへのデータの転送時間であり、その逆でもあります。 "SELECT count(*)FROM link WHERE ip = '127.0.0.1' LIMIT 1 'クエリの結果がレコードの存在をチェックするためにのみ使用される場合、解決策は以下のように最適化することさえできます。 – Dave

2

ipカラムに一意のインデックスを付けます。複製が挿入されている場合は、障害が戻されます。この方法では、データベースに対して追加のクエリを実行する必要はありません。戻ってくるエラーが正しい方法で処理されていることを確認してください(または単にエラーを無視してください)。

CREATE UNIQUE INDEX name_of_index ON tablename (columns_to_index); 
2

あなたの列に一意のインデックスを作成します。

CREATE UNIQUE INDEX ix_link_ip ON link (ip) 

を挿入し、上のエラーをチェック:

$query = "INSERT INTO link (url, date, time, ip) VALUES ('$ref','$date','$time', '$someip')"; 
$res = mysql_query($query); 
if (!$res) { 
     if (mysql_errno() == 1062) /* unique key violation */ 
       die('This IP already exists'); 
     else 
       die(mysql_error()); 
} 


} 
関連する問題