久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

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

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

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

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

      通過(guò)預(yù)處理語(yǔ)句進(jìn)行增刪改查

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

      關(guān)于預(yù)處理語(yǔ)句我們?cè)谏掀坛讨幸呀?jīng)簡(jiǎn)單介紹過(guò),我們可以將其與視圖模板類比,所謂預(yù)處理語(yǔ)句就是預(yù)定義的 SQL 語(yǔ)句模板,其中的具體參數(shù)值通過(guò)占位符替代:

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

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

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

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

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

      增刪改查示例代碼

      接下來(lái),我們基于 PDO 提供的預(yù)處理語(yǔ)句 API 實(shí)現(xiàn) MySQL 數(shù)據(jù)庫(kù)的增刪改查操作,我們將通過(guò)面向?qū)ο蟮姆绞絹?lái)實(shí)現(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 {             // 準(zhǔn)備預(yù)處理語(yǔ)句             $stmt = $this->pdo->prepare($sql);             // 獲取當(dāng)前時(shí)間對(duì)應(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í)行語(yǔ)句             $stmt->execute();             return $this->pdo->lastInsertId();  // 返回插入記錄對(duì)應(yīng)ID         } catch (PDOException $e) {             printf("數(shù)據(jù)庫(kù)插入失敗: %sn", $e->getMessage());         }     }      public function select($id)     {         $sql = 'SELECT * FROM `post` WHERE id = ?';         try {             // 準(zhǔn)備預(yù)處理語(yǔ)句             $stmt = $this->pdo->prepare($sql);             // 綁定參數(shù)值             $stmt->bindValue(1, $id, PDO::PARAM_INT);             // 執(zhí)行語(yǔ)句             $stmt->execute();             return $stmt->fetchObject(self::class);  // 以對(duì)象方式返回結(jié)果集         } catch (PDOException $e) {             printf("數(shù)據(jù)庫(kù)查詢失敗: %sn", $e->getMessage());         }     }      public function selectAll()     {         $sql = 'SELECT * FROM `post` ORDER BY id DESC';         try {             // 準(zhǔn)備預(yù)處理語(yǔ)句             $stmt = $this->pdo->prepare($sql);             // 執(zhí)行語(yǔ)句             $stmt->execute();             return $stmt->fetchAll();  // 返回所有結(jié)果集         } catch (PDOException $e) {             printf("數(shù)據(jù)庫(kù)查詢失敗: %sn", $e->getMessage());         }     }      public function update($id)     {         $sql = 'UPDATE `post` SET created_at = :created_at WHERE id = :id';         try {             // 準(zhǔn)備預(yù)處理語(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í)行語(yǔ)句             $stmt->execute();             return $stmt->rowCount();         } catch (PDOException $e) {             printf("數(shù)據(jù)庫(kù)更新失敗: %sn", $e->getMessage());         }     }      public function delete($id)     {         $sql = 'DELETE FROM `post` WHERE id = ?';         try {             // 準(zhǔn)備預(yù)處理語(yǔ)句             $stmt = $this->pdo->prepare($sql);             // 綁定參數(shù)值             $stmt->bindValue(1, $id, PDO::PARAM_INT);             // 執(zhí)行語(yǔ)句             $stmt->execute();             return $stmt->rowCount();         } catch (PDOException $e) {             printf("數(shù)據(jù)庫(kù)刪除失敗: %sn", $e->getMessage());         }     } }

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

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

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

      結(jié)合代碼和 PHP 官方文檔理解上面的代碼并不困難,接下來(lái),我們來(lái)編寫測(cè)試代碼:

      // 初始化 PDO 連接實(shí)例 $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ù)庫(kù)連接失敗: %sn", $e->getMessage()); }  // 測(cè)試代碼 $post = new Post($pdo); // insert $title = '這是一篇測(cè)試文章'; $content = '測(cè)試內(nèi)容: 今天天氣不錯(cuò)'; $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);

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

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

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

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

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

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)