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中通过smtp发邮件的类,测试通过
Jan 22 PHP
php xfocus防注入资料
Apr 27 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
Jun 03 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 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
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
解析PHP提交后跳转
2013/06/23 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
jquery插件制作教程 txtHover
2012/08/17 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
node实现mock-plugin中间件的方法
2019/12/25 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
Python求出0~100以内的所有素数
2018/01/23 Python
图解Python变量与赋值
2018/04/03 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
python list多级排序知识点总结
2019/10/23 Python
2014年秋季开学典礼主持词
2014/08/02 职场文书
装配出错检讨书
2014/09/23 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
功夫熊猫观后感
2015/06/10 职场文书
政审证明范文
2015/06/19 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android