PHP PDO数据库操作预处理与注意事项


Posted in PHP onMarch 16, 2019

PDO(PHP Database Object)扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。在数据库操作方面更加安全更加高效!

PDO为PHP访问各类数据库定义了一个轻量级一致性的接口,无论什么数据库,都可以通过一致的方法执行查询和获取数据,而不用考虑不同数据库之间的差异,大大简化了数据库操作。使用PDO可以支持mysql、postgresql、oracle、mssql等多种数据库。

什么是预处理?

成熟的数据库都支持预处理语句(Prepared Statements)的概念。

它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。

预处理语句具有两个主要的优点:

1、查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。

对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。

通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。

2、传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。

如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。

代码演示:

<?php
header('content-type:text/html; charset=utf-8');
//实例化pdo对象
$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=test;', 'root', '888888');
//通过query函数执行sql命令
$pdo->query('set names utf8');
//插入数据
$sql  = "insert into persons (name,age) values (?, ?);";
$preObj = $pdo->prepare($sql);
$res  = $preObj->execute(array('小明', 22));
var_dump($res);
//删除数据
$sql = "delete from persons where id = ?";
$preObj = $pdo->prepare($sql);
$res  = $preObj->execute(array(3));
var_dump($res);
//修改数据
$sql = "update persons set name = ? where id = ?;";
$preObj = $pdo->prepare($sql);
$res  = $preObj->execute(array('lucy', 5));
var_dump($res);
//查询数据
$sql = "select * from persons where age > ? order by id desc;";
$preObj = $pdo->prepare($sql);
$preObj->execute(array(20));
$arr = $preObj->fetchAll(PDO::FETCH_ASSOC);
/*
 * FETCH_BOTH   是默认的,可省,返回关联和索引。
 * FETCH_ASSOC   参数决定返回的只有关联数组。
 * PDO::FETCH_NUM 返回索引数组
 * PDO::FETCH_OBJ 返回由对象组成的二维数组
 */
print_r($arr);

如果当你使用pdo预处理插入一条数据时候,报错

<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$password = '';
try {
  $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
  echo 'Connection failed: ' . $e->getMessage();
}
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('INSERT INTO room (create_time,create_uid,exp_time,is_private) VALUES (?,?,?,?)');
$rs = $sth->execute(["2018-05-14 14:10:04",0,1526278504,1]);
var_dump($sth->errorInfo());exit;

报错

array (size=3)
  0 => string 'HY000' (length=5)
  1 => int 1364
  2 => string 'Field 'id' doesn't have a default value' (length=39)

这是由于你设计的表的主键没有auto_increment

解决方法

可以加入自增长或者预处理语句中加入主键字段

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
Apr 18 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
浅析Laravel5中队列的配置及使用
Aug 04 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 PHP
laravel 实现划分admin和home 模块分组
Oct 15 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 PHP
php生成word并下载代码实例
Mar 15 #PHP
PHP-FPM的配置与优化讲解
Mar 15 #PHP
php-fpm中max_children的配置
Mar 15 #PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 #PHP
php根据命令行参数生成配置文件详解
Mar 15 #PHP
详解PHP的抽象类和抽象方法以及接口总结
Mar 15 #PHP
PHP基于面向对象封装的分页类示例
Mar 15 #PHP
You might like
xajax写的留言本
2006/11/25 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
详解python tkinter模块安装过程
2020/01/06 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
Python configparser模块操作代码实例
2020/06/08 Python
Python利用命名空间解析XML文档
2020/08/10 Python
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
计算机专业个人简短的自我评价
2013/10/23 职场文书
区三好学生主要事迹
2014/01/30 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
python中24小时制转换为12小时制的方法
2021/06/18 Python
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript