2 回答

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