PHP开发过程的那些坑(四) ——PDO bindParam函数

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开发过程的那些坑(一) ——对象拷贝

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

WCF的安全审核——记录谁在敲打你的门

WCF所谓的安全审核就是针对认证和授权所做的针对EventLog的日志记录。我们不但可以设置进行审核的事件(认证成功/失败,授权成功或失败),还可以选择记录信息...

2248
来自专栏java一日一条

40+个对初学者非常有用的PHP技巧(一)

今天我们要介绍一些关于改善和优化PHP代码的提示和技巧。请注意,这些PHP技巧适用于初学者,而不是那些已经在使用MVC框架的人。

683
来自专栏企鹅号快讯

快速教程:使用Cython来扩展Python/NumPy库

北京 | 深度学习与人工智能研修 12月23-24日 ? 再设经典课程 重温深度学习 正文共2583个字,7张图,预计阅读时间:7分钟。 前言 整个快速教程直接...

2039
来自专栏自然语言处理

数据分析:基于Python的自定义文件格式转换系统

无论读者现在是做数据挖掘、数据分析、自然语言处理、智能对话系统、商品推荐系统等等,都不可避免的涉及语料的问题即大数据。数据来源无非分为结构化数据、...

1162
来自专栏程序你好

.Net面试题:.Net中程序集assembly是什么?

952
来自专栏FreeBuf

用Mitmproxy辅助Sqlmap自动化利用特殊漏洞

本文主要介绍利用 mitmproxy 脚本辅助 sqlmap,自动化利用漏洞的方法。由于笔者毫无学习更多姿势的上进心,又在处理数据库注入漏洞方面才学浅薄,因此当...

2958
来自专栏漏斗社区

大数据搜索引擎之elasticsearch使用篇(一)

在上一篇文章《大数据搜索分析引擎elasticsearch(安装篇)》中,斗哥介绍了elasticsearch的基本安装过程,本期,我们将着重介绍elastic...

1144
来自专栏自然语言处理

数据分析:基于Python的自定义文件格式转换系统

       无论读者现在是做数据挖掘、数据分析、自然语言处理、智能对话系统、商品推荐系统等等,都不可避免的涉及语料的问题即大数据。数据来源无非分为结构化数据、...

1365
来自专栏FreeBuf

使用Python检测并绕过Web应用程序防火墙

Web应用防火墙通常会被部署在Web客户端与Web服务器之间,以过滤来自服务器的恶意流量。而作为一名渗透测试人员,想要更好的突破目标系统,就必须要了解目标系统的...

3705
来自专栏苍云横渡学习笔记

【第二部分-django博客从搭建到部署】一个完整Django入门指南

【学习目录】 【第一部分-django博客从搭建到部署】一个完整的Django入门指南学习笔记 【第二部分-django博客从搭建到部署】一个完整的Django...

3885

扫码关注云+社区