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与ASP
Oct 09 PHP
用header 发送cookie的php代码
Mar 16 PHP
php UBB 解析实现代码
Nov 27 PHP
phpmail类发送邮件函数代码
Feb 20 PHP
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
php获取一个变量的名字的方法
Sep 05 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
php数组添加元素方法小结
Dec 20 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
前端必学之PHP语法基础
Jan 01 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 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备份/还原MySQL数据库的代码
2011/01/06 PHP
php实现文件编码批量转换
2014/03/10 PHP
php实现读取内存顺序号
2015/03/29 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
2020/12/13 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python中下划线的使用方法
2015/03/27 Python
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
一套Java笔试题
2016/08/20 面试题
教师党员思想汇报
2014/01/06 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
暑期培训随笔感言
2014/03/10 职场文书
公证委托书标准格式
2014/09/11 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python