您好,登錄后才能下訂單哦!
通過PDO擴展與MySQL數據庫交互如何實現增刪改查和數據庫事務?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!
關于預處理語句我們在上篇教程中已經簡單介紹過,我們可以將其與視圖模板類比,所謂預處理語句就是預定義的 SQL 語句模板,其中的具體參數值通過占位符替代:
INSERT INTO REGISTRY (name, value) VALUES (?, ?) INSERT INTO REGISTRY (name, value) VALUES (:name, :value)
然后在后續真正要執行 SQL 語句之前,再通過特定 API 方法將具體參數值與對應占位符進行綁定和映射。就好比定義的視圖模板也是將變量通過特定占位符替代,然后真正渲染時將變量值傳遞進來填充和渲染一樣。
為什么要費這番周折呢?直接用前面演示的 query
方法進行增刪改查操作它不香嗎?呃,那我們接下來來說說預處理語句的好處,或者說為什么要使用預處理語句進行數據庫交互,好處有二:
綜上,從性能和安全角度考慮,推薦使用預處理語句處理數據庫的增刪改查操作。
接下來,我們基于 PDO 提供的預處理語句 API 實現 MySQL 數據庫的增刪改查操作,我們將通過面向對象的方式來實現:
<?php class Post { public $id; public $title; public $content; public $created_at; /** * @var PDO */ protected $pdo; public function __construct(PDO $pdo = null) { if ($pdo != null) { $this->pdo = $pdo; } } public function insert($title, $content) { $sql = 'INSERT INTO `post` (title, content, created_at) VALUES (:title, :content, :created_at)'; try { // 準備預處理語句 $stmt = $this->pdo->prepare($sql); // 獲取當前時間對應的格式化字符串:2020-05-28 13:00:00 $datetime = date('Y-m-d H:i:s', time()); // 綁定參數值 $stmt->bindParam(':title', $title, PDO::PARAM_STR); $stmt->bindParam(':content', $content, PDO::PARAM_STR); $stmt->bindParam(':created_at', $datetime, PDO::PARAM_STR); // 執行語句 $stmt->execute(); return $this->pdo->lastInsertId(); // 返回插入記錄對應ID } catch (PDOException $e) { printf("數據庫插入失敗: %s\n", $e->getMessage()); } } public function select($id) { $sql = 'SELECT * FROM `post` WHERE id = ?'; try { // 準備預處理語句 $stmt = $this->pdo->prepare($sql); // 綁定參數值 $stmt->bindValue(1, $id, PDO::PARAM_INT); // 執行語句 $stmt->execute(); return $stmt->fetchObject(self::class); // 以對象方式返回結果集 } catch (PDOException $e) { printf("數據庫查詢失敗: %s\n", $e->getMessage()); } } public function selectAll() { $sql = 'SELECT * FROM `post` ORDER BY id DESC'; try { // 準備預處理語句 $stmt = $this->pdo->prepare($sql); // 執行語句 $stmt->execute(); return $stmt->fetchAll(); // 返回所有結果集 } catch (PDOException $e) { printf("數據庫查詢失敗: %s\n", $e->getMessage()); } } public function update($id) { $sql = 'UPDATE `post` SET created_at = :created_at WHERE id = :id'; try { // 準備預處理語句 $stmt = $this->pdo->prepare($sql); $datetime = date('Y-m-d H:i:s', time()); // 綁定參數值 $stmt->bindParam(':created_at', $datetime, PDO::PARAM_STR); $stmt->bindValue(':id', $id, PDO::PARAM_INT); // 執行語句 $stmt->execute(); return $stmt->rowCount(); } catch (PDOException $e) { printf("數據庫更新失敗: %s\n", $e->getMessage()); } } public function delete($id) { $sql = 'DELETE FROM `post` WHERE id = ?'; try { // 準備預處理語句 $stmt = $this->pdo->prepare($sql); // 綁定參數值 $stmt->bindValue(1, $id, PDO::PARAM_INT); // 執行語句 $stmt->execute(); return $stmt->rowCount(); } catch (PDOException $e) { printf("數據庫刪除失敗: %s\n", $e->getMessage()); } } }
我們構建了一個 Post
類,然后在構造函數中初始化 $pdo
實例(從外部傳入),然后將基于預處理語句實現的增刪改查操作分解到對應的類方法中。整體邏輯非常簡單,以 insert
為例,首先通過 PDO 對象的 prepare 方法傳入 SQL 模板構建預處理語句,該方法返回 PDOStatement 對象,接下來,就是調用該對像的 bindParam 方法綁定具體參數值,該方法的第一個參數是占位符,第二個參數是參數值,第三個參數是值類型(對應的常量可以在 PDO 預定義常量中查詢),綁定好參數后,就可以調用 PDOStatement 對象的 execute 方法執行預處理語句了。
對于插入操作,可以通過 PDO 對象上的 lastInsertId 方法返回插入記錄的主鍵 ID,對于更新和刪除方法,可以通過 PDOStatement 對象上的 rowCount 方法返回受影響行數表示是否操作成功。對于查詢操作,可以通過 PDOStatement 對象的 fetch 方法返回單條記錄,也可以通過 fetchObject 方法返回映射到指定類后的對象實例(也是單條記錄),對于多個結果,可以通過 fetchAll 方法返回。
需要注意的是,在聲明預處理語句的時候,可以通過 ?
占位符,也可以通過 :name
這種可讀性更好的占位符,然后在綁定參數時,既可以通過 bindValue 也可以通過 bindParam 方法,兩者傳遞參數一樣,只是對于 ?
占位符,需要通過數值序號建立與 SQL 模板的映射(從 1 開始)。
結合代碼和 PHP 官方文檔理解上面的代碼并不困難,接下來,我們來編寫測試代碼:
// 初始化 PDO 連接實例 $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4'; $user = 'root'; $pass = 'root'; try { $pdo = new PDO($dsn, $user, $pass); } catch (PDOException $e) { printf("數據庫連接失敗: %s\n", $e->getMessage()); } // 測試代碼 $post = new Post($pdo); // insert $title = '這是一篇測試文章以上就是通過PDO擴展與MySQL數據庫交互 實現增刪改查實現和數據庫事務的詳細內容,更多請關注億速云其它相關文章!
感謝各位的閱讀!看完上述內容,你們對通過PDO擴展與MySQL數據庫交互如何實現增刪改查和數據庫事務大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。