W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PHP 8,PECL pdo >= 0.1.0)
PDO::prepare — 預(yù)處理要執(zhí)行的語句,并返回語句對(duì)象
public PDO::prepare(string $query, array $options = []): PDOStatement|false
為 PDOStatement::execute() 方法預(yù)處理待執(zhí)行的 SQL 語句。 語句模板可以包含零個(gè)或多個(gè)參數(shù)占位標(biāo)記,格式是命名(:name)或問號(hào)(?)的形式,當(dāng)它執(zhí)行時(shí)將用真實(shí)數(shù)據(jù)取代。 在同一個(gè)語句模板里,命名形式和問號(hào)形式不能同時(shí)使用; 只能選擇其中一種參數(shù)形式。 請用參數(shù)形式綁定用戶輸入的數(shù)據(jù),不要直接字符串拼接到查詢里。
調(diào)用 PDOStatement::execute() 時(shí),每一個(gè)值的參數(shù)占位標(biāo)記,名稱必須唯一。 除非啟用模擬(emulation)模式,同一個(gè)語句里無法使用重名的參數(shù)。
注意:參數(shù)占位符僅能字面上展示完整的數(shù)據(jù)。 不能是字面的一部分,不能是關(guān)鍵詞,不能是標(biāo)識(shí)符,不能是其他任意的范圍。 舉例說明:不能把多個(gè)值綁到單個(gè)參數(shù)里,然后在 SQL 語句里用 IN() 查詢。
如果用不同參數(shù),通過 PDO::prepare() 和 PDOStatement::execute() 多次調(diào)用同一個(gè) SQL 語句,將提升應(yīng)用的性能 —— 驅(qū)動(dòng)可以讓客戶端/服務(wù)器緩存查詢和元信息。 同時(shí),調(diào)用 PDO::prepare() 和 PDOStatement::execute() 還能阻止 SQL 注入攻擊,不需要給參數(shù)手動(dòng)加引號(hào)與轉(zhuǎn)義。
如果內(nèi)置驅(qū)動(dòng)不支持參數(shù),PDO 將模擬出參數(shù)的功能; 如果驅(qū)動(dòng)僅僅支持其中一種風(fēng)格(命名參數(shù)和問號(hào)參數(shù)兩種),也會(huì)自動(dòng)重寫到另外一種風(fēng)格。
注意: 用于模擬預(yù)準(zhǔn)備語句和 重寫命名或問號(hào)樣式參數(shù)支持非標(biāo)準(zhǔn) 單引號(hào)和雙引號(hào)的反斜杠轉(zhuǎn)義。這意味著終止 緊跟在反斜杠前面的引號(hào)不被識(shí)別為反斜杠,這 可能導(dǎo)致參數(shù)檢測錯(cuò)誤,導(dǎo)致預(yù)準(zhǔn)備語句 執(zhí)行時(shí)失敗。解決方法是不使用模擬的準(zhǔn)備 這樣的 SQL 查詢,并避免使用參數(shù)樣式重寫參數(shù) 這是驅(qū)動(dòng)程序本身支持的。
自 PHP 7.4.0 起,可以通過兩個(gè)問號(hào)來轉(zhuǎn)義問號(hào)。 這意味著 在發(fā)送查詢到數(shù)據(jù)庫時(shí)會(huì)轉(zhuǎn)換成 。 ???
query
必須是對(duì)目標(biāo)數(shù)據(jù)庫服務(wù)器有效的 SQL 語句模板。
options
數(shù)組包含一個(gè)或多個(gè) key=>value 鍵值對(duì),為返回的 PDOStatement 對(duì)象設(shè)置屬性。 常見用法是:設(shè)置 為 ,將得到可滾動(dòng)的光標(biāo)。 某些驅(qū)動(dòng)有驅(qū)動(dòng)級(jí)的選項(xiàng),在 prepare 時(shí)就設(shè)置。 PDO::ATTR_CURSOR
PDO::CURSOR_SCROLL
如果數(shù)據(jù)庫服務(wù)器已經(jīng)成功預(yù)處理語句,PDO::prepare() 返回 PDOStatement 對(duì)象。 如果數(shù)據(jù)庫服務(wù)器無法預(yù)處理語句,PDO::prepare() 返回 false 或拋出 PDOException (取決于 錯(cuò)誤處理)。
注意:模擬模式下的預(yù)處理語句不會(huì)和數(shù)據(jù)庫服務(wù)器交互,所以 PDO::prepare() 不會(huì)檢查語句。
如果屬性 PDO::ATTR_ERRMODE 設(shè)置為 PDO::ERRMODE_WARNING,則發(fā)出級(jí)別為 E_WARNING 的錯(cuò)誤。
如果屬性 PDO::ATTR_ERRMODE 設(shè)置為 PDO::ERRMODE_EXCEPTION,則拋出 PDOException。
示例 #1 命名參數(shù)形式的 SQL 語句模板
<?php
/* 傳入數(shù)組的值,并執(zhí)行已預(yù)處理的語句 */
$sql = 'SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
$sth->execute(['calories' => 150, 'colour' => 'red']);
$red = $sth->fetchAll();
/* Array keys can be prefixed with colons ":" too (optional) */
$sth->execute([':calories' => 175, ':colour' => 'yellow']);
$yellow = $sth->fetchAll();
?>
示例 #2 問號(hào)形式的 SQL 語句模板
<?php
/* 傳入數(shù)組的值,并執(zhí)行已預(yù)處理的語句 */
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute([150, 'red']);
$red = $sth->fetchAll();
$sth->execute([175, 'yellow']);
$yellow = $sth->fetchAll();
?>
示例 #3 問號(hào)轉(zhuǎn)義的 SQL 語句模板
<?php
/* note: this is only valid on PostgreSQL databases */
$sth = $dbh->prepare('SELECT * FROM issues WHERE tag::jsonb ?? ?');
$sth->execute(['feature']);
$featureIssues = $sth->fetchAll();
$sth->execute(['performance']);
$performanceIssues = $sth->fetchAll();
?>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: