通過PDO擴(kuò)展與MySQL數(shù)據(jù)庫交互實(shí)現(xiàn)基本使用

通過PDO擴(kuò)展與MySQL數(shù)據(jù)庫交互實(shí)現(xiàn)基本使用

相關(guān)學(xué)習(xí)推薦:mysql教程,php編程

在上篇教程中,給大家介紹了如何通過 PHP 內(nèi)置的 mysqli 擴(kuò)展與 MySQL 數(shù)據(jù)庫交互,今天我們來看看另一個(gè) PHP 內(nèi)置的數(shù)據(jù)庫擴(kuò)展 —— pdo,其全稱是 PHP Data Objects,即 PHP 數(shù)據(jù)對(duì)象

PDO 簡(jiǎn)介與安裝

PDO 為 PHP 訪問數(shù)據(jù)庫定義了一個(gè)輕量級(jí)的一致接口,因此它提供的是一個(gè)數(shù)據(jù)訪問抽象層,本身并不能實(shí)現(xiàn)任何數(shù)據(jù)庫交互功能,必須使用一個(gè)具體數(shù)據(jù)庫的 PDO 驅(qū)動(dòng)來訪問數(shù)據(jù)庫服務(wù),這些具體數(shù)據(jù)庫驅(qū)動(dòng)包括 MySQL、postgresqlsqlite、SQL Server、oracle 等,因此 PDO 是一個(gè)更加標(biāo)準(zhǔn)、更加通用的數(shù)據(jù)庫擴(kuò)展,而且完全是面向?qū)ο?/b>風(fēng)格的,目前,在各個(gè)主流 PHP 框架中,PDO 已經(jīng)成為了構(gòu)建數(shù)據(jù)庫交互的基礎(chǔ)組件,包括 laravel 框架,也是基于 PDO 擴(kuò)展提供數(shù)據(jù)庫訪問功能。

我們之前推薦的 PHP 本地集成開發(fā)環(huán)境都集成了對(duì) PDO 擴(kuò)展的支持(以下是 Laragon 預(yù)裝的 PHP 擴(kuò)展):

通過PDO擴(kuò)展與MySQL數(shù)據(jù)庫交互實(shí)現(xiàn)基本使用

并且可以看到,除了 PDO 擴(kuò)展外,還有一個(gè)與之匹配的具體數(shù)據(jù)庫擴(kuò)展 pdo_mysql,有了這個(gè)具體擴(kuò)展,才能訪問 MySQL 數(shù)據(jù)庫。另外,PDO 提供了統(tǒng)一的數(shù)據(jù)庫訪問接口,所以實(shí)現(xiàn)了 PDO 接口的具體數(shù)據(jù)庫擴(kuò)展可以通過完全一樣的方法訪問數(shù)據(jù)庫,這樣一來,如果應(yīng)用需要切換數(shù)據(jù)庫,就不需要對(duì)數(shù)據(jù)庫操作代碼進(jìn)行重構(gòu),僅憑這一點(diǎn),就可以扔掉 MySQLi 擴(kuò)展,投入 PDO 的懷抱了。

如果安裝過 Laradock,可以啟動(dòng) workspace 容器,然后查看其預(yù)裝的 PHP 擴(kuò)展,可以看到,它包含更多的具體 PDO 數(shù)據(jù)庫驅(qū)動(dòng)支持:

通過PDO擴(kuò)展與MySQL數(shù)據(jù)庫交互實(shí)現(xiàn)基本使用

其中 pdo_pgsql 表示 PostgresSQL 數(shù)據(jù)庫驅(qū)動(dòng),pdo_sqlite 表示 SQLite 數(shù)據(jù)庫驅(qū)動(dòng)。

建立數(shù)據(jù)庫連接與基本查詢

在我們的教程中,還是選擇以 MySQL 為例進(jìn)行演示。

要通過 PDO 擴(kuò)展建立數(shù)據(jù)庫連接,直接實(shí)例化 PDO 對(duì)象即可,我們編寫一段簡(jiǎn)單的示例代碼如下(在 php_learning/mysql 目錄下新建 pdo.php 存儲(chǔ)代碼):

<?php // 設(shè)置連接屬性 $dsn = &#39;mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4&#39;; $user = &#39;root&#39;; $pass = &#39;root&#39;;  try {     // 建立連接     $pdo = new PDO($dsn, $user, $pass);     // 執(zhí)行 SQL 查詢     $sql = $pdo->quote('SELECT?*?FROM?`post`?ORDER?BY?`id`?DESC'); ????$res?=?$pdo-&gt;query($sql); ????//?打印查詢結(jié)果 ????echo?'<pre class="brush:php;toolbar:false">';     foreach ($res as $row) {         print_r($row);     } } catch (PDOException $exception) {     // 如果數(shù)據(jù)庫操作出現(xiàn)異常,則捕獲并打印     printf("Error: %sn", $exception->getMessage()); } finally {     // 釋放 PDO 連接實(shí)例     $pdo = null; }

在實(shí)例化 PDO 對(duì)象創(chuàng)建數(shù)據(jù)庫連接時(shí),至少需要傳入三個(gè)字符串類型參數(shù),第一個(gè)參數(shù)包含了數(shù)據(jù)庫主機(jī)信息,比如數(shù)據(jù)庫驅(qū)動(dòng)類型(這里是 mysql)、IP地址(本地地址是 127.0.0.1)、端口號(hào)(可選,默認(rèn)是 3306)、要連接的數(shù)據(jù)庫名稱(test)、字符編碼信息(utf8mb4)等,第二個(gè)參數(shù)是用戶名,第三個(gè)參數(shù)是密碼。

接下來,我們就可以調(diào)用 PDO 對(duì)象實(shí)例 $pdo 上的 query 方法執(zhí)行指定 SQL 語句與數(shù)據(jù)庫進(jìn)行交互了(增刪改查),不過在此之前,我們先調(diào)用了 quote 方法對(duì)查詢 SQL 語句進(jìn)行轉(zhuǎn)義,該函數(shù)的功能類似 mysqli_escape_string。

執(zhí)行完 SQL 查詢后,會(huì)返回一個(gè)查詢結(jié)果集,可以通過循環(huán)遍歷打印該結(jié)果。

此外,通過 PDO 擴(kuò)展進(jìn)行數(shù)據(jù)庫連接和查詢操作如果出現(xiàn)錯(cuò)誤,會(huì)拋出異常,為了增加程序的健壯性,我們?cè)谕ㄟ^ try…catch… 語句捕獲 PDOException 異常,并打印錯(cuò)誤信息,最后通過 finally 語句釋放 PDO 對(duì)象實(shí)例,因?yàn)樵撜Z句塊不管是否拋出異常都會(huì)執(zhí)行。

運(yùn)行 php -S localhost:9000 啟動(dòng)內(nèi)置 http 服務(wù)器進(jìn)行測(cè)試,在瀏覽器中訪問 http://localhost:9000/mysql/pdo.php,即可看到正常的打印結(jié)果:

通過PDO擴(kuò)展與MySQL數(shù)據(jù)庫交互實(shí)現(xiàn)基本使用

我們修改下上述代碼中的連接信息,比如將密碼值調(diào)整為 test,這個(gè)時(shí)候就會(huì)捕獲到 PDO 異常,并打印錯(cuò)誤消息:

通過PDO擴(kuò)展與MySQL數(shù)據(jù)庫交互實(shí)現(xiàn)基本使用

注:錯(cuò)誤信息中的 IP 地址是 MySQL docker 容器內(nèi)部的 IP 地址。可以忽略,這個(gè)報(bào)錯(cuò)是密碼錯(cuò)誤,而不是 IP 地址的問題。

想了解更多相關(guān)文章,敬請(qǐng)關(guān)注php mysql欄目!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊12 分享