PHP数据对象PDO操作技巧小结


Posted in PHP onSeptember 27, 2016

本文实例讲述了PHP数据对象PDO操作技巧。分享给大家供大家参考,具体如下:

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

<?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()执行

与query()相比,exec()返回的是受影响行数

$sql = "insert into table values('$val')";
if(false===$pdo->exec($sql)){
 echo '执行失败';
}

PDO实现预编译

指的是预先编译sql的结构的一种执行sql的语法

如果执行多条结构相同的sql,编译的中间结果(语法树)应该也是一致的,因此可以将相同的结构,统一编译,每次使用不同的数据执行即可。

编译统一的结构

$pdoStatement = $pdo->prepare(sql结构)

绑定数据到中间编译结果

$pdoStatement ->bindValue()

执行

$pdoStatement ->execute()
//$sql = "insert into table values(null,?)";
$sql = "insert into table values(null,:name)";
$stmt = $pdo->prepare($sql);
//多组数据也是一编译一执行
//$stmt->bindValue(1,'bee');
$stmt->bindValue(':name','bee');
$res = $stmt->execute();
var_dump($res);

预编译能更好地防止sql注入,是因为预编译时候不需要用户的数据参与,因此编译时结构固定,所以数据不影响到sql结构。

$pdo->query()与$pdo->execute()如果需要防止sql注入,可以使用$pdo->quote()(其作用是先转义后加引号)

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));
?>

运行效果图如下:

PHP数据对象PDO操作技巧小结

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php中文字符截取防乱码
Mar 28 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
Jun 23 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
PDO::errorCode讲解
Jan 28 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 PHP
用php如何解决大文件分片上传问题
Jul 07 PHP
PHP基于GD库的图像处理方法小结
Sep 27 #PHP
PHP文件上传操作实例详解
Sep 27 #PHP
PHP目录操作实例总结
Sep 27 #PHP
PHP文件操作实例总结
Sep 27 #PHP
PHP命名空间namespace用法实例分析
Sep 27 #PHP
PHP7标量类型declare用法实例分析
Sep 26 #PHP
PHP7新增运算符用法实例分析
Sep 26 #PHP
You might like
php 参数过滤、数据过滤详解
2015/10/26 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
php中请求url的五种方法总结
2017/07/13 PHP
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
JS常用算法实现代码
2016/11/14 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
Python基础篇之初识Python必看攻略
2016/06/23 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
python推导式的使用方法实例
2021/02/28 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
亲戚结婚的请假条
2014/02/11 职场文书
收款委托书
2014/10/14 职场文书
男方婚前保证书
2015/02/28 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android