PHP數(shù)據(jù)對(duì)象PDO操作技巧小結(jié)
本文實(shí)例講述了PHP數(shù)據(jù)對(duì)象PDO操作技巧。分享給大家供大家參考,具體如下:
PHP 數(shù)據(jù)對(duì)象 (PDO) 擴(kuò)展為PHP訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)定義了一個(gè)輕量級(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操作事務(wù)
//開(kāi)啟事務(wù) beginTransacition() //回滾 rollback() //提交 commit() //判斷是否處于事務(wù)之中 inTransaction()
返回最后插入行的ID
PDO::lastInsertID()
exec()執(zhí)行
與query()相比,exec()返回的是受影響行數(shù)
$sql = "insert into table values('$val')";
if(false===$pdo->exec($sql)){
echo '執(zhí)行失敗';
}
PDO實(shí)現(xiàn)預(yù)編譯
指的是預(yù)先編譯sql的結(jié)構(gòu)的一種執(zhí)行sql的語(yǔ)法
如果執(zhí)行多條結(jié)構(gòu)相同的sql,編譯的中間結(jié)果(語(yǔ)法樹(shù))應(yīng)該也是一致的,因此可以將相同的結(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);
預(yù)編譯能更好地防止sql注入,是因?yàn)轭A(yù)編譯時(shí)候不需要用戶(hù)的數(shù)據(jù)參與,因此編譯時(shí)結(jié)構(gòu)固定,所以數(shù)據(jù)不影響到sql結(jié)構(gòu)。
$pdo->query()與$pdo->execute()如果需要防止sql注入,可以使用$pdo->quote()(其作用是先轉(zhuǎn)義后加引號(hào))
PDOstatement常用方法:
errorInfo()
errorCode()
fetchColumn()
fetch()
fetchAll()
rowCount()
closeCursor()
pdo應(yīng)用
<?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 '失敗的語(yǔ)句'.$sql.'<br>';
echo '錯(cuò)誤代碼'.$erro[1].'<br>';
echo '錯(cuò)誤信息'.$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));
?>
運(yùn)行效果圖如下:

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP基于pdo操作數(shù)據(jù)庫(kù)技巧總結(jié)》、《php+Oracle數(shù)據(jù)庫(kù)程序設(shè)計(jì)技巧總結(jié)》、《PHP+MongoDB數(shù)據(jù)庫(kù)操作技巧大全》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- 淺析php設(shè)計(jì)模式之?dāng)?shù)據(jù)對(duì)象映射模式
- PHP單例模式數(shù)據(jù)庫(kù)連接類(lèi)與頁(yè)面靜態(tài)化實(shí)現(xiàn)方法
- PHP實(shí)現(xiàn)的策略模式示例
- PHP單例模式應(yīng)用示例【多次連接數(shù)據(jù)庫(kù)只實(shí)例化一次】
- PHP的中使用非緩沖模式查詢(xún)數(shù)據(jù)庫(kù)的方法
- PHP基于單例模式實(shí)現(xiàn)的數(shù)據(jù)庫(kù)操作基類(lèi)
- PHP中數(shù)據(jù)庫(kù)單例模式的實(shí)現(xiàn)代碼分享
- php設(shè)計(jì)模式 DAO(數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象模式)
- PHP實(shí)現(xiàn)的數(shù)據(jù)對(duì)象映射模式詳解
相關(guān)文章
關(guān)于Laravel Service Provider開(kāi)發(fā)設(shè)置延遲加載時(shí)遇到的問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于Laravel Service Provider開(kāi)發(fā)設(shè)置延遲加載時(shí)遇到的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2018-01-01
PHP加密函數(shù) Javascript/Js 解密函數(shù)
php加密,js解密,貌似沒(méi)什么意義,主要是key在js中會(huì)被看到,不過(guò)在某些地方可能會(huì)用到2013-09-09
PHP根據(jù)樹(shù)的前序遍歷和中序遍歷構(gòu)造樹(shù)并輸出后序遍歷的方法
這篇文章主要介紹了PHP根據(jù)樹(shù)的前序遍歷和中序遍歷構(gòu)造樹(shù)并輸出后序遍歷的方法,涉及php數(shù)據(jù)結(jié)構(gòu)與算法中關(guān)于數(shù)的遍歷相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
PHP Header用于頁(yè)面跳轉(zhuǎn)要注意的幾個(gè)問(wèn)題總結(jié)
在PHP中用header("location:test.php")進(jìn)行跳轉(zhuǎn)要注意以下幾點(diǎn),有助于解決一些新手經(jīng)常遇到的問(wèn)題2008-10-10

