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.MVC的模板标签系统(三)
Sep 05 PHP
支持oicq头像的留言簿(二)
Oct 09 PHP
用php和MySql来与ODBC数据连接
Oct 09 PHP
php下删除字符串中HTML标签的函数
Aug 27 PHP
php调用google接口生成二维码示例
Apr 28 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
php 解析xml 的四种方法详细介绍
Oct 26 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 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
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
PHP 程序员的调试技术小结
2009/11/15 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
js实现鼠标跟随运动效果
2020/08/02 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
浅谈Python处理PDF的方法
2017/11/10 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python多进程fork()函数详解
2019/02/22 Python
python顺序执行多个py文件的方法
2019/06/29 Python
python绘制随机网络图形示例
2019/11/21 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
优秀老员工获奖感言
2014/02/15 职场文书
三年级评语大全
2014/04/23 职场文书
新教师个人总结
2015/02/06 职场文书
预备党员转正意见
2015/06/01 职场文书
拉贝日记观后感
2015/06/05 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis