0

ユーザーのIPをログに記録する評価スクリプトがあるので、ユーザーはファイルを2回以上評価できません。ただし、ファイルを評価してテストするたびに、$ ipはip2long()関数で変更されます。どうしたの?これが私のコードです:

<?php

require('connect.php');

    $sheetID = $_GET["id"]; 
    $rating = $_GET["rating"];
$ip= $_SERVER['REMOTE_ADDR'];
$ip = ip2long($ip);

    $checkIPQuery = mysql_query("SELECT * FROM ratings WHERE sheetID = '$sheetID' and INET_NTOA(ip) = '$ip'");
    $doesIPExist = mysql_num_rows($checkIPQuery);
    if ($doesIPExist == 0) { 
        mysql_query("INSERT INTO ratings (sheetID, rating, ip) VALUES ($sheetID, $rating, $ip)"); 

        echo " $ip
<script>setTimeout(function(){location.href = '../sheets.php?id=$sheetID'},1);</script>"; 
    }
    else
        echo 'You have already rated this image!'; 

?>

次に、ユーザーがスクリプトを評価したかどうかを確認します。

$id = $_GET['id'];
$ip=$_SERVER['REMOTE_ADDR'];
$ip = ip2long($ip);

$checkIPQuery = mysql_query("SELECT * FROM ratings WHERE sheetID = '$id' and INET_NTOA(ip) = '$ip'");

$doesIPExist = mysql_num_rows($checkIPQuery);

これが私がしたことです:

  • $ ipがvarchar(15)に入らない場合に、フィールドを未割り当てのINTに変更しました
  • ipフィールドをINTに変更したため、ip2long()関数を追加しました
  • 次に、IP2long()INTを読み取るためにINET_NTOA(ip)を追加しました

どんな助けでもいただければ幸いです。ありがとう!

編集:たとえば、$ ipを3に設定すると、これらのスクリプトは正常に機能します。

4

1 に答える 1

1

コメントと少しの調査を読んだ後、私は答えを見つけました、そしてそれは簡単です。

32ビットシステムでip2long()は、負と正の整数を返しますが、正の整数でINET_NTOA()のみ機能します。したがって、これを修正するには2つのオプションがあります。

  1. PHPコードを変更します。$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));
  2. SQLクエリを変更します。... AND ip = " . ip2long($_SERVER['REMOTE_ADDR']) . " ...

この事実は次の方法で確認できます。

$ip  = $_SERVER['REMOTE_ADDR'];
$int = ip2long($ip);    
var_dump($ip, $int, sprintf('%u', $int));

これにより、次の出力が生成されます。

string '192.168.1.120' (length=13)
int -1062731400
string '3232235896' (length=10)

次に、MySQLに移動します。

mysql> SELECT '192.168.1.120', INET_NTOA(-1062731400), INET_NTOA(3232235896)
+---------------+------------------------+-----------------------+
| 192.168.1.120 | INET_NTOA(-1062731400) | INET_NTOA(3232235896) |
+---------------+------------------------+-----------------------+
| 192.168.1.120 | NULL                   | 192.168.1.120         |
+---------------+------------------------+-----------------------+
1 row in set (0.00 sec)
于 2012-10-31T17:11:12.230 に答える