2 回答

TA貢獻1799條經驗 獲得超9個贊
這是 MySQLi 準備好的語句在 PHP 中的工作方式:
準備一個以空值作為占位符的 SQL 查詢(每個值都有一個問號)。通過說明每個變量及其類型,將變量綁定到占位符。執行查詢。允許的四種變量類型:
i - 整數
d - 雙
s - 字符串
b - 斑點
準備好的語句,顧名思義,是一種準備 MySQL 調用的方法,而不存儲變量。你告訴它變量最終會去那里——只是還沒有。演示它的最佳方法是通過示例。
$stmt = $mysqli->prepare("SELECT * FROM myTable WHERE name = ? AND age = ?");
$stmt->bind_param("si", $_POST['name'], $_POST['age']);
$stmt->execute();
//fetching result would go here, but will be covered later
$stmt->close();
如果您以前從未見過準備好的語句,這可能看起來有點奇怪?;旧习l生的事情是您正在為 SQL 語句的內容創建模板。在本例中,我們從 myTable 中選擇所有內容,其中 name 和 age 等于 ?。問號只是值的位置的占位符。
bind_param() 方法是您將變量附加到準備好的模板中的虛擬值的地方。注意變量前的引號中有兩個字母。這告訴數據庫變量類型。s 指定 name 將是一個字符串值,而 i 強制 age 是一個整數。這正是我沒有在名稱的問號周圍添加引號的原因,就像我通常為 SQL 調用中的字符串所做的那樣。您可能認為我只是忘記了,但事實是根本沒有必要(事實上,如果您在 ? 周圍加上引號,它實際上將不起作用,因為它將被視為字符串文字,而不是一個虛擬占位符。)。
當您調用 bind_param() 時,您已經告訴它它將是一個字符串文字,因此即使惡意用戶嘗試將 SQL 插入到您的用戶輸入中,它仍將被視為字符串。$stmt->execute() 然后實際運行代碼;最后一行只是關閉準備好的語句。我們將在 Select 部分介紹獲取結果。
- 2 回答
- 0 關注
- 172 瀏覽
添加回答
舉報