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 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
php生成扇形比例图实例
Nov 06 PHP
php获取英文姓名首字母的方法
Jul 13 PHP
php中preg_match的isU代表什么意思
Oct 01 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
PHP框架自动加载类文件原理详解
Jun 06 PHP
php中请求url的五种方法总结
Jul 13 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
Laravel 模型关联基础教程详解
Sep 17 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
Apr 26 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
写一个用户在线显示的程序
2006/10/09 PHP
分享10段PHP常用代码
2015/11/11 PHP
PHP7多线程搭建教程
2017/04/21 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
easyui validatebox验证
2016/04/29 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python命令行解析模块详解
2018/02/01 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
《猫》教学反思
2014/02/26 职场文书
食品业务员岗位职责
2014/03/18 职场文书
文化活动实施方案
2014/03/28 职场文书
平安工地汇报材料
2014/08/19 职场文书
服务整改报告
2014/11/06 职场文书
预备党员考察意见范文
2015/06/01 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
导游词之神仙居景区
2019/11/15 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android