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 14 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
php 获取SWF动画截图示例代码
Feb 10 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
YII2框架中使用yii.js实现的post请求
Apr 09 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
Jun 17 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 PHP
php TP5框架生成二维码链接
Apr 01 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共享内存段示例分享
2014/01/20 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
理解JS事件循环
2016/01/07 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
北京振戎融通Java面试题
2015/09/03 面试题
七一党建活动方案
2014/01/28 职场文书
元旦寄语大全
2014/04/10 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL