1

MySQL の Newsletter_ip フィールドは、UNSIGNED INT (10) として設定されます。データをフォーマットするために INET_ATON も試しましたが、結果は常に次のようになります

ここに私の処理コードの一部があります:

//Retrieve data from user and create variables

$ip_orig = $_SERVER['REMOTE_ADDR'];

$ip = ip2long($ip_orig);

//Place into database

$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES('".$email."', '".$ip."', '".$date."', '".$time."')";

また、ip2longフォーマットの前にこのスニペットを試しましたが、役に立ちませんでした:

if (!empty($_SERVER['HTTP_CLIENT_IP'])){
    $ip=$_SERVER['HTTP_CLIENT_IP'];
}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
    $ip=$_SERVER['REMOTE_ADDR'];
}

どんな助けでも大歓迎です、ありがとう!

4

6 に答える 6

1

問題の根本原因として、ip2long は、PHP のマニュアルに記載されているように、 signed int を提供します。

ノート:

PHP の整数型は符号付きであり、32 ビット アーキテクチャでは多くの IP アドレスが負の整数になるため、sprintf() または printf() の「%u」フォーマッタを使用して、符号なし IP アドレスの文字列表現を取得する必要があります。 .

そして、それをunsigned intとして保存します。これが、ゼロしか表示されない理由です。IPv6 を処理する標準的でクリーンなソリューションについては、他の人が既にソリューションを提供しています。

于 2012-06-26T15:35:30.823 に答える
0

IP アドレスにはいくつかのドットが含まれているか、IPv6アドレスである可能性があるため、newsletter_ip フィールドを VARCHAR として設定することをお勧めします。

現在、IP アドレスは実際には整数ではないため、0 として表示されている可能性があります。

于 2012-06-26T15:31:54.747 に答える
0

long を long としてではなく、文字列として保存しています。

また、MySQL 自体で変換を行ったほうがよいでしょう。

$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES ('".$email."', INET_ATON('".$ip."'), '".$date."', '".$time."')";

IP アドレスを取得するには、次のようにします。

SELECT INET_NTOA(newsletter_ip) as newsletter_ip FROM newsletter;

INET_ATON = アドレスから番号へ

INET_NTOA= アドレスから番号

于 2012-06-26T15:32:02.423 に答える
0

保存する前にIPを出力すると正しい値が得られますか? そうでない場合は、この情報をリクエストから削除するか名前を変更するプロキシが存在するかどうかを確認してください。

とにかく、IPを長く保存してもメリットはありません。このフィールドに、はるかに単純で扱いやすい文字列を使用しても、パフォーマンスが大幅に低下することはありません。その間、IPv6 用に十分なスペースを残しておいてください ;-)

于 2012-06-26T15:32:10.940 に答える
0

varchar(15) を min... varchar(45) として使用して、新しい IPv6 アドレスをサポートします。これも私の IP 関数です。

function ip()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
于 2012-06-26T15:35:28.037 に答える
0

サーバー側でINET_ATONを使用して MySQL に IP を変換させるのはどうですか?

//Retrieve data from user and create variables

$ip_orig = $_SERVER['REMOTE_ADDR'];

//Place into database

$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES('".$email."', INET_ATON('".$ip."'), '".$date."', '".$time."')";
于 2012-06-26T15:33:01.143 に答える