我目前正在编写一个脚本,该脚本只允许查询中的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'];
在这种情况下,我做错了什么?
您必须使用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();
}
为什么不检查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。也许转义$ip变量以防止sql注入是有用的。
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循环将带来所有值。。。
您用于检查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%以上的资源。
希望你现在清楚了。
谢谢。
您需要一个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'];
}