2013-07-23 31 views
2

這段代碼不適合我。我的list.php顯示了所有的成員。如果我點擊編輯一行,我得到了我的update.php,它顯示'update.php?id =#並且我有一小段代碼來顯示總是正確的數字。但我無法顯示個人信息。 這裏是我選擇哪裏id沒有檢索記錄,什麼都沒有顯示

<? 
    $id = $_GET['id']; 
    echo "<print>" .$id."</print>"; 
    mysql_query("SET NAMES utf8"); 
    mysql_query("SET CHARACTER_SET utf8"); 
    header('Content-type: text/html;charset=utf-8'); 
    $order = 'SELECT * FROM `person` WHERE `PersonID` = $id'; 
    $result = mysql_query($order); 
?> 

應該顯示我的表中的人員信息,因爲它在我的list.php的劑量,但沒有顯示出來?例如,如果我替換'PersonID' = 1234,則會獲得一些信息。爲什麼代碼不使用$id並將其放在'PersonID' = .之後?

+4

PHP的MySQL庫已被棄用,所以您應該真正學習如何將MySQLi或PDO與預準備語句一起使用 –

+1

您的(生成的)腳本可能容易受到SQL注入的攻擊。你應該[做一些反對它](http://stackoverflow.com/q/60174/53114)。 – Gumbo

+0

您可以從查詢中刪除反引號...您沒有使用任何保留字 – Barranka

回答

2

單引號的strings內的變量不會被內插。使用雙引號或字符串連接:

$id = mysql_real_escape_string($id); 
$order = "SELECT * FROM `person` WHERE `PersonID` = $id"; 

或者:

$order = 'SELECT * FROM `person` WHERE `PersonID` = ' . mysql_real_escape_string($id); 

然而,正如許多人所說,這個查詢很容易受到SQL注入。由於變量是用戶輸入值,幾乎所有使用字符串插值或字符串連接的查詢都傾向於SQL注入。一個參數化查詢應該是這樣的:

$order = 'SELECT * FROM `person` WHERE `PersonID` = ?'; 

選擇,如果你使用的PDO,該參數可以被命名,就像這樣:

$order = 'SELECT * FROM `person` WHERE `PersonID` = :id;'; 

,那麼你會在參數綁定到與查詢適當的方法並執行它。使用PDO,它會是這樣的(當然你得有在此之前的代碼來創建爲$db數據庫連接):

$statement = $db->prepare($order); 
$statement->bindValue(':id', $id, PDO::PARAM_INT); 
$statement->execute(); 

這僅僅是一個開始,使用參數化查詢。 Read more about PDO in the PHP manual.

+0

**否**。爲什麼每個人都堅持要切換到串聯?它完全忽略了大量的SQL注入問題。 – tadman

+0

我加入了關於使用參數化查詢和PDO的答案。 –

+1

如果您只是在'$ id'周圍添加轉義呼叫,則可以使原始示例正確工作。不過,很好的PDO例子。對不起,但你不能把那裏作爲一個「固定」版本的代碼。 – tadman

-1

嘗試

$order = "SELECT * FROM `person` WHERE `PersonID` = '$id'"; 

不得不這樣做是在我自己的項目,沒有別的工作,只要把「」在你的ID,讓你的PHP字符串開始,以「

+0

如果'PersonID'是一個整數,則不需要在該值附近加引號。 –

+0

'$ id'不應該在查詢中排在第一位。 – tadman

7

你結束將$ _GET ['id']的內容直接傳遞到數據庫 - 如果某個人傳遞了一個變量1'?最好是這將打破查詢;最壞的情況是,某人可以對數據庫執行令人討厭的事情。 ,你需要清理你的數據。

mysql_real_escape_stringwill let you escape a string so you can do this; if PersonID`是一個int,你也可以使用intval來獲取字符串的整數值,並停止以這種方式傳遞無效字符。

您看到的實際問題是因爲PHP將帶有單引號的字符串視爲字符串文字;它不會分析它是否存在需要更換的變量。它將$id視爲一個字符串。做你想做什麼,你需要使用雙引號:

$id = intval($_GET['id']); 
$order = "SELECT * FROM `person` WHERE `PersonID` = $id"; 

你也應該看看從mysql_移開*功能,因爲它們被廢棄。 爲了避免這種情況,請考慮轉移到mysqli_ *或PDO。這兩種方法都可以幫助您編寫更安全的代碼,方法是使用準備好的語句和綁定變量。

+0

如果沒有'mysql_real_escape_string',這段代碼就是破壞性的職業。 – tadman

+0

或者他可以停止使用mysql_,因爲答案的後半部分指出。 – andrewsi

+1

WOW ....確定這是非常有用的信息...並按照建議工作。我明白爲什麼這可能是一個安全問題。如果只有一個人訪問此頁面,這仍然是一個大問題?關於$ _GET ['id']和使用mysqli_ *或PDO這對我來說是新的。你能否建議我可以從哪裏瞭解到這一點? – Bobby