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蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
Nov 26 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
php 启动时报错的简单解决方法
Jan 27 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
php在线解压ZIP文件的方法
Dec 30 PHP
php中动态调用函数的方法
Mar 16 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
yii2安装详细流程
May 23 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
ECMAScript6--解构
2017/03/30 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
Django后台获取前端post上传的文件方法
2018/05/28 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
助理政工师申报材料
2014/06/03 职场文书
班级读书活动总结
2014/06/30 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python