[PHP] 使用預備敘述句來來查詢MySQL資料庫

如果有寫過資料庫程式的人,或多或少都害怕因為引號的問題而產生資料庫被攻擊,這種攻擊手法我們叫做「SQL injection」,因而在許多的PHP網站及書籍中,教予大家解決的方案不外乎是用以下程式碼。

<?
$password = $_POST[password];
if(!get_magic_quotes_gpc) $password = addslashes($password);
?>

其中,password代表的是密碼。

在海芋最近寫PHP程式中,在PHP官方網站無意間發現一個函式,即「mysqli_prepare()」,至於他怎麼用,海芋用一段程式碼來說明。

<?
$query = "select id from ".$user_db." where name=? order by id DESC Limit 1";
$stmt = $db->prepare($query);
$stmt->bind_param("s", $name);
$stmt->execute();
$stmt->bind_result($id);
$stmt->fetch();
$stmt->close();
?>

其中,我們要查詢的資料變數,是以「?」來代替。接著,再以$db->prepare,將敘述句建立一個資源,以供我們後面的處理。

接著,我們再用bind_param,去將我們的變數,與「?」做結合,而「”s”」,代表的是string,另外還有i、b、d等英文字母,分別代表整數、blob、和浮點數。

而我們此時,變數和「?」算是真正的結合了,但是仍然未執行我們的 query,此時我們需要的是 execute(),讓此 query 執行。

因為我們此處用的是查詢子句,所以我們要用 bind_result(),使我們查詢的結果,和我們的變數做結合,最後再用fetch(),去取出我們的變數。

而資源用到最後,理所當然要關閉他囉,所以,最後我們只要再寫個close(),就關閉此一資源囉!

而您一定會問的是,這樣子,如果我的資料有引號,怎麼辦呢?其實這個函式已經幫你處理好了。所以,當您取出資料時,如果遇上有可能會有引號的欄位,別忘了加上stripslashes($variable)喔!

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments