php鏈接mysql數據庫的幾種方式(mysql、mysqli、pdo)

php鏈接mysql數據庫的幾種方式(mysql、mysqli、pdo)

www.111cn.net 編輯:flyfox 來源:轉載php

php與mysql的鏈接有三種API接口,分別是:PHP的MySQL擴展 、PHP的mysqli擴展 、PHP數據對象(PDO) ,下面針對以上三種鏈接方式作下總結,以備在不一樣場景下選出最優方案。html

1、特性及對比
mysql

  • PHP的MySQL擴展是設計開發容許PHP應用與MySQL數據庫交互的早期擴展。mysql擴展提供了一個面向過程 的接口,而且是針對MySQL4.1.3或更早版本設計的。所以,這個擴展雖然能夠與MySQL4.1.3或更新的數據庫服務端 進行交互,但並不支持後期MySQL服務端提供的一些特性。因爲太過古老,又不安全,因此已被後來的mysqli徹底取代。sql

  • PHP的mysqli擴展,咱們有時稱之爲MySQL加強擴展,能夠用於使用 MySQL4.1.3或更新版本中新的高級特性。其特色爲:面向對象接口 、prepared語句支持、多語句執行支持、事務支持 、加強的調試能力、嵌入式服務支持 、預處理方式徹底解決了sql注入的問題。不過其也有缺點, 就是隻支持mysql數據庫。若是你要是不操做其餘的數據庫,這無疑是最好的選擇。數據庫

  • PDO是PHP Data Objects的縮寫,其是PHP應用中的一個數據庫抽象層規範。PDO提供了一個統一的API接口可使得你的PHP應用不去關心具體要 鏈接的數據庫服務器系統類型。也就是說,若是你使用PDO的API,能夠在任何須要的時候無縫切換數據庫服務器,好比從oracle 到MySQL,僅僅須要修改不多的PHP代碼。其功能相似於JDBC、ODBC、DBI之類接口。一樣,其也解決了sql注入問題,有很好的安全性。不過他也有缺點,某些多語句執行查詢不支持(不過該狀況不多)。ubuntu

官文對於三者之間也作了列表性的比較:安全


PHP的mysqli擴展 PDO (使用PDO MySQL驅動和MySQL Native驅動) PHP的mysql擴展
引入的PHP版本 5.0 5.0 3.0以前
PHP5.x是否包含
MySQL開發狀態 活躍 在PHP5.3中活躍 僅維護
在MySQL新項目中的建議使用程度 建議 - 首選 建議 不建議
API的字符集支持
服務端prepare語句的支持狀況
客戶端prepare語句的支持狀況
存儲過程支持狀況
多語句執行支持狀況 大多數
是否支持全部MySQL4.1以上功能 大多數


從官方給出的這份結果上來看,優先推薦msqli,其次是pdo 。而「民間」給出的結果不少是傾向於使用PDO,由於其不擔有跨庫的優勢,更有讀寫速度快的特色。服務器

2、模塊安裝及調用oracle

以ubuntu及其衍生版爲例,經過sudo apt-get install mysqlnd 便可增長php對pdo和mysqli的支持(源碼安裝的能夠選擇phpize程序進行動態擴展)。具體能夠經過phpinfo頁面打開查看,其中在mysqlnd項下,能夠看到以下內容:ide

API Extensions  mysql,mysqli,pdo_mysql

mysqli和PDO鏈接方法

 代碼以下 複製代碼

// PDO
$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');
// mysqli, 面向過程方式
$mysqli = mysqli_connect('localhost','username','password','database');
// mysqli, 面向對象
$mysqli = new mysqli('localhost','username','password','database');

mysqli經過配置文件進行查詢的示例:

配置文件

 代碼以下 複製代碼

/var/www/t$ cat config.ini.php
<?php
  $dbhost ="localhost";
  $dbuser = "root";
  $dbpwd = "123456";
  $dbname = "wish";
  $charName = "utf8";
?>

查詢代碼

 代碼以下 複製代碼

/var/www/t$ cat mysqlquery.php
<?php
require_once("config.ini.php");
$mysqliObj = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
if(mysqli_connect_errno()){
 echo "鏈接失敗".mysqli_connect_error();
//printf("Connect failed: %sn", mysqli_connect_error());
 exit(); //www.111cn.net
}
    $sql="select * from wp_wish";
    $mysqliObj->query("set names $charName");
    //三、處理結果
    $res= $mysqliObj->query($sql);
    //var_dump($res);
    //fetch_assoc fetch_array fetch_object
    while($row=$res->fetch_row()){
 //       print_r($row);
        foreach($row as $val){
            echo '--'.$val;
        }
        echo '<br/>';
    }
    //四、關閉資源
    $res->free();
    $mysqliObj->close();
?>

pdo方式進行的查詢

 代碼以下 複製代碼

<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$password = '1';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$r = $dbh->query('SELECT * FROM user');
var_dump($r);
foreach($r as $v) {
    var_dump($v);
}
?>

總結:

像discuz、phpcms、akcms等程序通常都會提供兩種鏈接方式mysqli或pdo-mysql(前提是你的部署環境要支持),具體在使用到類以於以上的php程序時,能夠根據本身的狀況而定

相關文章
相關標籤/搜索