目錄
PHP中操作資料庫的預處理語句" >PHP中操作資料庫的預處理語句
什麼是預處理語句? " >什麼是預處理語句?
PDO 運算預處理語句" >PDO 運算預處理語句
mysqli 操作預處理語句" >mysqli 操作預處理語句
總結" >總結
首頁 後端開發 PHP問題 詳細介紹PHP中操作資料庫的預處理語句(附程式碼)

詳細介紹PHP中操作資料庫的預處理語句(附程式碼)

Jun 17, 2021 pm 05:19 PM
php

本篇文章給大家詳細介紹PHP中操作資料庫的預處理語句(附程式碼)。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

詳細介紹PHP中操作資料庫的預處理語句(附程式碼)

PHP中操作資料庫的預處理語句

今天這篇文章的內容其實也是非常基礎的內容,不過在在現代化的開發中,大家都使用框架,已經很少人會去自己封裝或經常寫底層的資料庫操作程式碼了。所以這回我們就來複習一下資料庫中相關擴充中的預處理語句內容。

什麼是預處理語句?

預處理語句,可以把它看作是想要執行的 SQL 語句的一種編譯過的模板,它可以使用變數參數來控制。預處理語句可以帶來兩大好處:

  • 查詢只需解析(或預處理)一次,但可以用相同或不同的參數執行多次。當查詢準備好後,資料庫將分析、編譯和最佳化執行該查詢的計畫。對於複雜的查詢,此過程要花費較長的時間,如果需要以不同參數多次重複相同的查詢,那麼該過程將大大降低應用程式的速度。透過使用預處理語句,可以避免重複分析/編譯/最佳化週期。簡言之,預處理語句佔用較少的資源,因而運作得更快。

  • 提供給預處理語句的參數不需要用引號括起來,驅動程式會自動處理。如果應用程式只使用預處理語句,可以確保不會發生SQL 注入。 (然而,如果查詢的其他部分是由未轉義的輸入來建構的,則仍有 SQL 注入的風險)。

上述內容是摘自官方文件的說明,但其實預處理語句帶給我們最直觀的好處就是能夠有效地預防 SQL 注入。關於 SQL 注入的內容我們將來在學習 MySQL 的時候再進行深入的學習,這裡就不過多地介紹了,反正預處理語句就是可以完成這項工作就好了。

PDO 運算預處理語句

在PHP 的擴充中,PDO 已經是主流的核心資料庫擴充庫,自然它對預處理語句的支援也是非常全面的。

$pdo = new PDO('mysql:host=localhost;port=3306;dbname=blog_test', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// :xxx 占位符
$stmt = $pdo->prepare("insert into zyblog_test_user (username, password, salt) values (:username, :password, :salt)");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->bindParam(':salt', $salt);

$username = 'one';
$password = '123123';
$salt = 'aaa';
$stmt->execute();

$username = 'two';
$password = '123123';
$salt = 'bbb';
$stmt->execute();
登入後複製

在程式碼中,我們使用 prepare() 方法定義預處理語句,這個方法會傳回一個 PDOStatement 物件。在預處理的語句內使用 :xxx 這樣的佔位符號,並在外部使用 PDOStatement 物件的 bindParam() 方法為這些佔位符綁定上變數。最後透過 execute() 來真正執行 SQL 語句。

從這段程式碼中,我們就可以看到預處理語句的兩大優勢的體現。首先是佔位符,使用佔位符之後,我們就不用在 SQL 語句中去寫單引號,單引號往往就是 SQL 注入的主要漏洞來源。 bindParam() 方法會自動轉換綁定資料的型別。當然,bindParam() 方法也可以在可選的參數中指定綁定的資料類型,這樣就能讓我們的程式碼更加安全了,大家可以查閱相關的文件。

另一個優點就是模板的能力,我們只定義了一個 PDOStatement 對象,然後透過改變資料的內容,就可以多次使用 execute() 方法去執行預處理語句。

佔位符還有另一種寫法,就是使用一個問號來作為佔位符號,在這種情況下,bindParam() 方法的鍵名就要使用數字下標了。這裡要注意的是,數字下標是從 1 開始的。

// ? 占位符
$stmt = $pdo->prepare("insert into zyblog_test_user (username, password, salt) values (?, ?, ?)");
$stmt->bindParam(1, $username);
$stmt->bindParam(2, $password);
$stmt->bindParam(3, $salt);

$username = 'three';
$password = '123123';
$salt = 'ccc';
$stmt->execute();
登入後複製

在我們的查詢中,也是可以方便地使用預處理語句的功能進行資料查詢的。在這裡,我們直接使用 execute() 來為佔位符傳遞參數。

// 查询获取数据
$stmt = $pdo->prepare("select * from zyblog_test_user where username = :username");

$stmt->execute(['username'=>'one']);

while($row = $stmt->fetch()){
    print_r($row);
}
登入後複製

mysqli 操作預處理語句

雖然說主流是PDO ,而且大部分框架中使用的也是PDO ,但我們在寫腳本,或者需要快速測試一些功能的時候,還是會使用mysqli 來快速地開發。當然,mysqli 也是支援預處理語句相關功能的。

// mysqli 预处理
$conn = new mysqli('127.0.0.1', 'root', '', 'blog_test');
$username = 'one';
$stmt = $conn->prepare("select username from zyblog_test_user where username = ?");
$stmt->bind_param("s", $username);

$stmt->execute();

echo $stmt->bind_result($unames);

var_dump($unames);

while ($stmt->fetch()) {
    printf("%s\n", $unames);
}
登入後複製

可以看出,mysqli 除了方法名稱不同之外,綁定參數的鍵名也不完全的相同,這裡我們使用的是問號佔位,在bind_param() 方法中,是使用s來表示符號位置,如果是多個參數,就要寫成sss... 這樣。

總結

預處理語句的能力在現在的框架中都已經幫我們封裝好了,其實我們並不需要太關心,就像Laravel 使用DB::select() 進行資料庫操作時,我們就可以看到預處理語句的應用。
大家可以自行查閱 vendor/laravel/framework/src/Illuminate/Database/Connection.php 中的 select() 方法。

測試程式碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E9%A2%84%E5%A4%84%E7%90%86%E8%AF%AD%E5%8F%A5.php
登入後複製

推薦學習:php影片教學

#

以上是詳細介紹PHP中操作資料庫的預處理語句(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles