1

IPアドレスを含むデータをログテーブルに挿入しています。何らかの理由で、IP列がNULLになることがあります。ほとんどの場合(すべてのレコードの99.9%)、IPは適切に記録されます。

IPは、inet_aton()関数を使用して、符号なしINT列に格納されます。これにより、IPアドレスがドットで区切られた形式(zzz.xxx.yyy.www)から数値形式に変換されます。

MySQLのドキュメントには、INET_ATON()とNULLに関して次のように記載されています。

INET_ATON()は、引数を理解できない場合、NULLを返します。

INET_ATON()は、短い形式のIPアドレス(「127.0.0.1」の表現としての「127.1」など)に対してNULL以外の結果を返す場合と返さない場合があります。

クエリに流れ込むデータをログに記録しており、バインドされているパラメータに実際にはIPアドレスが含まれており、nullではないことを確認しました。それらのIPアドレスは正常に見えます。手動で実行すると

SELECT INET_ATON('zzz.yyy.xxx.www');

結果は、予想どおり数値表現になります。

完全を期すために、コード(注:一見無関係な列を削除):

/* @var $conn PDO */
$stmt = $conn->prepare(
'INSERT INTO subscription_log(
    email, groupid, subscribe_ip
) VALUES (
    :email,
    :groupid,
    inet_aton(:label_subscribe_ip),
)');
$result = $stmt->execute($params);

// With the following input for $params (print_r):
Array
(
    [email] => user@domain.com
    [groupid] => 51299
    [label_subscribe_ip] =>  145.222.138.151
)

最後に、関連性があるとは思えませんが、MySQLのバージョン情報は次のとおりです。

version = 5.5.27-28.1
version_comment = Percona Server (GPL), Release 28.1
version_compile_machine = x86_64
version_compile_os = Linux

私にとって、それは神秘的です。これをさらにデバッグする方法について何か提案はありますか?

4

1 に答える 1

1

入力に空白 (または印刷できない文字) が追加されている可能性があります。

ここにリテラル出力を投稿したと仮定します。

Array
(
    [email] => user@domain.com
    [groupid] => 51299
    [label_subscribe_ip] =>  145.222.138.151
)

145.実際の入力が (先頭にスペースがある) ことを意味する前に、2 つのスペースがあります_145.222.138.151

trim()パラメーター リストに ip を追加する前に使用してみてください。

于 2012-12-03T11:19:30.493 に答える