php - PDOStatement::bindValue中第三个参数到底起了什么作用?

查看:105
本文介绍了php - PDOStatement::bindValue中第三个参数到底起了什么作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

有这样一个表:

username字段是varchar(20)。
查询是这样的:

$conn = new PDO(...);
$sql = "select * from user where username=:username";
$username=123;
$stmt=$conn->prepare($sql);
$stmt->bindValue(":username", $username, PDO::PARAM_STR);
$stmt->execute();
print_r($stmt->fetchAll());

我知道这里的$username其实写错了,应该是'123',不过因为下边又把参数指定成PDO::PARAM_STR了所以查询到了2620这条。
但是当我突发奇想把PDO::PARAM_STR 改成PDO::PARAM_INT的时候,结果却是2620、2621两条都被查询出来了。
这个结果我十分不理解,那么这个PDO::PARAM_XXX到底做了什么?求明白的帮我解释一下,谢了。
好吧,敲完这个问题之后我直接在数据库里试了下select * from user where username=123,结果也是两条都出来,那就不是PDO的问题了,但是还是不明白为什么123不加引号会有这样的结果。

解决方案

因为发生了强制类型转换. 你的username字段是字符型的, 字符和整型比较时会发生隐式转换.

select `1abc` = 1;     // 会显示1, 即true
select `abc` = 1;    //会显示0, 即false
select `abc` = 0;     //显示1

转换的规律可以参考下面的链接:
http://dev.mysql.com/doc/refm...

这篇关于php - PDOStatement::bindValue中第三个参数到底起了什么作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆