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目录导航文件代码
Oct 09 PHP
php date()日期时间函数详解
May 16 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
Oct 27 PHP
二招解决php乱码问题
Mar 25 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
php发送邮件的问题详解
Jun 22 PHP
php实现表单多按钮提交action的处理方法
Oct 24 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
Jan 21 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 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实现图象锐化代码
2007/06/14 PHP
php制作简单模版引擎
2016/04/07 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python requests证书问题解决
2019/09/05 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
python实现粒子群算法
2020/10/15 Python
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
四风问题班子对照检查材料
2014/09/27 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
基于python实现银行管理系统
2021/04/20 Python
python中requests库+xpath+lxml简单使用
2021/04/29 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis
Java数据结构之堆(优先队列)
2022/05/20 Java/Android