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字符串分割函数explode的实例代码
Feb 07 PHP
PHP自毁程序(慎用)
Jul 09 PHP
php 参数过滤、数据过滤详解
Oct 26 PHP
php实现简单的上传进度条
Nov 17 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
PDO的安全处理与事物处理方法
Oct 31 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
Dec 05 PHP
基于php编程规范(详解)
Aug 17 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
解析php类的注册与自动加载
2013/07/05 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
Python编程修改MP3文件名称的方法
2017/04/19 Python
python如何实现代码检查
2019/06/28 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
python操作链表的示例代码
2020/09/27 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
畜牧兽医本科生的自我评价
2014/03/03 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
大班幼儿评语大全
2014/04/30 职场文书
力学专业求职信
2014/07/23 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
培根随笔读书笔记
2015/07/01 职场文书