萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> php連接mysql數據庫的幾種方式(mysql、mysqli、pdo)

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

php與mysql的連接有三種API接口,分別是:PHP的MySQL擴展 、PHP的mysqli擴展 、PHP數據對象(PDO) ,下面針對以上三種連接方式做下總結,以備在不同場景下選出最優方案。 一、特性及對比
  • PHP的MySQL擴展是設計開發允許PHP應用與MySQL數據庫交互的早期擴展。mysql擴展提供了一個面向過程 的接口,並且是針對MySQL4.1.3或更早版本設計的。因此,這個擴展雖然可以與MySQL4.1.3或更新的數據庫服務端 進行交互,但並不支持後期MySQL服務端提供的一些特性。由於太過古老,又不安全,所以已被後來的mysqli完全取代。
  • 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注入問題,有很好的安全性。不過他也有缺點,某些多語句執行查詢不支持(不過該情況很少)。
官文對於三者之間也做了列表性的比較:

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,因為其不擔有跨庫的優點,更有讀寫速度快的特點。

二、模塊安裝及調用

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

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");
    //3、處理結果
    $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/>';
    }
    //4、關閉資源
    $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程序時,可以根據自己的情況而定

copyright © 萬盛學電腦網 all rights reserved