PHP連接到mysql的方法--mysqli和PDO

php連接到mysql數據庫,經典的方式就是使用mysql_connect(),但此擴展自 PHP 5.5.0 起已廢棄,之后被移除,因此本文介紹另外2種擴展方式
1、mysqli
mysqli是對mysql的一個增強版,出現在PHP 5 及以后的版本。它主要在一下幾方面比mysql增強了:
(1)、面向對象接口;(2)、prepared語句支持(譯注:關于prepare請參閱mysql相關文檔);(3)、多語句執行支持;(4)、事務支持;(5)、增強的調試能力;(6)、嵌入式服務支持

    <?php   
    $link = mysqli_connect("localhost","root","123456","test") or die("Error " . mysqli_error($link)); //連接,test為數據庫的名稱  
    $query = "SELECT name FROM userInfo" or die("Error in the consult.." . mysqli_error($link));//查詢  
    $result = mysqli_query($link, $query);//查詢的結果  
    while($row = mysqli_fetch_array($result)) {   
        echo $row["name"] . "<br>";   
    }  
    ?>  

上面的這段代碼是一個完整的從連接到查詢再到關閉數據庫的一個例子。mysqli的連接數據庫方法中除了使用上述(又稱之為面向過程)之外,另外一種就是面向對象方式:

    <?php  
    $mysqli = new mysqli("localhost","root","123456","test") //填寫mysql用戶名、密碼及數據庫的名稱  
        or die("Could not connect to MySQL server!");  
    $mysqli->query("set names utf8"); //設置數據庫內數據的編碼,相當于同時設置客戶端、服務器端和腳本編碼方式。  
        $sql  = "select * from userInfo";  
    $result = $mysqli->query($sql);  
    if($result){  
        if($result->num_rows>0){  
            while($row =$result->fetch_array()){//循環輸出結果集中的記錄  
                echo ($row[0])." ";  
                echo ($row[1])." ";  
                echo ($row[2])." ";  
                echo "<br/>";  
            }  
        }  
    }else{  
        echo "Sorry!";  
    }  
    $result=NULL;   
    $mysqli->close();  
    ?>  

這種用法中,使用mysqli之前要先new一個對象,然后使用該實例對象進行操作。
2、PDO
PHP的一個數據對象,它提供了一個統一的連接數據庫的API,它代表的是和數據庫之間的一個連接,類似于java中的jdbc。
簡單舉例如下:

    <?php  
    $pdo = new PDO('pgsql:host=192.168.1.111;port=5432;dbname=anydb', 'anyuser', 'pw');//連接到數據庫  
    sleep(5);  
    $stmt = $pdo->prepare('SELECT * FROM sometable');  
    $stmt->execute();  
    $pdo = null;//關閉連接  
    ?>  

PS:
由于從PHP 6 開始要完全使用PDO方式而非其他方式連接數據庫,所以接下來對PDO簡單介紹一下:

1)、為什么要用PDO,用PDO有什么好處?
PDO(PHP數據對象),是PHP訪問數據庫的一個輕量級的統一接口。它提供了一個數據訪問抽象層,這也就是說無論什么數據庫都能用相同的方法進行查詢或讀取。需要注意的是PDO本身并不能實現任何的數據庫功能,而是必須要使用一個具體數據庫的PDO驅動進行訪問數據庫服務。

2)、怎么用PDO?
這里我們就以PHP的黃金搭檔mysql作為例子看看:
PDO_MYSQL:PDO_MYSQL是PDO接口能夠完成連接mysql數據庫的驅動(注:僅使用于mysql 3.x以上版本)。
安裝:打開php.ini文件,可以找到如下代碼,這里可以看到mysql的驅動默認已經打開(前面沒有用于注釋的分號),如有連接其他數據庫的需要,自行添加其他數據庫的驅動程序(取出相應的項前面的分號,沒有的添上)。

    //各數據庫的PDO驅動  
    extension=php_pdo.dll   
    extension=php_pdo_firebird.dll //Firebird  
    extension=php_pdo_informix.dll //Informix  
    extension=php_pdo_mssql.dll    //sql server  
    extension=php_pdo_mysql.dll    //mysql  
    extension=php_pdo_oci.dll      //Oracle  
    extension=php_pdo_oci8.dll   
    extension=php_pdo_odbc.dll     //DB2  
    extension=php_pdo_pgsql.dll    //PostgreSQL  
    extension=php_pdo_sqlite.dll   //SQLite  

連接:通過創建PDO基類的實例創建連接。

//連接到數據庫  
//$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
    //處理連接錯誤  
    try {  
        $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);  
        //查詢  
        foreach($db->query('SELECT * from FOO') as $row) {  
            print_r($row);  
        }  
        $dbh = null;  
    } catch (PDOException $e) {  
        print "Error!: " . $e->getMessage() . "<br/>";  
        die();  
    }  
//關閉連接  
$db = null; 

PDO方式連接數據庫mysql的實例:

    <?php  
        $dbms='mysql';       //數據庫 mysql  
        $host='localhost';   //數據庫主機名  
        $dbName='test';      //數據庫名  
        $user='root';        //連接用戶名  
        $pass='';            //密碼  
        $dsn="$dbms:host=$host;dbname=$dbName";  
        class db extends PDO{  
           public function __construct(){  
                try{  
                    parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']);  
                 }catch(PDOException$e){  
                     die("Error: ".$e->__toString()."<br/>");  
                }  
           }  
           public final function query($sql){  
                try{  
                    return parent::query($this->setString($sql));  
                }catch(PDOException$e){  
                    die("Error: ".$e->__toString()."<br/>");  
                }  
           }  
           private final function setString($sql){  
                echo"處理查詢";  
                return $sql;  
           }  
        }  
        $db=new db();  
        $db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);  
        foreach($db->query('select * from table_name') as $row){  
           print_r($row);  
        }  
        $db->exec('delete from table_name where id=11');  
    ?>  

3)、更多的PDO方法:

PDO::beginTransaction — 啟動一個事務  
PDO::commit — 提交一個事務  
PDO::__construct — 創建一個表示數據庫連接的 PDO 實例  
PDO::errorCode — 獲取跟數據庫句柄上一次操作相關的 SQLSTATE  
PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle  
PDO::exec — 執行一條 SQL 語句,并返回受影響的行數  
PDO::getAttribute — 取回一個數據庫連接的屬性  
PDO::getAvailableDrivers — 返回一個可用驅動的數組  
PDO::inTransaction — 檢查是否在一個事務內  
PDO::lastInsertId — 返回最后插入行的ID或序列值  
PDO::prepare — Prepares a statement for execution and returns a statement object  
PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object  
PDO::quote — Quotes a string for use in a query.  
PDO::rollBack — 回滾一個事務  
PDO::setAttribute — 設置屬性 
PDOStatement::bindColumn — 綁定一列到一個 PHP 變量  
PDOStatement::bindParam — 綁定一個參數到指定的變量名  
PDOStatement::bindValue — 把一個值綁定到一個參數  
PDOStatement::closeCursor — 關閉游標,使語句能再次被執行。  
PDOStatement::columnCount — 返回結果集中的列數  
PDOStatement::debugDumpParams — 打印一條 SQL 預處理命令  
PDOStatement::errorCode — 獲取跟上一次語句句柄操作相關的 SQLSTATE  
PDOStatement::errorInfo — 獲取跟上一次語句句柄操作相關的擴展錯誤信息  
PDOStatement::execute — 執行一條預處理語句  
PDOStatement::fetch — 從結果集中獲取下一行  
PDOStatement::fetchAll — 返回一個包含結果集中所有行的數組  
PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。  
PDOStatement::fetchObject — 獲取下一行并作為一個對象返回。  
PDOStatement::getAttribute — 檢索一個語句屬性  
PDOStatement::getColumnMeta — 返回結果集中一列的元數據  
PDOStatement::nextRowset — 在一個多行集語句句柄中推進到下一個行集  
PDOStatement::rowCount — 返回受上一個 SQL 語句影響的行數  
PDOStatement::setAttribute — 設置一個語句屬性  
PDOStatement::setFetchMode — 為語句設置默認的獲取模式。  
Exception::getMessage — 獲取異常消息內容。  
Exception::getPrevious — 返回異常鏈中的前一個異常  
Exception::getCode — 獲取異常代碼  
Exception::getFile — 獲取發生異常的程序文件名稱  
Exception::getLine — 獲取發生異常的代碼在文件中的行號  
Exception::getTrace — 獲取異常追蹤信息  
Exception::getTraceAsString — 獲取字符串類型的異常追蹤信息  
Exception::toString — 將異常對象轉換為字符串  
Exception::clone — 異常克隆 
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • Welcome 目前網絡上充斥著大量的陳舊信息,讓PHP新手誤入歧途,傳播著錯誤的實踐和糟糕的代碼,這必須得到糾正...
    layjoy閱讀 21,699評論 7 118
  • pdo類PDO是一個“數據庫訪問抽象層”,作用是統一各種數據庫的訪問接口,與mysql和mysqli的函數庫相比,...
    桖辶殤閱讀 881評論 0 0
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_閱讀 1,840評論 0 3
  • 1. 說明 ?美年健康也是一個認真打的比賽,初賽B榜最高分0.0279,排名15.?最初是想用它實踐一下自然...
    xieyan0811閱讀 389評論 1 0
  • 短頸鹿與千層酥 黎棠始終忘不了初見那個男孩的場景。 父親黎海在潮禾鎮上有一家小店,叫海棠小店。母親過世早,...
    短頸鹿與千層酥閱讀 294評論 0 1