2013-07-09 32 views
0

我有一個像這樣在我的網頁鏈接:http://test.com/index.php?function=news&id=88

所以每當我把「88後,我收到以下錯誤:警告:和mysql_fetch_row()預計參數1是資源,布爾在...行588

所以我讀了關於mysql_real_escape_string(),但我得到的ID不張貼,我不知道我應該如何防止出現此錯誤。

function news() 
{ 
$query = mysql_query("SELECT * FROM news WHERE id=".$_GET['id'].""); 
while($news = mysql_fetch_row($query)) 
{ 
    ... 
} 
} 
+0

這意味着代碼中的某些內容正在使用$ _GET ['id']並直接在查詢中使用它。充其量,它可以阻止你的查詢工作。最糟糕的是,它會讓別人在你的服務器上運行自己的SQL代碼。 – andrewsi

+0

使用準備好的語句而不是試圖轉義。請參閱http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php – MrCode

+2

[偉大的逃避現實(或:你需要知道如何處理文本中的文本)](http: //kunststube.net/escapism/) – deceze

回答

1

ÿ每當mysql_fetch_row()不返回任何內容時,你都可以進行重定向。因爲沒有編號89)

喜歡的東西:

if (!$row = mysql_fetch_row($result)) { 
    header(Your error page); 
} 
+0

問題是SQL注入。他輸入了'88'作爲ID,這打破了查詢。 –

0

你的代碼假定查詢成功,不檢查。出於調試目的,在mysql_query()語句的末尾添加一個'或die(mysql_error())'行。

$query = mysql_query("SELECT * FROM news WHERE id=".$_GET['id']."") or die(mysql_query()); 

對於生產應用更強大的錯誤處理,檢查$query的價值,如果它是假的記錄錯誤。

if (false === $query) { 
    // Log error and/or notify an administrator 
} 
else { 
    while($news = mysql_fetch_row($query)) ... 

正如指出的在其他的答案,你應該確保id參數的值是一個整數,因爲查詢假定它會。您可以通過鑄造做到這一點:

(int)$_GET['id'] 

或通過更強大的類型檢查

if (!is_numeric($_GET['id'])) { 
    // Take appropriate action 
} 
else { 
    // Create and execute the query 
+0

問題是SQL注入。他輸入了'88'作爲ID,這打破了查詢。 –

+0

我已經爲該問題添加了對該錯誤的引用。我相信其餘部分是相關的,因爲這將有助於揭示未來的這種錯誤。 –

0

警告:和mysql_fetch_row()預計參數1是資源

這意味着在$結果= mysql_query(....);在mysql_fetch_row()失敗之前調用您所做的並且導致FALSE而不是資源(即查詢結果的句柄);

看看查詢,如果可能的話發佈它,這就是你的問題所在。