2012-07-11 77 views
0

我的頁面上有一個查詢,它使用一個GET變量從我的表格中提取數據...PHP查詢失敗,顯示錯誤?

如果我回顯我的GET var數據是否存在,那麼我的查詢就會出錯,而不是或者死我可以在瀏覽器中顯示錯誤嗎?

// Get USER ID of person 
$userID = $_GET['userID']; 

// Get persons 
$sql = 'SELECT * FROM persons WHERE id = $userID'; 
$q = $conn->query($sql) or die('failed!'); 
+1

將引號改爲雙引號:'$ sql =「SELECT * FROM persons where id = $ userID」;'。此外,您的代碼易受SQL注入攻擊。 – Aziz 2012-07-11 20:27:59

+1

如果您必須構建您的查詢,請使用雙引號....否則$ userID不會轉換爲查詢中的值...然後開始學習MySQLi並準備好語句 – 2012-07-11 20:28:17

+0

Ahh哇,謝謝。 @Aziz,我不允許任何東西插入我的數據庫,所以這仍然是脆弱的? – Liam 2012-07-11 20:29:20

回答

4
$sql = "SELECT * FROM persons WHERE id = $userID"; 

您必須使用雙引號來使用查詢字符串中的變量。

你也可以這樣做:

$sql = "SELECT * FROM persons WHERE id = ".$userID; 

你應該做的是這樣的(保護自己免受sql injection):

$safeuid = $conn->prepare($userID); 
$sql = "SELECT * FROM persons WHERE id = ".$safeuid; 

你總是可以調試使用這個在你的PHP的頂部頁:

ini_set('display_errors',1); 
error_reporting(E_ALL); 
+0

'$ userID'不應該是一個字符串,所以轉義它不是正確的方式來過濾它。 – Hamish 2012-07-11 20:33:08

+0

這是一個$ _GET變量..它可能是任何東西。這是轉義字符串的整點 – maxhud 2012-07-11 20:35:15

+0

如果提供非數字字符串,查詢將失敗。轉義它不會有幫助,'$ userID'需要被轉換爲(可能是)整數。整數不需要轉義。所以正確的驗證是檢查它是一個整數,如果不是,返回一個錯誤。 – Hamish 2012-07-11 20:39:02

1

是的,你可以,但你應該只做調試。通過有目的地提供錯誤的輸入和讀取錯誤,餅乾可以獲得很多洞察力。

我假設你正在使用的MySQLi;該命令是$conn->error()。所以,你行應爲:

$q = $conn->query($sql) or die($conn->error()); 

而且,你在做什麼錯的是你使用單引號來定義$sql。您需要使用雙引號將$userID寫入字符串。所以,你想要的是:

$sql = "SELECT * FROM persons WHERE id = $userID"; 

$sql = 'SELECT * FROM persons WHERE id = ' . $userID; 
2

你試過$q = $conn->query($sql) or die($conn->error());

1

您需要使用雙引號來評估字符串中的變量。也就是說,

$sql = 'SELECT * FROM persons WHERE id = $userID'; 

應該

$sql = "SELECT * FROM persons WHERE id = $userID"; 

而不是刪除了die你應該確保查詢始終是有效的。換句話說:驗證userID參數。 $_GET可以包含任何用戶想要提供 - 它可能是一個數組,它可能是一個字符串,它可能是一個惡意負載,可以drop your tables的字符串。所以檢查它是一個整數。如果不是,則將相關消息返回給用戶。

1

不是PHP的專家,但你可以試試:

// Get USER ID of person 
$userID = $_GET['userID']; 

// Get persons 
$sql = 'SELECT * FROM persons WHERE id = $userID'; 
$q = $conn->query($sql) or die('failed!' . mysql_error()); 

的錯誤應追加到您的die消息的結尾。