0

我目前正在编写一个脚本,该脚本可以只允许 ip 从查询中访问网站。但我目前的问题是我只允许查询的第一个结果通过,第二个结果不是,其余的也不是。

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

你需要一个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”。如果为真,则 IP 地址在数据库查询中。否则 ip 不包含在表中。也许转义 $ip 变量以防止 sql 注入很有用。

于 2013-04-06T10:00:55.717 回答
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

您用于检查 IP 地址的方法似乎根本没有经过优化,您正在为数据库中的所有可用 IP 创建一个 while 循环,然后检查您的字段的单个 IP。

相反,您必须使用特定的 IP 地址或 IP 地址范围过滤查询,因此 SQL 将根据该地址向您发送结果,因此您的应用程序不会使用任何操作资源

你可以这样做,

$query = mysql_query("SELECT ipAddress as Record FROM YOURTABLENAME where status=1 and IP =".$ip);

if(mysql_num_rows($query)>0)
{
  //IP found do you logic here.
}
else
{
  //IP not found do you logic here.
}

这将为您节省超过 75% 的可用资源。

希望你现在清楚了。

谢谢。

于 2013-04-06T11:10:04.223 回答