2011-01-12 11 views
2

ip2countryテーブルを使用して、自分のウェブサイトのユーザーの国旗を表示しようとしています。MySQLで長いIPに変換する

私が思いついたもっとも簡単なことは、ユーザーがセッションテーブルから取得し、それぞれのIPが特定の範囲内にあるかどうかを確認するSQLステートメントを作成して国/フラグを把握することです。

オンラインで300人のユーザーが表示され、セッションテーブルからフェッチして国を照会してフラグを表示すると、大きなメモリが使用されるため、シンプルですが危険です。

SELECT 
    s.session_ip, 
    ipc.* 
FROM 
    session AS s 
    LEFT JOIN ip2country AS ipc 
    ON ipc.ip_lo <= s.session_ip AND ipc.ip_hi >= s.session_ip 
WHERE 
    s.session_time > '".(time() - 60))."' 

今では、ip2countryテーブルに保存されたIPアドレスが整数であるため、上記のクエリが間違っていることは明らかです例えば:

は今、私は、これは1つのクエリでそれを実行しようとしましたセッションテーブルに格納されたIPは、IPの文字列表現であり、例えば、1000013824である。 193.169.0.0

私はip2long()でIPからlong型に変換する方法を知っていますが、MySQLには同等のメソッドがありますので、2つのクエリを実行する必要はありませんか?

+0

まだ私が過負荷および問題を持って、上の任意の例をお楽しみくださいオンラインユーザーの旗を表示しています! –

+0

おそらくこの質問の範囲外でしょうか? –

答えて

21

SELECT INET_NTOA(1000013824) - > 59.155.0.0

SELECT INET_ATON( '193.169.0.0') - > 3249078272

:)

+0

と私のクエリは次のようになります:ON INET_ATON(ipc.ip_lo)<= s.session_ipとINET_ATON(ipc.ip_hi)> = s.session_ip ???? –

+2

どのようなことが起こるか試してみてはいかがですか? –

関連する問題