2013-04-06 153 views
0

我目前正在研究一個腳本,它只允許ip查詢進入網站。但我目前的問題是,我只允許查詢的第一個結果通過,第二個結果其餘都不是。多個結果與if if else語句的查詢結果

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

你必須使用一個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(); 
} 
+0

這對我而言已經解決了! – 2013-04-06 10:27:30

+0

@PatrickKnobbout:這將工作,但它不會優化你的代碼,檢查我的答案將有資源優化結果 – 2013-04-06 11:12:15

+0

@YuvrajJain我沒有看到我的第二種可能性和你的答案之間的任何區別? – bwoebi 2013-04-06 11:14:44

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']; 
} 
+0

這不起作用。您已經死於循環的第一個錯誤條目... – bwoebi 2013-04-06 10:06:48

+0

@bwoebi編輯! – auicsc 2013-04-06 19:45:37

+0

我們多久看一次字符串「IP不允許!」 ?^^ – bwoebi 2013-04-06 19:47:45

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注入。

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循環將所有值...

0

您正在使用的檢查IP地址的方法並不似乎是在所有優化,你是一個while循環對所有的avaialble來自數據庫的IP,然後檢查您的字段的單個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級%以上的資源使用。

希望你現在清楚。

謝謝。