あなたの質問への答えは、使用することlike
です:
SELECT *
FROM blocked
WHERE $_SERVER['REMOTE_ADDR'] like replace(ip, '*', '%')
のワイルドカードlike
は'%'
ではなく で'*'
あるため、アスタリスクがパーセント記号に置き換えられます。実際には のような文字列を保存すると思います'199.199.%.%'
が、上記はわかりやすくするためのものです。
これで問題は技術的に解決されますが、MySQL はこれらの比較にインデックスを使用しない可能性があるため、別の問題があります (こちらを参照)。影響は、ブロックされたテーブルの大きさによって異なります。100 行ある場合、これは問題にならない可能性があります。100,000 あれば、おそらくそうです。
ブロックされたテーブルにワイルドカードを使用する代わりに、列としてFromIP
とを使用することもできToIP
ます。次に、「199.199. .」のようなものは、単に「199.199.000.000」および「199.199.999.999」として保存されます。クエリは次のようになります。
where $_SERVER['REMOTE_ADDR'] between FromIP and ToIP
そして、あなたは に索引を持っているでしょうblocked(FromIP, ToIP)
。