0

私は現在、クエリからの IP のみが Web サイトにアクセスできるようにするスクリプトに取り組んでいます。しかし、私の現在の問題は、クエリの最初の結果のみを通過させ、2番目の結果も残りの結果ではないことです。

require_once("../mysql.php"); 
$ip = $_GET['ip'];
$sql = "SELECT DISTINCT ip FROM servers WHERE status = 1";
$res = mysql_query($sql) or die(mysql_error());
$allow = mysql_fetch_assoc($res);
if ($ip != $allow['server']) {
    echo 'IP is not allowed!';
    die ();
}
$port = $_GET['port'];

この場合、何が間違っていますか?

4

5 に答える 5

0
require_once("../mysql.php"); 
$ip = $_GET['ip'];
$sql = "SELECT DISTINCT ip FROM servers WHERE status = 1";
$res = mysql_query($sql) or die(mysql_error());
while($allow = mysql_fetch_assoc($res))
{
    if ($ip != $allow['server']) {
    echo 'IP is not allowed!';
    die ();
    }
    else
    { $port = $_GET['port']; }

}

whileループを使用すると、すべての価値がもたらされます...

于 2013-04-06T10:15:15.403 に答える
0

ループが必要ですfor。そうしないと、クエリの最後の行しか取得できません!

$allow = mysql_fetch_assoc($res);

なるはず

while($allow = mysql_fetch_assoc($res){
     if ($ip != $allow['server']) {
          echo 'IP is not allowed!';
          continue;
      }else
         $port = $_GET['port'];
 }
于 2013-04-06T09:59:15.957 に答える
0

次のような while ループを使用する必要があります。

$ipAllowed = false;
while ($allow = mysql_fetch_assoc($res))
    if ($ip == $allow['server']) {
        echo 'IP is allowed!';
        $ipAllowed = true;
        break;
    }
if (!$ipAllowed) {
    echo 'IP is not allowed!';
    die();
}

または単に使用します(より高速な方法):

$sql = "SELECT ip FROM servers WHERE status = 1 AND ip = '".mysql_real_escape_string($ip)."'";
$res = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($res) === 0) {
    echo 'IP is not allowed!';
    die();
}
于 2013-04-06T10:00:30.553 に答える
0

SQL クエリで IP を確認してみませんか?

require_once("../mysql.php"); 
$ip = $_GET['ip'];
$sql = "SELECT count(*) FROM servers WHERE status = 1 AND IP = '".$ip."'";

その後、SQL ステートメントからの戻り値が「0」より大きいかどうかを確認できます。true の場合、IP アドレスはデータベース クエリに含まれます。それ以外の場合、IP はテーブルに含まれません。おそらく、SQL インジェクションを防ぐために $ip 変数をエスケープすると便利です。

于 2013-04-06T10:00:55.717 に答える