0

ユーザーのIPが禁止されたIPのデータベースにある場合、ページの上部で死ぬ基本的なスクリプトが欲しいです。これまでのところ、自動インクリメント ID と IP を持つ IP を挿入するスクリプトがあります。PDO ライブラリを使用していますが、返された配列をデータベースから取得し、in_array かどうかを確認するにはどうすればよいですか?

データベース情報を返す方法は次のとおりです。

$query = " 
    SELECT 
        id, 
        ip
    FROM banned 
"; 

try 
{ 

    $stmt = $db->prepare($query); 
    $stmt->execute(); 
} 
catch(PDOException $ex) 
{ 

    die("Failed to run query: " . $ex->getMessage()); 
} 


$rows = $stmt->fetchAll();

次に、ページの上部で終了してリダイレクトするように書いた簡単なスクリプトを次に示します。

if(in_array($_SERVER['REMOTE_ADDR'], $row["ip"])) 
{ 
header("Location: banned.php")
die("Banned!"); 
}

私の全体的な質問は、取得したデータを取得して配列に入れる方法を教えてください。

4

2 に答える 2

0

関数を使用しip2long()て、IP アドレスを整数に変換します。これらの整数をデータベースに保存し、代わりに次のクエリを使用します。GolezTroll がコメントで指摘しているように、整数フィールドが であることを確認してUNSIGNEDください。

$query = 'SELECT id, ip FROM banned WHERE ip = ';
$query .= ip2long($_SERVER['REMOTE_ADDR']);
$query .= ' LIMIT 1';

このように、テーブルはインデックス作成に非常に適しているため、テーブルから最大でbanned1 つのエントリしか取得できません。現在のコードは毎回すべてのエントリを取得するため、Web サーバーと mysql サーバーの両方にかなりの負荷がかかります。

また、列はそれ自体で主キーとして機能するはずなので、おそらくid禁止されたテーブルから列を取り除くことができます。ip

于 2012-11-28T23:10:48.987 に答える
0

しないでください。これらすべてのアドレスを配列に照会するのは無駄です。次のようなクエリを使用してください。

SELECT 
  CASE WHEN EXISTS
    (SELECT 
      'x' 
    FROM 
      banned 
    WHERE 
      ip = :ip) THEN
    'Y'
  ELSE
    'N'
  END AS IsBanned

もちろん、:IP には正しい IP アドレスを入力する必要があります。このクエリは、常に正確に 1 つのレコードを返します。そのレコードには、IP アドレスが禁止されている場合は常に「Y」が含まれ、禁止されていない場合は「N」が含まれます。そのフィールドに一意の制約 (一意のインデックス) を追加することでそれを防ぐことができますが、IP を誤って 2 回禁止した場合でも、クエリは引き続き機能します。

ただし、IP による禁止は理想的ではないことに注意してください。多くの人は今でも毎日異なる IP アドレスを持っています。つまり、彼らはまだあなたのサイトにアクセスできますが、罪のない他の人はアクセスできません. また、世帯全体と会社全体が同じ IP を使用しているため、1 人のユーザーをブロックすると、数千の会社全体がブロックされる可能性があります。

IP アドレス (IPv4、つまり) は整数フィールドに格納できます。ただし、IP アドレスをパラメーターで渡す場合は、フィールド自体が整数であっても、文字列として渡す必要があることに注意してください。MySQL 整数パラメータは符号付き 32 ビットです。これは、128 以上で始まる IP アドレスの問題を意味します。それはあなたの比較を台無しにします。

于 2012-11-28T23:10:49.597 に答える