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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
php strtotime 函数UNIX时间戳
Jan 14 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
Thinkphp中的volist标签用法简介
Jun 18 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
PHP中文乱码解决方案
Mar 05 PHP
PHP抓取网页、解析HTML常用的方法总结
Jul 01 PHP
两款万能的php分页类
Nov 12 PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
PHP实现Socket服务器的代码
2008/04/03 PHP
php入门教程 精简版
2009/12/13 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
python使用心得之获得github代码库列表
2014/06/25 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
德国帽子专家:Hutshopping
2019/11/03 全球购物
ORACLE十问
2015/04/20 面试题
Ajxa常见问题都有哪些
2014/03/26 面试题
竞聘书怎么写,如何写?
2014/03/31 职场文书
大学社团计划书
2014/05/01 职场文书
学生手册评语
2014/05/05 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
教师节横幅标语
2014/10/08 职场文书
区域销售大会开幕词
2016/03/04 职场文书
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL