0

誰かが私のサイトにアクセスしたときにユーザーの IP をログに記録したいのですが、サイトに到着したときにテーブルが存在しない可能性があるため、UPDATE クエリでエラーが発生します。また、既存のテーブルと照合する必要もあります。私は試しました:読んでいますが、テーブルが存在しない場合、この問題をカバーするものはないようです。おそらくタイプミスです。

$db->query("INSERT INTO track (tm, user_agent, host, ip, port, lang) VALUES ('$tm','$user_agent','$host','$ip','$port','$lang') WHERE NOT EXISTS (
    SELECT ip FROM track WHERE ip='$ip'");
4

2 に答える 2

5

おそらく、 INSERT ... ON DUPLICATE KEY UPDATE 構文を見たいと思うでしょう。これにより、キーが既に存在する場合にアクションを指定できます。

于 2013-02-21T16:44:10.687 に答える
0

あなたのタイプミスを見つけました。

より良いフォーマットの(悪い)コード:

$db->query("
    INSERT INTO track (
        tm, 
        user_agent, 
        host, 
        ip, 
        port, 
        lang
    ) 
    VALUES (
        '$tm',
        '$user_agent',
        '$host',
        '$ip',
        '$port',
        '$lang'
    ) 
    WHERE NOT EXISTS 
    (
        SELECT ip FROM track WHERE ip='$ip'
");

修正後:

$db->query("
    INSERT INTO track (
        tm, 
        user_agent, 
        host, 
        ip, 
        port, 
        lang
    ) 
    VALUES (
        '$tm',
        '$user_agent',
        '$host',
        '$ip',
        '$port',
        '$lang'
    ) 
    WHERE NOT EXISTS 
    (
        SELECT ip FROM track WHERE ip='$ip'
    ) -- that was missing
");

とにかく、次のようなものが必要になる場合があります。

    // check if ip exists
    $query = $db->$query("
        SELECT count(ip) FROM track WHERE ip='$ip'
    ");

    $result = $query->fetchFirstRowSomehow(); // i dont know methods you have in $db object

    $rows = $result['0']; // getting first (only) column that should contain count()

    if ($rows == 0)
    {
        // your insert code here
    }
    else
    {
        // your update code here
    }
于 2013-02-21T16:45:41.297 に答える