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翻页类
Jun 01 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
在PHP中养成7个面向对象的好习惯
Jul 17 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
浅谈使用PHP开发微信支付的流程
Oct 04 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
Nov 10 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性能测试工具xhprof的详解
2013/06/03 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
python微信公众号开发简单流程实现
2020/03/09 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
Python常用外部指令执行代码实例
2020/11/05 Python
总裁秘书岗位职责
2013/12/04 职场文书
党员对照检查材料
2014/09/22 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
2015年工程师工作总结
2015/04/30 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python
MySQL 原理与优化之Update 优化
2022/08/14 MySQL