日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【转】mysql,mysqli,PDO三种方式连接数据库

發布時間:2025/7/25 数据库 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】mysql,mysqli,PDO三种方式连接数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【另外一個參考網址:?http://www.cnblogs.com/DeanChopper/p/4646081.html?】
【另外一個參考網址: http://www.jb51.net/article/28103.htm?】轉載自:http://justcoding.iteye.com/blog/2006490

PHP中MySQL、MySQLi和PDO的用法和區別

博客分類: Php / Pear / Mysql / Node.js

MySQL 是 PHP 操作 MySQL 數據庫最原始的 Extension。MySQLi 的 i 代表 Improvement ,提供了相對進階的功能,就 Extension 而言,本身也增加了安全性。而 PDO(PHP Data Object)則是提供了一個 Abstraction Layer 來操作數據庫,光從理論上看不出來有什么差別,所以就直接看代碼吧。

?

首先,先來看一段用 MySQL 編寫的代碼:

Php代碼 ?
  • <?php??
  • mysql_connect($db_host,?$db_user,?$db_password);??
  • mysql_select_db($dn_name);??
  • $result?=?mysql_query("SELECT?`name`?FROM?`users`?WHERE?`location`?=?'$location'");??
  • while?($row?=?mysql_fetch_array($result,?MYSQL_ASSOC))??
  • {??
  • ????echo?$row['name'];??
  • }??
  • mysql_free_result($result);??
  • ?>??
  • ?

    乍看之下沒有什么問題,其實背后還是有些學問的。

    這種方式不能 Bind Column,$location 的地方容易被 SQL 注入。于是后來發展出了 mysql_escape_string()(備注:5.3.0 之后棄用)以及 mysql_real_escape_string() 來解決這個問題,不過這么一搞,整個過程會變得復雜丑陋,而且如果參數多了,可以想象會是怎樣的情形……

    Php代碼 ?
  • <?php??
  • $query?=?sprintf("SELECT?*?FROM?users?WHERE?user='%s'?AND?password='%s'",??
  • mysql_real_escape_string($user),??
  • mysql_real_escape_string($password));??
  • mysql_query($query);??
  • ?>??
  • ?

    在 MySQLi 中有了不少進步,除了通過 Bind Column 來解決上述問題,我們可以對比一下 Object oriented style(下面這段 MySQLi 范例的寫法)和 Procedural style(上面 MySQL 范例的寫法)兩種寫法的差別。

    Php代碼 ?
  • <?php??
  • $mysqli?=?new?mysqli($db_host,?$db_user,?$db_password,?$db_name);??
  • $sql?=?"INSERT?INTO?`users`?(id,?name,?gender,?location)?VALUES?(?,??,??,??)";??
  • $stmt?=?$mysqli->prepare($sql);??
  • $stmt->bind_param('dsss',?$source_id,?$source_name,?$source_gender,?$source_location);??
  • $stmt->execute();??
  • $stmt->bind_result($id,?$name,?$gender,?$location);??
  • while?($stmt->fetch())??
  • {??
  • ????echo?$id?.?$name?.?$gender?.?$location;??
  • }??
  • $stmt->close();??
  • $mysqli->close();??
  • ?>??
  • ?

    又發現了一些缺點,例如得 Bind Result,這個就有點多余,不過這其實無關緊要,因為最大的問題還是在于這不是一個抽象(Abstraction)的方法,所以當后端更換數據庫的時候,就是痛苦的開始了。

    于是 PDO 就出現了(備注:目前 Ubuntu 和 Debian 來說,PDO 并沒有直接的套件可以安裝,而是必須通過 PECL 安裝)。

    Php代碼 ?
  • roga@carlisten-lx:~$?pecl?search?pdo??
  • ??
  • =======================================??
  • Package?Stable/(Latest)?Local??
  • PDO?1.0.3?(stable)?PHP?Data?Objects?Interface.??
  • PDO_4D?0.3?(beta)?PDO?driver?for?4D-SQL?database??
  • PDO_DBLIB?1.0?(stable)?FreeTDS/Sybase/MSSQL?driver?for?PDO??
  • PDO_FIREBIRD?0.2?(beta)?Firebird/InterBase?6?driver?for?PDO??
  • PDO_IBM?1.3.2?(stable)?PDO?driver?for?IBM?databases??
  • PDO_INFORMIX?1.2.6?(stable)?PDO?driver?for?IBM?Informix?INFORMIX?databases??
  • PDO_MYSQL?1.0.2?(stable)?MySQL?driver?for?PDO??
  • PDO_OCI?1.0?(stable)?Oracle?Call?Interface?driver?for?PDO??
  • PDO_ODBC?1.0.1?(stable)?ODBC?v3?Interface?driver?for?PDO??
  • PDO_PGSQL?1.0.2?(stable)?PostgreSQL?driver?for?PDO??
  • PDO_SQLITE?1.0.1?(stable)?SQLite?v3?Interface?driver?for?PDO??
  • pdo_user?0.3.0?(beta)?Userspace?driver?for?PDO??
  • ?

    當通過 PECL 安裝裝好后,就可以通過以下方式來操作數據庫:

    Php代碼 ?
  • <?php??
  • $dsn?=?"mysql:host=$db_host;dbname=$db_name";??
  • $dbh?=?new?PDO($dsn,?$db_user,?$db_password);??
  • $sql?=?"SELECT?`name`,?`location`?FROM?`users`?WHERE?`location`?=???,?`name`?=??";??
  • $sth?=?$dbh->prepare($sql);??
  • $sth->execute(array($location,?$name));??
  • $result?=?$sth->fetch(PDO::FETCH_OBJ);??
  • echo?$result->name?.?$result->location;??
  • $dbh?=?NULL;?//by?www.jbxue.com??
  • ?>??
  • ?

    乍看之下,PDO 的代碼好像也沒有變短,那到底好處是什么呢?

    1、PDO 連接數據庫時通過 Connection String 來決定連接何種數據庫。

    2、PDO 可以通過 PDO::setAttribute 來決定連接時的設定,比如 Persistent Connection,回傳錯誤的方式(Exception,E_WARNING,NULL)。甚至是回傳參數名稱的大小寫等等。

    3、PDO 支持 Bind Column 的功能,除了基本的 Prepare,Execute 以外,也可以 Bind 單一參數,并且指定參數類型。

    4.、PDO 是 Abstraction Layer,所以就算更換儲存媒介,需要花的功夫比起來是最少的。

    可惜的是,盡管這些東西都已經出現很久了,但還是不夠大眾化。我想或許是因為大家習慣看坊間的書籍學習,但那些書本往往只會介紹最簡單最傳統的方式,導致很多人還是在用 MySQL 這種方直接連數據庫。

    不過,目前來說我個人還是最喜愛通過 DBI 來連接數據庫,像是 ActiveRecord 以及 Propel ORM(Object-Relational Mapping)。

    例如說以 ActiveRecord 為例,如果要實現這樣的 SQL 敘述:

    Sql代碼 ?
  • INSERT?INTO?`users`?(id,?name,?gender,?location)?VALUES(1,?'roga',?'male',?'tpe')??
  • ?

    以 PDO 來寫是:

    Php代碼 ?
  • <?php??
  • $sql?=?"INSERT?INTO?`users`?(id,?name,?gender,?location)?VALUES(?,??,??,??)";??
  • $sth?=?$dbh->prepare($sql);??
  • $sth->execute(array(1,?'roga',?'male',?'tpe'));??
  • ?>??
  • ?

    但以 ActiveRecord 來說的話,則是:

    Php代碼 ?
  • <?php??
  • $user?=?new?User();??
  • $user->id?=?1;??
  • $user->name?=?'roga';??
  • $user->gender?=?'male';??
  • $user->location?=?'tpe';??
  • $user->save();??
  • ?>??
  • ?

    后者在語法上是不是簡潔很多呢,而且也大幅降低對 SQL 語言的依賴性!不同數據庫對 SQL 實作的問題可參考 Comparison of different SQL implementations。

    轉載于:https://www.cnblogs.com/youyuanjuyou/p/8099774.html

    總結

    以上是生活随笔為你收集整理的【转】mysql,mysqli,PDO三种方式连接数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。