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 相关文章推荐
php 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
php经典趣味算法实例代码
Jan 21 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
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
2013/09/25 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
python 拼接文件路径的方法
2018/10/23 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
采购文员岗位职责
2013/11/20 职场文书
应届毕业生应聘自荐信
2013/12/07 职场文书
会计岗位职责范本
2014/03/07 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
环保主题班会教案
2015/08/13 职场文书