PHP數(shù)據(jù)對象PDO操作技巧小結(jié)
本文實例講述了PHP數(shù)據(jù)對象PDO操作技巧。分享給大家供大家參考,具體如下:
PHP 數(shù)據(jù)對象 (PDO) 擴展為PHP訪問數(shù)據(jù)庫定義了一個輕量級的一致接口。
<?php try { $dsn = "mysql:host=localhost; port=3306; dbname=wsq_hotel; charset=utf-8"; $user = 'root'; $psw ='root'; $pdo = new PDO($dsn,$user,$psw); $sql = 'select goods_prices from wsq_goods_info where goods_id=2'; // $sql = "show database"; $res = $pdo->query($sql) or var_dump($pdo->errorInfo()); // var_dump($res); $mon = $res->fetch(PDO::FETCH_ASSOC); echo $mon['goods_price']; } catch (PDOException $e) { echo $e->getMessage(); } ?>
PDO操作事務
//開啟事務 beginTransacition() //回滾 rollback() //提交 commit() //判斷是否處于事務之中 inTransaction()
返回最后插入行的ID
PDO::lastInsertID()
exec()執(zhí)行
與query()相比,exec()返回的是受影響行數(shù)
$sql = "insert into table values('$val')"; if(false===$pdo->exec($sql)){ echo '執(zhí)行失敗'; }
PDO實現(xiàn)預編譯
指的是預先編譯sql的結(jié)構(gòu)的一種執(zhí)行sql的語法
如果執(zhí)行多條結(jié)構(gòu)相同的sql,編譯的中間結(jié)果(語法樹)應該也是一致的,因此可以將相同的結(jié)構(gòu),統(tǒng)一編譯,每次使用不同的數(shù)據(jù)執(zhí)行即可。
編譯統(tǒng)一的結(jié)構(gòu)
$pdoStatement = $pdo->prepare(sql結(jié)構(gòu))
綁定數(shù)據(jù)到中間編譯結(jié)果
$pdoStatement ->bindValue()
執(zhí)行
$pdoStatement ->execute() //$sql = "insert into table values(null,?)"; $sql = "insert into table values(null,:name)"; $stmt = $pdo->prepare($sql); //多組數(shù)據(jù)也是一編譯一執(zhí)行 //$stmt->bindValue(1,'bee'); $stmt->bindValue(':name','bee'); $res = $stmt->execute(); var_dump($res);
預編譯能更好地防止sql注入,是因為預編譯時候不需要用戶的數(shù)據(jù)參與,因此編譯時結(jié)構(gòu)固定,所以數(shù)據(jù)不影響到sql結(jié)構(gòu)。
$pdo->query()與$pdo->execute()如果需要防止sql注入,可以使用$pdo->quote()(其作用是先轉(zhuǎn)義后加引號)
PDOstatement常用方法:
errorInfo()
errorCode()
fetchColumn()
fetch()
fetchAll()
rowCount()
closeCursor()
pdo應用
<?php header('content-type:text/html;charset=utf-8'); class PDODB{ static private $_init; private $_host; private $_port; private $_dbname; private $_username; private $_password; private $_charset; private $_dns; private $_pdo; private function __construct($config){ $this->_initParamas($config); $this->_initDNS(); $this->_initDriverOptions(); $this->_initPDO(); } private function __clone(){} static public function getInstance($config){ if(!static::$_init instanceof static){ static::$_init = new static($config); } return static::$_init; } private function _initParamas($config){ $this->_host = isset($config['host'])?$config['host']:'localhost'; $this->_port = isset($config['port'])?$config['port']:'3306'; $this->_dbname = isset($config['dbname'])?$config['dbname']:''; $this->_username = isset($config['username'])?$config['username']:'root'; $this->_passward = isset($config['passward'])?$config['passward']:''; $this->_charset = isset($config['charset'])?$config['charset']:'utf8'; } private function _initDNS(){ $this->_dns = "mysql:host=$this->_host;port=$this->_port;dbname=$this->_dbname"; } private function _initDriverOptions(){ $this->_driverOptions = array( PDO::MYSQL_ATTR_INIT_COMMAND => "set names $this->_charset" ); } private function _initPDO(){ $this->_pdo = new PDO($this->_dns,$this->_username,$this->_passward,$this->_driverOptions) or die("fail"); } public function query($sql){ if(!$result = $this->_pdo->query($sql)){ $erro = $this->_pdo->errorInfo(); echo '失敗的語句'.$sql.'<br>'; echo '錯誤代碼'.$erro[1].'<br>'; echo '錯誤信息'.$erro[2].'<br>'; die; } return $result; } public function fetchAll($sql){ $res = $this->query($sql); $list = $res->fetchAll(PDO::FETCH_ASSOC); $res->closeCursor(); return $list; } public function fetchRow($sql){ $res = $this->query($sql); $row = $res->fetch(PDO::FETCH_ASSOC); $res->closeCursor(); return $row; } public function fetchOne($sql){ $res = $this->query($sql); $one = $res->fetchColumn(); $res->closeCursor(); return $one; } public function escape_string($data){ return $this->_pdo->quote($data); } } $config = array( "host"=>"localhost", "username"=>"root", "passward"=>"root", "dbname"=>"students" ); $pdo = PDODB::getInstance($config); $sql = "select sdept from student where sage=21"; var_dump($pdo->fetchRow($sql)); ?>
運行效果圖如下:
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP基于pdo操作數(shù)據(jù)庫技巧總結(jié)》、《php+Oracle數(shù)據(jù)庫程序設計技巧總結(jié)》、《PHP+MongoDB數(shù)據(jù)庫操作技巧大全》、《php面向?qū)ο蟪绦蛟O計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
相關(guān)文章
關(guān)于Laravel Service Provider開發(fā)設置延遲加載時遇到的問題詳解
這篇文章主要給大家介紹了關(guān)于Laravel Service Provider開發(fā)設置延遲加載時遇到的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧。2018-01-01PHP加密函數(shù) Javascript/Js 解密函數(shù)
php加密,js解密,貌似沒什么意義,主要是key在js中會被看到,不過在某些地方可能會用到2013-09-09PHP根據(jù)樹的前序遍歷和中序遍歷構(gòu)造樹并輸出后序遍歷的方法
這篇文章主要介紹了PHP根據(jù)樹的前序遍歷和中序遍歷構(gòu)造樹并輸出后序遍歷的方法,涉及php數(shù)據(jù)結(jié)構(gòu)與算法中關(guān)于數(shù)的遍歷相關(guān)操作技巧,需要的朋友可以參考下2017-11-11PHP Header用于頁面跳轉(zhuǎn)要注意的幾個問題總結(jié)
在PHP中用header("location:test.php")進行跳轉(zhuǎn)要注意以下幾點,有助于解決一些新手經(jīng)常遇到的問題2008-10-10