有關PHP中PDO連線資料庫的詳細教學與實際操作演示

2020-07-16 10:05:44
PDO—資料庫抽象層

簡介:PDO擴充套件為PHP存取資料庫定義了一個輕量級的、一致性的介面,PDO解決了資料庫連線不統一的問題。

一、 PDO簡介

本章主要介紹PDO的安裝與設定,以及使用PDO連線資料庫的方法。

1-1PDO簡介

PDO是PHP Data Object(PHP資料物件)的簡稱,它是與PHP5.1版本一起發布的,目前支援的資料庫包括Firebird、FreeTDS、Interbase、MySQL、MS SQL Server、ODBC、Oracle、Postgre SQL、SQLite和Sybase。當操作不同資料庫時,只需要修改PDO中的DSN(資料庫源) ,即可使用PDO的統一介面進行操作。

PDO特性:

編碼一致性:PDO提供可用於各種資料庫的單一介面

靈活性:PDO在執行時必須載入資料庫驅動程式,所以不需要每次在使用資料庫時,重新設定和重新編譯PHP

高效能:PDO是用C語言編寫的編譯為PHP,與用php編寫的其他方案相比,雖然其他功能相同,但提供了更高的效能

物件導向特性:PDO是利用的PHP5物件導向的特性,可以獲得更高效的資料庫通訊。

注意:PDO擴充套件只是一個抽象的介面層,利用PDO擴充套件本身,並不能實現任何資料庫的操作,必須使用一個特性的形式把各自的特色表現出來才行。

PDO數據庫.png

1-2 PDO的設定與啟用

PDO安裝與配置.png

1-3 PDO連線資料庫

PDO連接數據庫.png

1.通過引數形式連線資料庫(重點掌握此種辦法)

//通過引數形式連線資料庫
try{
 $dsn='mysql:host=localhost;dbname=school';
 $username='root';
 $password='root';
 $pdo=new PDO($dsn,$username,$password);
 var_dump($pdo);
}catch (PDOException $e){
    echo $e->getMessage();
};

需要注意:dsn是你的資料來源

輸出結果:object(PDO)#1 (0) { }

二、 PDO物件的使用

主要介紹PDO物件方法的使用。

2-1 [PDO] exec()方法執行建表操作

PDO對象的方法2.png

<?php
try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //exec():執行一條sql語句並返回其受影響的行數;如果沒有受影響的記錄,它返回0
    //exec對於select沒有作用
    //PHP是一個Web程式語言,在程式設計過程中難免會遇到用echo來輸出大段的html和javascript指令碼的情況,
    //如果用傳統的輸出方法 ——按字串輸出的話,
    //肯定要有大量的跳脫符來對字串中的引號等特殊字元進行跳脫,以免出現語法錯誤。
    //如果是一兩處還可以容忍,但是要是一個完整的 html文字或者是一個200行的js我想是誰都會崩潰的。
    //這就是PHP為什麼要引入一個定界符的原因——至少一大部分原因是這樣的。

    /*    1.PHP定界符的作用就是按照原樣,包括換行格式什麼的,輸出在其內部的東西;
    2.在PHP定界符中的任何特殊字元都不需要跳脫;
    3.PHP定界符中的PHP變數會被正常的用其值來替換。
        PHP中的定界符格式是這樣的:
    <<<Eof
    ……
    Eof;*/
    $sql=<<<EOF
    create table if not exists t_teacher(
   id int UNSIGNED auto_increment primary key,
   teaname varchar(20) not null UNIQUE,
   pwd char(32) not null,
   email varchar(30) not null
);
EOF;
   $res= $pdo->exec($sql);
    var_dump($res);
}catch (PDOException $e){
    echo $e->getMessage();
};

輸出結果:int(0);

2-2 [PDO] exec()方法執行插入記錄操作

續上面:插入一條或多條記錄

<?php
try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    $sql='insert into t_teacher values(default,"king5","'.md5('king').'","[email protected]");';
    $res=$pdo->exec($sql);
    echo $res;
}catch (PDOException $e){
    echo $e->getMessage();
};
<?php
try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //$sql='insert into t_teacher values(default,"king6","'.md5('king').'","[email protected]");';
   $sql=<<<EOF
      insert into t_teacher values
      (default,"king7","'.md5('king').'","[email protected]"),
      (default,"king8","'.md5('king').'","[email protected]"),
      (default,"king9","'.md5('king').'","[email protected]")
EOF;

    $res=$pdo->exec($sql);
    echo '受影響的記錄的條數為:'. $res."<br/>";
    //$pdo->lastInsertId():得到新插入記錄的ID號
    //echo '最後插入的ID號為:'.$pdo->lastInsertId();
}catch (PDOException $e){
    echo $e->getMessage();
};

2-3 [PDO] exec()方法執行其他SQL操作

PDO執行其它方法.png

本身是king,修改為king,會是0條記錄被影響.

lastInsertId() 只能對插入有影響。

exec()對查詢無作用

2-4 [PDO] errorCode()和errorInfo()方法檢視錯誤資訊

<?php
try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
   //錯誤的表名
    $sql='insert into t_teacher1 values(default,"king6","'.md5('king').'","[email protected]");';
    $res=$pdo->exec($sql);
    if($res===false){
        //$pdo->errorCode(); SQLSTATE的值
        echo $pdo->errorCode();
        echo '<hr/>';
      //$pdo->errorInfo():返回的錯誤資訊的陣列,陣列中包含3個單元
     //0=>SQLSTATE(錯誤編號),1=>CODE(錯誤碼),2=>INFO(錯誤資訊)
        $errInfo=$pdo->errorInfo();
        print_r($errInfo);
    }
}catch (PDOException $e){
    echo $e->getMessage();
};

2-5 [PDO] query()方法執行查詢語句

<?php
try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //查詢一條記錄
    //$sql='select * from t_teacher where id=5';
    //查詢多條記錄
    $sql='select * from t_teacher';
    //$pdo->query($sql):執行sql語句,返回PDOStatement物件:需要遍歷這個物件,將裡面的內容取出來
    $stmt=$pdo->query($sql);
    var_dump($stmt); //只能看出這個語句返回的是一個物件
    echo '<hr/>';
    foreach ($stmt as $row){
        print_r($row);
        echo '<hr/>';
        echo '編號:'.$row['id'].'<br/>';
        echo '使用者名稱:'.$row['teaname'].'<br/>';
        echo '郵箱:'.$row['email'].'<br/>';
        echo '<hr/>';
    }
}catch (PDOException $e){
    echo $e->getMessage();
};
Query()用於插入資料

<?php
try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //插入一條記錄
    $sql='insert into t_teacher values(default,"king12","'.md5('king').'","[email protected]");';
    //$pdo->query($sql):執行sql語句,返回PDOStatement物件:需要遍歷這個物件,將裡面的內容取出來
    $stmt=$pdo->query($sql);
    var_dump($stmt); //只能看出這個語句返回的是一個物件
}catch (PDOException $e){
    echo $e->getMessage();
};

注意:更多的用query()查詢資料,用exec()實現增刪改

2-6 [PDO] prepare()和execute()方法執行查詢語句

PDOstatement對象方法.png

<?php

//查詢單條語句

try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //查詢一條記錄
   $sql='select * from t_teacher where id=5';
   //$pdo->prepare($sql);準備sql語句
    $stmt=$pdo->prepare($sql);
    //execute():執行預處理語句
    $res=$stmt->execute();
    //var_dump($res); //會返回bool(true)
    //查資料使用
    //fetch():得到結果集中的一條記錄(作為索引+關聯樣式返回)
    $row=$stmt->fetch();
    print_r($row);
}catch (PDOException $e){
    echo $e->getMessage();
};
<?php
try{
    //驅動器的名稱 mysql
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //查詢多條記錄
    $sql='select * from t_teacher';
    //$pdo->prepare($sql);準備sql語句
    $stmt=$pdo->prepare($sql);
    //execute():執行預處理語句
    $res=$stmt->execute();
    //var_dump($res); //會返回bool(true)
    //查資料使用
    //fetch():得到結果集中的一條記錄(作為索引+關聯陣列)
    /*if($res){
        while ($row=$stmt->fetch()){
            print_r($row);
            echo '<hr/>';
        }
    }*/
    //fetchAll() 查詢所有記錄,以二維陣列(索引+關聯方式)
 $rows=$stmt->fetchAll();
print_r($rows);
}catch (PDOException $e){
    echo $e->getMessage();
};

指定型別:我們更多的是想得到關聯陣列,我們可以通過兩種方式來獲得,第一種方式:設定其取回資料的方式(設定引數、常數);第二種方式:通過方法

三、 PDOStatement物件的使用

本章主要介紹PDOStatement物件方法的使用,以及引數的系結與預處識。

PDOstatement對象的方法.png

3-1 [PDO] quote()方法防止SQL隱碼攻擊

帶條件查詢 登入實現的例子

<?php
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //向資料庫表查詢對應的使用者資訊//如果存在,證明有這個使用者,登入成功;否則登入失敗
    //輸入 'or 1=1 # 可以檢視查到的資料
    //$sql="select * from t_user WHERE `name`='{$username}' AND  `password`='{$password}'";    //通過quote():返回帶引號的字串,過濾字串中的特殊字元
    $username=$pdo->quote($username);
    $sql="select * from t_user WHERE `name`={$username} AND  `password`={$password}";
    echo $sql;
    $stmt=$pdo->query($sql);
    //PDOStatement物件的方法:rowCount() :對於select操作返回的結果集中記錄的條數,
    //對於INSERT、UPDATE、DELETE返回受影響的記錄的條數
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-2 [PDO] 預處理語句中的預留位置的使用

<?php
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    //預留位置有兩種方法
    //第一種方法
    $sql="select * from t_user WHERE `name`=:username and  `password`=:password";
    $stmt=$pdo->prepare($sql);
$stmt->execute(array(":username"=>$username,":password"=>$password));
    //PDOStatement物件的方法:rowCount() :對於select操作返回的結果集中記錄的條數,
    //對於INSERT、UPDATE、DELETE返回受影響的記錄的條數
   echo $stmt->rowCount();
    //第二種方法
    $sql="select * from t_user WHERE `name`=? and  `password`=?";
    $stmt=$pdo->prepare($sql);
    $stmt->execute(array($username,$password));
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-3 [PDO] bindParam()方法系結引數

兩種方式:命名引數預留位置,問號方式

<?php
header('content-type:text/html;charset=utf-8');
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
   // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)";
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(":username",$username,PDO::PARAM_STR);
    $stmt->bindParam(":password",$password,PDO::PARAM_STR);
    $stmt->bindParam(":sex",$sex,PDO::PARAM_STR);
    $username='張三';
    $password='123654';
    $sex='M';
   $stmt->execute();
   echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}
<?php
header('content-type:text/html;charset=utf-8');
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,?,?,?)";
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(1,$username);
    $stmt->bindParam(2,$password);
    $stmt->bindParam(3,$sex);
    $username='張三1';
    $password='1236541';
    $sex='F';
    $stmt->execute();
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-4 [PDO] bindValue()方法系結引數

向使用者表插入資料:命名引數預留位置,問號方式類似

<?php
header('content-type:text/html;charset=utf-8');
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,?,?,?)";
    $stmt=$pdo->prepare($sql);
    $username='李四';
    $password='123654';
    $stmt->bindValue(1,$username);
    $stmt->bindValue(2,$password);
    $stmt->bindValue(3,'M');
    $stmt->execute();
    echo $stmt->rowCount();
    $username='李四1';
    $password='1236541';
    $stmt->bindValue(1,$username);
    $stmt->bindValue(2,$password);
    $stmt->bindValue(3,'M');
    $stmt->execute();
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-5 [PDO] bindColumn()方法系結引數

PDOstatement對象的方法3.png

<?php
header('content-type:text/html;charset=utf-8');
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="select `name`,`password`,`sex` from t_user";
    $stmt=$pdo->prepare($sql);
    $stmt->execute();

  echo '結果集中的列數一共有:'.$stmt->columnCount();

    echo "<hr/>";

    print_r($stmt->getColumnMeta(0));
    $stmt->bindColumn(1,$username);
    $stmt->bindColumn(2,$password);
    $stmt->bindColumn(3,$sex);
    while ($stmt->fetch(PDO::FETCH_BOUND)){
      echo '使用者名稱:'.$username."-密碼:".$password."-性別:".$sex."<hr/>";
    }
    echo $stmt->rowCount();
}catch (PDOException $e){
    echo $e->getMessage();
}

3-6 [PDO] fetchColumn()方法從結果集中返回一列

<?php
header('content-type:text/html;charset=utf-8');
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');    $sql="select `name`,`password`,`sex` from t_user";
    $stmt=$pdo->query($sql);
    //索引預設從0開始
    echo $stmt->fetchColumn(0),"<br/>";
    echo $stmt->fetchColumn(1),"<br/>";
    echo $stmt->fetchColumn(2);
}catch (PDOException $e){
    echo $e->getMessage();
}

3-7 [PDO] debugDumpParams()方法列印一條預處理語句

<?php
header('content-type:text/html;charset=utf-8');
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    // $sql="insert into t_user(`name`,`password`,`sex`) VALUES (:username,:password,:sex)";
    $sql="insert into t_user VALUES (DEFAULT ,:username,:password,:sex)";
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(":username",$username,PDO::PARAM_STR);
    $stmt->bindParam(":password",$password,PDO::PARAM_STR);
    $stmt->bindParam(":sex",$sex,PDO::PARAM_STR);
    $username='張三';
    $password='123654';
    $sex='M';
    $stmt->execute();
    $stmt->debugDumpParams();
}catch (PDOException $e){
    echo $e->getMessage();
}

四、PDO事務處理

主要介紹如何使用PDO進行事務處理

4-1 PDO錯誤處理模式

3種錯誤處理模式

靜默模式

<?php
header('content-type:text/html;charset=utf-8');
 /*PDO::ERRMODE_SLIENT:預設模式,靜默模式*/
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
    $sql="select * from nonet_user";
    $stmt=$pdo->query($sql);
    echo $pdo->errorCode();
    echo '<br/>';
    echo $pdo->errorInfo();
}catch (PDOException $e){
    echo $e->getMessage();
}
<?php
header('content-type:text/html;charset=utf-8');
 /*PDO::ERRMODE_SLIENT:預設模式,靜默模式
 *PDO::ERRMODE_WARNING:警告模式
  * PDO::ERRMODE_EXCEPTION:異常模式
 */
try{
    //連線資料庫
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root');
   //設定警告模式
    //$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
    //設定異常模式:推薦使用
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $sql="select * from nonet_user";
    $stmt=$pdo->query($sql);
    echo $pdo->errorCode();
    echo '<br/>';
    echo $pdo->errorInfo();
}catch (PDOException $e){
    echo $e->getMessage();
}

4-2 PDO事務處理

PDO對象的方法3.png

<?php
header('content-type:text/html;charset=utf-8');
try{
    $option=array(PDO::ATTR_AUTOCOMMIT,0);
    $pdo=new PDO('mysql:host=localhost;dbname=school','root','root',$option);
//開啟事務
    $pdo->beginTransaction();
    var_dump($pdo->inTransaction());
    $sql="update account set money=money-200  WHERE username='king'";
    $res=$pdo->exec($sql);
    if($res==0){
        throw new PDOException('轉賬失敗');
    }
    $res1=$pdo->exec('update account set money=money+200  WHERE username="queen"');
    if($res1==0){
        throw new PDOException('接收失敗');
    }
    $pdo->commit();
}catch (PDOException $e){
    $pdo->rollBack();
    echo $e->getMessage();
}

好了,以上就是關於本文介紹的關於PHP中PDO運算元據庫的詳細操作以及範例了,相了解更多相關問題請存取PHP中文網:

PHP視訊教學

以上就是有關PHP中PDO連線資料庫的詳細教學與實際操作演示的詳細內容,更多請關注TW511.COM其它相關文章!