千家信息网

如何理解PHP PDOStatement:bindParam插入数据错误问题

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"如何理解PHP PDOStatement:bindParam插入数据错误问题",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解PHP
千家信息网最后更新 2025年01月19日如何理解PHP PDOStatement:bindParam插入数据错误问题

本篇内容主要讲解"如何理解PHP PDOStatement:bindParam插入数据错误问题",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解PHP PDOStatement:bindParam插入数据错误问题"吧!

废话不多说, 直接看代码:

复制代码 代码如下:

$dbh = new PDO('mysql:host=localhost;dbname=test', "test");

$query = <<INSERT INTO `user` (`username`, `password`) VALUES (:username, :password);
QUERY;
$statement = $dbh->prepare($query);

$bind_params = array(':username' => "laruence", ':password' => "weibo");
foreach( $bind_params as $key => $value ){
$statement->bindParam($key, $value);
}
$statement->execute();


请问, 最终执行的SQL语句是什么, 上面的代码是否有什么问题?
Okey, 我想大部分同学会认为, 最终执行的SQL是:
INSERT INTO `user` (`username`, `password`) VALUES ("laruence", "weibo");
但是, 可惜的是, 你错了, 最终执行的SQL是:
INSERT INTO `user` (`username`, `password`) VALUES ("weibo", "weibo");
是不是很大的一个坑呢?
这个问题, 来自今天的一个Bug报告: #63281
究其原因, 也就是bindParam和bindValue的不同之处, bindParam要求第二个参数是一个引用变量(reference).
让我们把上面的代码的foreach拆开, 也就是这个foreach:

复制代码 代码如下:

foreach( $bind_params as $key => $value ){
$statement->bindParam($key, $value);
}


相当于:

复制代码 代码如下:

//第一次循环
$value = $bind_params[":username"];
$statement->bindParam(":username", &$value); //此时, :username是对$value变量的引用

//第二次循环
$value = $bind_params[":password"]; //oops! $value被覆盖成了:password的值
$statement->bindParam(":password", &$value);


所以, 在使用bindParam的时候, 尤其要注意和foreach联合使用的这个陷阱. 那么正确的作法呢?
1. 不要使用foreach, 而是手动赋值

复制代码 代码如下:

$statement->bindParam(":username", $bind_params[":username"]); //$value是引用变量了
$statement->bindParam(":password", $bind_params[":password"]);


2. 使用bindValue代替bindParam, 或者直接在execute中传递整个参数数组.
3. 使用foreach和reference(不推荐)

复制代码 代码如下:

foreach( $bind_params as $key => &$value ) { //注意这里
$statement->bindParam($key, $value);
}


最后, 展开了说, 对于要求参数是引用, 并且有滞后处理的函数, 都要在使用foreach的时候, 谨慎!

到此,相信大家对"如何理解PHP PDOStatement:bindParam插入数据错误问题"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

代码 问题 数据 错误 参数 变量 也就是 内容 时候 面的 学习 循环 不同 实用 很大 更深 作法 兴趣 函数 原因 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 优质深度学习服务器 数据库视图一直重新编译 软件开发与算法工程师的区别 大一数据库技术考试题库 数据库修改字段名的语法格式 学校的网络安全性是什么名字 迪士尼头像软件开发 疫情下的网络安全变化 英语四六级注册显示服务器繁忙 简单软件开发计划书 停电期间网络安全注意事项 提高网络安全性的措施有什么 中国网络安全部长 导入备份数据库后怎么查询 斯蒂芬库里数据库 数据库提示未更新任何行为什么 浪潮GPU服务器技术培训标准 数据库添加不成功id不连续 组态王查询SQL数据库 用友软件开发好吗 湖南常规软件开发定制服务价格 网络安全3分钟小剧本 发改委信息化项目网络安全预算 svn服务器目录结构 番宁网络技术工作室 数据库工程师和服务器运维开发 网络技术能考研吗 数据库管理设计机票预订系统 数据库系统分析师考试好考吗 企业无线网络安全 ppt
0