生活随笔
收集整理的這篇文章主要介紹了
【转】mysql,mysqli,PDO三种方式连接数据库
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【另外一個(gè)參考網(wǎng)址:? http://www.cnblogs.com/DeanChopper/p/4646081.html?】
【另外一個(gè)參考網(wǎng)址: http://www.jb51.net/article/28103.htm?】轉(zhuǎn)載自:http://justcoding.iteye.com/blog/2006490
PHP中MySQL、MySQLi和PDO的用法和區(qū)別 博客分類: Php / Pear / Mysql / Node.js
MySQL 是 PHP 操作 MySQL 數(shù)據(jù)庫最原始的 Extension。MySQLi 的 i 代表 Improvement ,提供了相對進(jìn)階的功能,就 Extension 而言,本身也增加了安全性。而 PDO(PHP Data Object)則是提供了一個(gè) Abstraction Layer 來操作數(shù)據(jù)庫,光從理論上看不出來有什么差別,所以就直接看代碼吧。
?
首先,先來看一段用 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 );?? ?>?? ?
乍看之下沒有什么問題,其實(shí)背后還是有些學(xué)問的。 這種方式不能 Bind Column,$location 的地方容易被 SQL 注入。于是后來發(fā)展出了 mysql_escape_string()(備注:5.3.0 之后棄用)以及 mysql_real_escape_string() 來解決這個(gè)問題,不過這么一搞,整個(gè)過程會變得復(fù)雜丑陋,而且如果參數(shù)多了,可以想象會是怎樣的情形……
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 中有了不少進(jìn)步,除了通過 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();???>?? ?
又發(fā)現(xiàn)了一些缺點(diǎn),例如得 Bind Result,這個(gè)就有點(diǎn)多余,不過這其實(shí)無關(guān)緊要,因?yàn)樽畲蟮膯栴}還是在于這不是一個(gè)抽象(Abstraction)的方法,所以當(dāng)后端更換數(shù)據(jù)庫的時(shí)候,就是痛苦的開始了。
于是 PDO 就出現(xiàn)了(備注:目前 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?? ?
當(dāng)通過 PECL 安裝裝好后,就可以通過以下方式來操作數(shù)據(jù)庫:
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;????>?? ?
乍看之下,PDO 的代碼好像也沒有變短,那到底好處是什么呢? 1、PDO 連接數(shù)據(jù)庫時(shí)通過 Connection String 來決定連接何種數(shù)據(jù)庫。
2、PDO 可以通過 PDO::setAttribute 來決定連接時(shí)的設(shè)定,比如 Persistent Connection,回傳錯(cuò)誤的方式(Exception,E_WARNING,NULL)。甚至是回傳參數(shù)名稱的大小寫等等。
3、PDO 支持 Bind Column 的功能,除了基本的 Prepare,Execute 以外,也可以 Bind 單一參數(shù),并且指定參數(shù)類型。
4.、PDO 是 Abstraction Layer,所以就算更換儲存媒介,需要花的功夫比起來是最少的。
可惜的是,盡管這些東西都已經(jīng)出現(xiàn)很久了,但還是不夠大眾化。我想或許是因?yàn)榇蠹伊?xí)慣看坊間的書籍學(xué)習(xí),但那些書本往往只會介紹最簡單最傳統(tǒng)的方式,導(dǎo)致很多人還是在用 MySQL 這種方直接連數(shù)據(jù)庫。
不過,目前來說我個(gè)人還是最喜愛通過 DBI 來連接數(shù)據(jù)庫,像是 ActiveRecord 以及 Propel ORM(Object-Relational Mapping)。
例如說以 ActiveRecord 為例,如果要實(shí)現(xiàn)這樣的 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 語言的依賴性!不同數(shù)據(jù)庫對 SQL 實(shí)作的問題可參考 Comparison of different SQL implementations。
轉(zhuǎn)載于:https://www.cnblogs.com/youyuanjuyou/p/8099774.html
總結(jié)
以上是生活随笔 為你收集整理的【转】mysql,mysqli,PDO三种方式连接数据库 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。