我目前正在制作一个脚本,该脚本可以允许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'];
在这种情况下我做错了什么?
答案 0 :(得分: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'];
}
答案 1 :(得分: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();
}
答案 2 :(得分: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不包括在表中。也许它有助于逃避$ ip变量以防止sql注入。
答案 3 :(得分: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循环将带来所有价值......
答案 4 :(得分: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%的资源。
希望你现在清楚。
感谢。