您好,登錄后才能下訂單哦!
這篇文章主要介紹了PHP中PDO連接數據庫的操作步驟,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
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擴展本身,并不能實現任何數據庫的操作,必須使用一個特性的形式把各自的特色表現出來才行。
1-2 PDO的配置與啟用
1-3 PDO連接數據庫
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()方法執行建表操作
<?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').'","waly@qq.com");'; $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').'","waly@qq.com");'; $sql=<<<EOF insert into t_teacher values (default,"king7","'.md5('king').'","waly@qq.com"), (default,"king8","'.md5('king').'","waly@qq.com"), (default,"king9","'.md5('king').'","waly@qq.com") 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操作
本身是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').'","waly@qq.com");'; $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').'","waly@qq.com");'; //$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()方法執行查詢語句
<?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對象方法的使用,以及參數的綁定與預處識。
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()方法綁定參數
<?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事務處理
<?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連接數據庫的操作步驟內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。