我想知道数据类型的声明是什么bindParam() http://php.net/manual/en/pdostatement.bindparam.php (or bindValue() http://php.net/manual/en/pdostatement.bindvalue.php) 是用来...
我的意思是,我想如果我定义一个整数参数(PDO::PARAM_INT
),参数必须转换为整数,例如
$delete->bindParam(1, $kill, PDO::PARAM_INT);
// should work like
$delete->bindParam(1, (int)$kill);
或者如果参数不是声明的类型,至少会抛出错误。但这种情况并非如此。
谷歌搜索后,我在 php.net 存档中发现:
Hi all,
我目前正在研究 PDO。确切地
在bindParam()函数上。第三
参数data_type似乎在这里
强制值的类型?但
当我尝试时:
$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(); ?>
我预计数据库中会出现 PHP 错误或整数。但在我的数据库中我有:
22 泰斯塔罗萨法拉利 23 250 GTO
法拉利
这意味着如果我这样做它就不会改变
有没有第三个参数。或者
也许我错过了什么。有人可以吗
告诉我更多吗?或者有人可以
告诉我在哪里可以找到信息
关于它。
Regards,
Cyruss
这正是我的情况。我的想法哪里出了问题?
在其他语言的其他数据库抽象框架中,它可用于确保对内联值进行正确的转义(对于不支持正确绑定参数的驱动程序)以及通过确保数字是正确的来提高网络效率。适当的二进制打包(给定协议支持)。看起来在PDO中,它没有做太多事情。
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
char *p;
int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
ZVAL_STRINGL(param->parameter, p, len, 0);
} else {
convert_to_string(param->parameter);
}
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
convert_to_long(param->parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
convert_to_boolean(param->parameter);
}
因此,如果你说它是一个 STR (或者如果你什么也没说,因为这是默认的)并且你的数据的内部类型是双精度型,那么它会使用一种方法将其转换为字符串,如果它不是双精度型,那么它将使用不同的方法将其转换为字符串。
如果你说它是一个 int 但它实际上是一个 bool 那么它会将其转换为 long。
如果你说它是一个布尔值,但它实际上是一个数字,那么它会将其转换为真正的布尔值。
这确实是我(快速)查看 stmt 源代码所看到的一切,我想一旦您将参数传递到驱动程序中,它们就可以发挥额外的作用。所以,我猜你得到的只是一点点做正确的事,以及司机之间的大量行为模糊和差异。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)