PHP PDO::bindParam() 数据类型..它是如何工作的?
我想知道 bindParam()
(或bindValue()
) 用于...
我的意思是,我认为如果我定义一个整数参数 (PDO::PARAM_INT
),则该参数必须转换为整数,类似于
$delete->bindParam(1, $kill, PDO::PARAM_INT);
// should work like
$delete->bindParam(1, (int)$kill);
或至少抛出错误如果参数不是声明的类型。 但这种情况并非如此。
谷歌搜索后,我在 php.net 存档中发现:
大家好,
我目前正在研究 PDO。 确切地 在bindParam()函数上。 第三 参数data_type似乎在这里 强制值的类型? 但 当我尝试时:
$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)"; $stmt = $dbh->准备($sql); $nom = '泰斯塔罗莎'; $marque = '法拉利' ; $stmt->BindValue(':marque',$marque) ; $stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ; $stmt->execute(); $名义 = '250 GTO' ; $stmt->execute(); ?>
我本来期望有一个 PHP 我的数据库中出现错误或整数。 但在我的数据库中我有:
22 Testarossa 法拉利 23 250 GTO 法拉利
这意味着如果我这样做它就不会改变 有没有第三个参数。 或者 也许我错过了什么。 有人可以吗 告诉我更多吗? 或者有人可以 告诉我在哪里可以找到信息 关于它。
问候,
赛勒斯
这正是我的情况。 我的想法哪里出了问题?
I'm wondering what the declaration of the data type in bindParam()
(or bindValue()
) is used for...
I mean, I thought that if I define an integer argument (PDO::PARAM_INT
), the argument must be converted to an integer, something like
$delete->bindParam(1, $kill, PDO::PARAM_INT);
// should work like
$delete->bindParam(1, (int)$kill);
or at least throw an error if the argument is not of the declared type. But this is not the case.
Googling around, I found that in the php.net archive:
Hi all,
I am currently working on PDO. Exactly
on the bindParam() function. The third
parameter data_type seems to be here
to force the type of the value ? But
when I try :$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)"; $stmt = $dbh->prepare($sql); $nom = 'Testarossa'; $marque = 'Ferrari' ; $stmt->BindValue(':marque',$marque) ; $stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ; $stmt->execute(); $nom = '250 GTO' ; $stmt->execute(); ?>
I was expecting to have either a PHP
error or an interger in my database.
But in my DB I have :22 Testarossa Ferrari 23 250 GTO
FerrariIt mean that it didn't change if I
have the third parameter or not. Or
perhaps I miss something. Can someone
tole me more ? Or just can someone
told me where I can find information
about it.Regards,
Cyruss
That is exactly my situation. Where are my thoughts going wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
它可用于确保 PDO 对内联值进行正确的转义(对于不支持正确绑定参数的驱动程序),以及通过确保数字进行适当的二进制打包(给定协议支持)来提高网络效率。
看起来在基础 PDO 中,它没有做太多事情。
因此,如果您说它是一个字符串(或者如果您什么也没说,因为这是默认值)并且您的数据类型不是 NULL,那么它会将其转换为字符串。
如果你说它是一个 int 但你绑定了一个 bool 那么它会将它转换为一个整数。
如果你说它是一个布尔值,但你绑定了一个数字,那么它会将其转换为真正的布尔值。
当模拟模式打开时,类型提示用于确定如何将其注入到 SQL 字符串中。
此外,PDO 将此信息提供给数据库驱动程序,然后数据库驱动程序可用于根据特定数据库的要求以最佳或正确的方式绑定数据。
It can be used for things like making sure PDO is doing the proper escaping for in-lining values (for drivers that don't support proper bound parameters) and improving network efficiency by making sure numbers are binary packed appropriately (given protocol support).
It looks like in base PDO, it doesn't do much.
So, if you say it is a string (or if you say nothing at all as that is the default) and your data's type is something other than a NULL then it will convert it into a string.
If you say it's an int but you bind a bool then it will convert it to an integer.
If you say it's a bool but you bind a number then it will convert it to a true boolean.
When emulation mode is turned on, the type hint is used to determine how to inject it into the SQL string.
Additionally, PDO provides this information to the database drivers, which can then be used to bind the data most optimally or correctly, depending on the particular DB's requirements.
所以我决定深入研究 PHP 源代码,这就是我发现的。
8.3.0 版本第 329 行 ext/pdo/pdo_stmt.c 中的
static int real_register_bound_param
这些是 PDO 在绑定期间进行的转换。
就是这样。 没有其他任何东西被转换。 PDO 使用 PARAM 标志来格式化 SQL,而不是转换数据类型。
So I decided to dive into the PHP source code and this is what I found.
static int really_register_bound_param
in ext/pdo/pdo_stmt.c on line 329 of version 8.3.0These are the conversions PDO does during binding.
That's it. Nothing else is converted. PDO uses the PARAM flags to format SQL not to cast data types.
PDO::PARAM_INT 对 INSERT 查询至少有一种影响:布尔值转换为 0 或 1。如
pdo_stmt.c 中所示:
There's at least one effect PDO::PARAM_INT has on INSERT queries: boolean values are converted to 0 or 1. Like in
pdo_stmt.c:
我对 BindValue 尝试了同样的操作并得到了相同的结果,因此您看到的行为不仅限于 bindParam。
I tried the same thing with BindValue and got the same result so the behavior you are seeing is not limited to bindParam.