PDO 预处理数据绑定|学习笔记

简介: 快速学习 PDO 预处理数据绑定,PDO预处理数据绑定有多种方式。

开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段PDO 预处理数据绑定】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/713/detail/12738


PDO 预处理数据绑定


内容介绍:

一、 概念

二、 示例

三、 小结

 

一、概念

1、目标:掌握PDO关于预处理参数绑定的实现,掌握不同类型数据绑定的实际区别。

2、概念

数据绑定:是指在进行预处理指令定义时使用了占位符,占位符是否为原生不重要,若是原生用索引做一个替换即可。如果用的是优化后的冒号加名字形式,使用关联的冒号加名字的形式即可。为了保证后续执行预处理时能够正确执行,将实际数据替换占位符的过程

(1)数据绑定的方式应该与占位符方式对应

(2)PDOStatement:execute()方法本身就可以实现数据传递和绑定,不需要使用bindValue()或者bindParam()。

(3)PDOStatement:bindValue()和bindParam()在实际运用中有明显区别

 

二、示例

1、在PDO中,execute本身是可以直接进行数据绑定的,即在参数中增加对应的占位符数据,以数组形式传入。

(1)预处理形式使用原始占位符?

$stmt = $pdo->prepare( 'select * from t_40 where id = ?');

$stmt->execute(array(10));

# 操作where id = ?后,传入一个数组即可。array代表是数组,10代表是替换值,如果有多个元素,顺序放入即可。比如“1”,就传一个“10”,如果有“2”可以传后面值。

代码示例:

<?php

#实例化

$pdo=new PDO('mysql:host=localhost;port=3306;dbname=db _2;charset=utf8 ' , ' root' , 'root ') or die('数据库连接失败! ');

$pre_sql = "select * from t_40 whereid = ?";

# PDO特定预处理参数指令(︰+字符串),更明确

#发送预处理指令

$stmt = $pdo->prepare($pre_sql);

if(!$stmt) die('预处理指令执行失败!');

#执行预处理:绑定参数,可以使用execute方法直接传(数组传)

#索引方式:不需要给下标,直接数字索引即可

#关联方式:需要给定下标

$res = $stmt->execute();

var_dump($res);

如果直接做会产生错误:没有被绑定一个对应的参数。

但是结果拿到的依然是 false,只是系统检测到需要参数但是未能传入参数。

$res = $stmt->execute(array(1));

var_dump($res);

结果显示运行执行成功。说明该1被绑定。

image.png再进行证明:用var_dump();再把数据取出来。所以:

$res = $stmt->execute(array(1));

var_dump($stmt->fetch(PDO ::FETCH_ASSOC));

刷新结果确实拿到了:

image.png

如果是array(12)也会有数据

image.png(2)预处理形式使用PDO占位符: +名字

$stmt = $pdo->prepare('select * from t_40 where id = :id ');

$stmt->execute(array( ' :id'=> 10));

# 使用占位符作为数组元素下标

2、PDOStatement:bindValue()和PDOStatement::bindParam()区别

(1)二者都可以实现占位符的数据绑定

(2)形式上的区别:bindValue绑定数据的方式灵活,可以是变量也可以是数据常量;而bindParam只能是变量

(3)本质的区别:因为bindParam绑定的是变量(引用传值),所以如果被绑定的变量发生改变,会直接影响后续execute结果。而bindValue传递的是值,所以对应的外部的一个变量修改后不会影响内部。

#测试bindValue:

$stmt = $pdo->prepare( 'select * from t_40 where id = :id');

$id = 1;  #给它一个变量

$stmt->bindvalue( ' :id' ,$id);  #然后把它绑定进去

for(;$id < 10;$id++){  #绑定之后让id开始变化,每次去拿结果

$stmt->execute();

$row = $stmt->fetch(PDO : : FETCH_ASSOC);

var_dump($row);

echo ‘<br>’

}

image.png结果有九条数据但我们需要查询id为1的。因为传递了一个值,所以无论变量如何改动都不会影响方法内部接收的变量的值。所以需要替换内容:

echo ‘<hr>’

#测试bindParam:

$id = 1;

$stmt->bindParam( ' :id' ,$id);

for( ;$id < 10;$id++){

$stmt->execute(;

$row = $stmt->fetch(PDO :: FETCH_ASSOC) ;

var_dump($row);

echo ‘<br>’

}

此时结果运行发现,每一条数据不一样

image.png说明外部id的改变影响了绑定的参数,因为是每次去执行一个execute()。执行execute()的时候会检测id是否改变。所以bindParam就会检测外部。如果外部改变,内部相应的就会修改。它能够实现绑定的数据随着外部的改变而每次执行execute()的时候影响到内部。

 

三、小结

1、PDO绑定预处理数据的方式有多种:

PDOStatement::bindValue()/bindParam()/execute()

(1)execute()少调用一个方法,简单。

(2)bindValue()可以直接绑定值。

(3)bindParam()更复杂一点,因为它必须要定义变量再传递值。但是正是因为必须要定义变量再传递值,而有了便捷性。

2、如果数据简单且不需要重复,那么使用bindValue()/execute()都可以。

3、如果数据本身是变化的,而且是有规则(数组遍历出来的结果),那么可以使用bindParam()来节省操作。

也可以使用bindValue,需要将$stmt->bindValue( ' :id' ,$id);放在for循环中,也可以达到这种效果。但是bindParam的效率要比bindValue高

image.png

相关文章
Ant Design TreeSelect树形选择器格式化数据以及禁用父节点
Ant Design TreeSelect树形选择器格式化数据以及禁用父节点
1698 0
Ant Design TreeSelect树形选择器格式化数据以及禁用父节点
|
流计算 资源调度 Java
Apache Flink 零基础入门(二):开发环境搭建和应用的配置、部署及运行
本文主要面向于初次接触 Flink、或者对 Flink 有了解但是没有实际操作过的同学。希望帮助大家更顺利地上手使用 Flink,并着手相关开发调试工作。
Apache Flink 零基础入门(二):开发环境搭建和应用的配置、部署及运行
|
缓存 监控 关系型数据库
优化数据库查询性能的五个技巧
在当今互联网时代,数据库查询性能是开发人员面临的重要挑战之一。本文将介绍五个有效的技巧,帮助开发人员优化数据库查询性能,提升系统的响应速度和稳定性。
|
9月前
|
前端开发 JavaScript API
体育赛事即时比分 分析页面的开发技术架构与实现细节
本文基于“体育即时比分系统”开发经验总结,分享技术实现细节。系统通过后端(ThinkPHP)、前端(Vue.js)、移动端(Android/iOS)协同工作,解决实时比分更新、赔率同步及赛事分析展示等问题。前端采用 Vue.js 结合 WebSocket 实现数据推送,提升用户体验;后端提供 API 支持比赛数据调用;移动端分别使用 Java 和 Objective-C 实现跨平台功能。代码示例涵盖比赛分析页面、API 接口及移动端数据加载逻辑,为同类项目开发提供参考。
|
监控 Ubuntu 测试技术
Ubuntu 20.04 安装部署 TiDB DM v7.3.0 集群【全网独家】
在Ubuntu上搭建TiDB DM集群的详细步骤分享,作者因工作需求克服了部署难题。测试环境包括3台Ubuntu 20.04主机:1台master和2台worker。首先,确保所有主机安装TiDB单机环境,使用TiUP工具下载并部署。接着,设置主机间免密登录,安装必要组件如sudo、systemd、iproute2和DM组件。配置文件可通过在线或离线方式获取。部署时,根据需求编辑`topology.yaml`,然后使用`tiup dm deploy`命令安装。最后,启动集群并检查节点状态,确认DM集群正常运行。注意,解决内存不足和端口连通性问题以避免错误。
853 3
|
Java 程序员 容器
十分钟搞懂依赖注入
依赖注入(DI)是软件开发中的关键技术,它将类的依赖关系转移至外部管理,提升了代码的模块化和可测试性。如同炒菜时调料不由厨师直接添加,而是由调料师准备并递送,程序员只需声明所需依赖,外部机制如DI容器会负责实例化并注入这些依赖。这样,类变得更灵活且易于测试,同时也促进了代码的模块化。例如,在Java中,可以通过构造函数注入Logger接口的不同实现(如ConsoleLogger和FileLogger),使Application类与其具体实现解耦。
534 1
|
人工智能 JavaScript 程序员
Fitten Code:在VSCode插件市场备受欢迎的原因是什么?
随着AI技术的不断发展,AI在编写代码方面的能力也日益强大。充分利用AI的能力能够显著提高代码编写的效率和质量。今天我将向大家介绍一款备受瞩目的AI代码神器——Fitten Code,让我们一同揭开它神秘的面纱!
1057 3
ly~
|
缓存 监控 编译器
如何优化 SDL 图形库在不同系统中的性能
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发库,用于优化不同系统中的图形库性能。在银河麒麟系统中,通过SDL渲染模式提升视频监控客户端性能,支持更多播放路数。优化方法包括:1) 图像加载时使用SDL_ConvertSurface转换图像格式,避免内存中存在多份拷贝;2) 在VSCode下配置SDL时,合理设置编译器选项和项目架构,减少API调用带来的性能开销;3) 使用SDL库在景嘉微7200显卡上优化渲染性能,提高播放路数。综合考虑图像加载优化、系统特性利用及硬件兼容性,以实现最佳性能。
ly~
816 6
|
存储 JSON 前端开发
让你的对象变得拗口:JSON.stringify(),我把对象夹进了 JSON 魔法帽!
在 JavaScript 中,JSON.stringify() 是一个内置函数,用于将 JavaScript 对象转换为 JSON 字符串。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据传输和存储。本文将详细介绍 JSON.stringify() 的属性、应用场景,并提供一个完整而优雅的实现,处理循环引用、特殊类型(如日期和正则表达式)以及性能相关的问题。同时,我们还将讨论注意事项和相关引用资料。
|
安全 数据建模 网络安全
阿里云SSL证书价格多少钱一年?单域名和通配符收费明细整理
阿里云提供多样化的SSL证书服务,包括免费及付费选项。免费版由DigiCert提供,适合基本需求,有效期为3个月。付费证书品牌涵盖WoSign、DigiCert、GlobalSign等,价格从238元/年起。不同品牌与类型的证书(如DV、OV、EV)费用各异,满足各类安全需求。详情及最新价格请访问阿里云官方页面。