gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

通過PDO擴展與MySQL數(shù)據(jù)庫交互 實現(xiàn)增刪改查實現(xiàn)和數(shù)據(jù)庫事務(wù)

通過PDO擴展與MySQL數(shù)據(jù)庫交互 實現(xiàn)增刪改查實現(xiàn)和數(shù)據(jù)庫事務(wù)

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

通過預(yù)處理語句進行增刪改查

為什么使用預(yù)處理語句

關(guān)于預(yù)處理語句我們在上篇教程中已經(jīng)簡單介紹過,我們可以將其與視圖模板類比,所謂預(yù)處理語句就是預(yù)定義的 SQL 語句模板,其中的具體參數(shù)值通過占位符替代:

INSERT INTO REGISTRY (name, value) VALUES (?, ?) INSERT INTO REGISTRY (name, value) VALUES (:name, :value)

然后在后續(xù)真正要執(zhí)行 SQL 語句之前,再通過特定 API 方法將具體參數(shù)值與對應(yīng)占位符進行綁定和映射。就好比定義的視圖模板也是將變量通過特定占位符替代,然后真正渲染時將變量值傳遞進來填充和渲染一樣。

為什么要費這番周折呢?直接用前面演示的 query 方法進行增刪改查操作它不香嗎?呃,那我們接下來來說說預(yù)處理語句的好處,或者說為什么要使用預(yù)處理語句進行數(shù)據(jù)庫交互,好處有二:

  • 首先,使用預(yù)處理語句提前定義的 SQL 模板只會解析一次,但可以通過傳遞不同的參數(shù)值執(zhí)行多次,從而避免模板相同的 SQL 語句重復(fù)分析、編譯和優(yōu)化,提高數(shù)據(jù)庫操作執(zhí)行速度;
  • 其次,后期傳遞給預(yù)處理語句的參數(shù)值會被底層驅(qū)動進行處理,從而有效避免 SQL 注入攻擊。

綜上,從性能和安全角度考慮,推薦使用預(yù)處理語句處理數(shù)據(jù)庫的增刪改查操作。

增刪改查示例代碼

接下來,我們基于 PDO 提供的預(yù)處理語句 API 實現(xiàn) MySQL 數(shù)據(jù)庫的增刪改查操作,我們將通過面向?qū)ο蟮姆绞絹韺崿F(xiàn):

<?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 {             // 準備預(yù)處理語句             $stmt = $this->pdo->prepare($sql);             // 獲取當(dāng)前時間對應(yīng)的格式化字符串:2020-05-28 13:00:00             $datetime = date('Y-m-d H:i:s', time());             // 綁定參數(shù)值             $stmt->bindParam(':title', $title, PDO::PARAM_STR);             $stmt->bindParam(':content', $content, PDO::PARAM_STR);             $stmt->bindParam(':created_at', $datetime, PDO::PARAM_STR);             // 執(zhí)行語句             $stmt->execute();             return $this->pdo->lastInsertId();  // 返回插入記錄對應(yīng)ID         } catch (PDOException $e) {             printf("數(shù)據(jù)庫插入失敗: %sn", $e->getMessage());         }     }      public function select($id)     {         $sql = 'SELECT * FROM `post` WHERE id = ?';         try {             // 準備預(yù)處理語句             $stmt = $this->pdo->prepare($sql);             // 綁定參數(shù)值             $stmt->bindValue(1, $id, PDO::PARAM_INT);             // 執(zhí)行語句             $stmt->execute();             return $stmt->fetchObject(self::class);  // 以對象方式返回結(jié)果集         } catch (PDOException $e) {             printf("數(shù)據(jù)庫查詢失敗: %sn", $e->getMessage());         }     }      public function selectAll()     {         $sql = 'SELECT * FROM `post` ORDER BY id DESC';         try {             // 準備預(yù)處理語句             $stmt = $this->pdo->prepare($sql);             // 執(zhí)行語句             $stmt->execute();             return $stmt->fetchAll();  // 返回所有結(jié)果集         } catch (PDOException $e) {             printf("數(shù)據(jù)庫查詢失敗: %sn", $e->getMessage());         }     }      public function update($id)     {         $sql = 'UPDATE `post` SET created_at = :created_at WHERE id = :id';         try {             // 準備預(yù)處理語句             $stmt = $this->pdo->prepare($sql);             $datetime = date('Y-m-d H:i:s', time());             // 綁定參數(shù)值             $stmt->bindParam(':created_at', $datetime, PDO::PARAM_STR);             $stmt->bindValue(':id', $id, PDO::PARAM_INT);             // 執(zhí)行語句             $stmt->execute();             return $stmt->rowCount();         } catch (PDOException $e) {             printf("數(shù)據(jù)庫更新失敗: %sn", $e->getMessage());         }     }      public function delete($id)     {         $sql = 'DELETE FROM `post` WHERE id = ?';         try {             // 準備預(yù)處理語句             $stmt = $this->pdo->prepare($sql);             // 綁定參數(shù)值             $stmt->bindValue(1, $id, PDO::PARAM_INT);             // 執(zhí)行語句             $stmt->execute();             return $stmt->rowCount();         } catch (PDOException $e) {             printf("數(shù)據(jù)庫刪除失敗: %sn", $e->getMessage());         }     } }

我們構(gòu)建了一個 Post 類,然后在構(gòu)造函數(shù)中初始化 $pdo 實例(從外部傳入),然后將基于預(yù)處理語句實現(xiàn)的增刪改查操作分解到對應(yīng)的類方法中。整體邏輯非常簡單,以 insert 為例,首先通過 PDO 對象的 prepare 方法傳入 SQL 模板構(gòu)建預(yù)處理語句,該方法返回 PDOStatement 對象,接下來,就是調(diào)用該對像的 bindParam 方法綁定具體參數(shù)值,該方法的第一個參數(shù)是占位符,第二個參數(shù)是參數(shù)值,第三個參數(shù)是值類型(對應(yīng)的常量可以在 PDO 預(yù)定義常量中查詢),綁定好參數(shù)后,就可以調(diào)用 PDOStatement 對象的 execute 方法執(zhí)行預(yù)處理語句了。

對于插入操作,可以通過 PDO 對象上的 lastInsertId 方法返回插入記錄的主鍵 ID,對于更新和刪除方法,可以通過 PDOStatement 對象上的 rowCount 方法返回受影響行數(shù)表示是否操作成功。對于查詢操作,可以通過 PDOStatement 對象的 fetch 方法返回單條記錄,也可以通過 fetchObject 方法返回映射到指定類后的對象實例(也是單條記錄),對于多個結(jié)果,可以通過 fetchAll 方法返回。

需要注意的是,在聲明預(yù)處理語句的時候,可以通過 ? 占位符,也可以通過 :name 這種可讀性更好的占位符,然后在綁定參數(shù)時,既可以通過 bindValue 也可以通過 bindParam 方法,兩者傳遞參數(shù)一樣,只是對于 ? 占位符,需要通過數(shù)值序號建立與 SQL 模板的映射(從 1 開始)。

結(jié)合代碼和 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("數(shù)據(jù)庫連接失敗: %sn", $e->getMessage()); }  // 測試代碼 $post = new Post($pdo); // insert $title = '這是一篇測試文章'; $content = '測試內(nèi)容: 今天天氣不錯'; $id = $post->insert($title, $content); echo '文章插入成功: ' . $id . '<br>'; // select $item = $post->select($id); echo '<pre>'; print_r($item); // update $affected = $post->update($id); echo '受影響的行數(shù): ' . $affected . '<br>'; // delete $affected = $post->delete($id); echo '受影響的行數(shù): ' . $affected . '<br>'; // selectAll $items = $post->selectAll(); print_r($items);

初始化一個 PDO 對象實例傳入 Post 構(gòu)造函數(shù),然后依次調(diào)用 Post 對象的增刪改查方法。在瀏覽器中訪問,打印結(jié)果如下:

通過PDO擴展與MySQL數(shù)據(jù)庫交互 實現(xiàn)增刪改查實現(xiàn)和數(shù)據(jù)庫事務(wù)

我們可以看到 fetchAll 方法默認返回的結(jié)果集數(shù)組中既包含索引映射,又包含字段名映射,這可以通過設(shè)置獲取模式來解決,比如要返回 Post 對象數(shù)組,可以這么做:

return $stmt->fetchAll(PDO::FETCH_CLASS, self::class);

這樣,返回的結(jié)果就是這樣的了:

通過PDO擴展與MySQL數(shù)據(jù)庫交互 實現(xiàn)增刪改查實現(xiàn)和數(shù)據(jù)庫事務(wù)

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美日韩在线不卡视频| 久久网站免费视频| 凹凸日日摸日日碰夜夜爽1| 欧美日韩一区二区三区电影| 日韩一级片播放| 奇米影音第四色| 亚洲美女性囗交| 999久久久精品视频| 中文国产在线观看| 亚洲高清av一区二区三区| 欧美国产在线一区| 蜜臀av色欲a片无码精品一区| 国产一区二区三区乱码| 欧美视频在线观看网站| 久久久免费视频网站| 色哟哟精品视频| www.亚洲一区二区| 国产人妻777人伦精品hd| 国产a视频免费观看| 免费一区二区三区在线观看 | 国产又大又黄又粗又爽| 国产a级一级片| 日本999视频| 成人日韩在线视频| 国产在线无码精品| 超碰97人人射妻| 日本激情视频在线| 国内精品国产三级国产99| 男人的天堂狠狠干| 91小视频在线播放| 欧美视频第一区| 亚洲综合激情五月| 一本久道中文无码字幕av| japanese在线视频| 又色又爽又高潮免费视频国产| 在线播放 亚洲| 韩国中文字幕av| 青青青在线视频播放| 手机在线视频一区| 中文字幕乱码人妻综合二区三区| 欧美日韩一级在线 | 国产性xxxx18免费观看视频| 操人视频免费看| 日本老熟妇毛茸茸| www国产精品内射老熟女| 91精品999| 高清一区二区视频| 欧美牲交a欧美牲交aⅴ免费下载| 国产一级片中文字幕| 北条麻妃av高潮尖叫在线观看| 日韩精品综合在线| 91精品国产吴梦梦| 国产精品美女在线播放| 中文字幕第38页| 国产又粗又长又大的视频| 和岳每晚弄的高潮嗷嗷叫视频| 亚洲精品第三页| 亚洲天堂2018av| 91香蕉视频导航| 免费在线观看的毛片| 加勒比成人在线| www污在线观看| 精品人妻人人做人人爽| 久久久天堂国产精品| 亚洲欧美日韩一级| 欧美一级特黄a| www.精品在线| 9999在线观看| 人妻互换免费中文字幕| 国产一级不卡视频| 日韩a∨精品日韩在线观看| 精品少妇人欧美激情在线观看| 国产在线观看欧美| 欧美视频在线第一页| 亚洲熟妇国产熟妇肥婆| 欧美在线一区视频| 日韩精品一区二区三区久久| 黄色影院一级片| 亚洲精品自拍网| 小说区视频区图片区| 妞干网这里只有精品| 日韩人妻无码精品久久久不卡| 97国产精东麻豆人妻电影| 亚洲精品高清无码视频| 久久国产精品国产精品| 国产又粗又猛大又黄又爽| 丁香六月激情婷婷| 超碰网在线观看| 日日噜噜噜夜夜爽爽| 国产91美女视频| 欧洲美女亚洲激情| 免费高清在线观看免费| 欧美日韩在线免费观看视频| 99中文字幕在线| 超碰在线超碰在线| 欧美精品自拍视频| 色婷婷一区二区三区av免费看| 国产一区二区三区播放| 午夜精品久久久内射近拍高清 | 2019日韩中文字幕mv| 亚洲成色www.777999| 路边理发店露脸熟妇泻火| 能在线观看的av| 国产女教师bbwbbwbbw| 国产xxxxx视频| 国产高清精品软男同| 婷婷六月天在线| 99re在线视频免费观看| 亚洲成人动漫在线| www.com黄色片| 色综合av综合无码综合网站| 日韩一区二区高清视频| 亚洲免费成人在线视频| www国产黄色| 欧美 日本 亚洲| 激情成人开心网| 九九九九九九九九| 不卡的av中文字幕| 九色porny91| 凹凸日日摸日日碰夜夜爽1| 精品欧美一区免费观看α√| 97超碰免费观看| 最近中文字幕免费mv| 亚洲综合123| 特级西西444www| 国产999免费视频| 日韩欧美中文视频| 黄黄视频在线观看| 自拍偷拍视频在线| 国产性生活免费视频| 美国av在线播放| 国产精品久久国产| 黄色成人在线看| 免费成人午夜视频| 日本三级免费网站| 欧美 日韩 国产 激情| 国产精品免费入口| 情侣黄网站免费看| 污版视频在线观看| 午夜大片在线观看| 伊人久久在线观看| 久久久久久久久久网| 国产中文字幕在线免费观看| 九色在线视频观看| 国产成人黄色网址| 99热都是精品| 国产亚洲精品久久久久久久| 黄色一级在线视频| 人人爽人人av| 国产日本欧美在线| 日韩av中文字幕第一页| 久草福利视频在线| 三级在线免费观看| 日韩av黄色网址| 日韩欧美中文视频| 男人操女人逼免费视频| www亚洲成人| 成年人午夜视频在线观看| 一区二区成人网| 男人天堂a在线| 亚洲激情在线观看视频| 久久久久久久香蕉| 亚洲va在线va天堂va偷拍| 国产成人艳妇aa视频在线 | 国产成年人在线观看| 97在线国产视频| 中文字幕在线观看日| 欧美日韩成人免费视频| 五月花丁香婷婷| 久久精品国产精品亚洲色婷婷| 中文字幕55页| 在线观看的毛片| 精品99在线视频| 女人被男人躁得好爽免费视频| 污色网站在线观看| 日日碰狠狠躁久久躁婷婷| 欧美日韩dvd| 992kp免费看片| 人妻丰满熟妇av无码区app| 91免费黄视频| 国产激情片在线观看| 激情图片中文字幕| 青青草原国产在线视频| 男女曰b免费视频| 久久这里只有精品23| 日本三级中文字幕在线观看| 我看黄色一级片| 91极品视频在线观看| 99福利在线观看| 日本精品久久久久中文字幕| 无码粉嫩虎白一线天在线观看| 日本三日本三级少妇三级66| 久国产精品视频| www.欧美激情.com| eeuss中文| 成人在线国产视频| 人妻av中文系列| aa在线免费观看| 亚洲 欧美 日韩系列| www.这里只有精品|