PHP开发过程的那些坑(四) ——PDO bindParam函数
时间:2022-05-03
本文章向大家介绍PHP开发过程的那些坑(四) ——PDO bindParam函数,主要内容包括相关阅读:、PHP开发过程的那些坑(三) ——PHParray_shift函数、PHP开发过程的那些坑(二) ——PHP empty函数、PHP开发过程的那些坑(一) ——对象拷贝、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
PHP开发过程的那些坑(四)——PDO bindParam函数
(原创内容,转载请注明来源,谢谢)
坑:
bindParam是PDOStatement的一个方法,用于在PDO操作中绑定占位符的内容,进行替换,是PDO安全性的一大保障。
通常用法如下:(摘自PHP官方文档)
<?php
/* 通过绑定的 PHP 变量执行一条预处理语句 */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
可以看到,通过bindParam方法,可以把calories和colour替换成上面的变量。这个对防止sql注入具有重要作用。
但是,最近我遇到的问题是,通常绑定的内容很多个,可以用foreach来实现,我也就写了一个方法,如下:
//绑定sql(错误的方式)
private functionbindSql($query, $arrData){
//注:arrData=array(col1=>val1,col2=>val2…)
if(empty($arrData)){
returnnull;
}else{
foreach($arrDataas $col => $val){
$col= ':'.$col;
$query->bindParam($col, $val);
}
return$query;
}
}
但是,当我调用这个方法时,发现如果arrData只有一个参数时,正常运行,但是当传入两个或者以上时,就出问题了,最后绑定的内容全部变成最后一个val了。
经过我多次和原例子比对,发现没有问题,百思不得其解,只能再次看官方文档,直到我看到了这个人的留言:(摘自PHP官方文档)
瞬间恍然大悟。需要在$val前面加一个取地址符号&。
分析:
再次认真查看官方文档,发现其对bindParam的定义如下:(摘自官方文档)
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type =PDO::PARAM_STR [, int$length [, mixed $driver_options ]]] )
注意查看第二个参数 mixed &$variable
,发现有个取地址符号。即此参数是引用绑定,在最终执行sql时才会真正被取值。
因此,单条的使用bindParam(包括连续好几行都是这个,类似官方文档)可以不用取地址符号,因为每次用不同的变量,则取不同的地址。而如果用foreach时,必须使用&符号,否则随着foreach的迭代,会被取到最后一个内容当作结果。
改进措施:
加上取地址符即可。
//绑定sql(正确的方式)
private functionbindSql($query, $arrData){
//注:arrData=array(col1=>val1,col2=>val2…)
if(empty($arrData)){
returnnull;
}else{
foreach($arrDataas $col => &$val){
$col= ':'.$col;
$query->bindParam($col, $val);
}
return$query;
}
}
——written by linhxx 2017.07.25
相关阅读:
PHP开发过程的那些坑(三) ——PHParray_shift函数
PHP开发过程的那些坑(二) ——PHP empty函数
PHP开发过程的那些坑(一) ——对象拷贝
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 2020已经过去五分之四了,你确定还不来了解一下JS的rAF?
- c#任意进制转换
- 缺失值的处理方法(基于sklearn)
- 中国核酸数据库GSA数据提交指南
- 基于sklearn建立机器学习的pipeline
- Sentinle集群流控【源码笔记】
- ggplot坐标轴方向设置
- Scaling与Normalization的区别
- Android 音乐APP(一)扫描本地音乐
- Semaphore:如何快速实现一个限流器?
- 延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?
- Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
- CompletableFuture:异步编程没那么难
- 你知道Oracle数据库除了SGA和PGA,还有MGA么?
- .NET Standard 类库的使用技巧