我想知道bindParam()(或bindValue())中数据类型的声明用于…
bindParam()
bindValue()
我的意思是,我认为如果定义整数参数(PDO::PARAM_INT),则必须将参数转换为整数,例如
PDO::PARAM_INT
$delete->bindParam(1, $kill, PDO::PARAM_INT); // should work like $delete->bindParam(1, (int)$kill);
或如果参数不是声明的类型,则至少引发错误。但这种情况并非如此。
到处搜寻,我在php.net档案库中发现:
大家好, 我目前正在研究PDO。正是在bindParam()函数上。第三个参数data_type似乎在这里强制值的类型?但是当我尝试:
大家好,
我目前正在研究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 Testarossa法拉利23250 GTO法拉利 这意味着如果我没有第三个参数,它不会改变。也许我想念一些东西。有人可以给我更多吗?或者有人可以告诉我在哪里可以找到有关它的信息。 问候,
我期望数据库中有PHP错误或整数。但是在我的数据库中,我有:
22 Testarossa法拉利23250 GTO法拉利
这意味着如果我没有第三个参数,它不会改变。也许我想念一些东西。有人可以给我更多吗?或者有人可以告诉我在哪里可以找到有关它的信息。
问候,
那正是我的情况。我的想法哪里出问题了?
在其他语言的其他数据库抽象框架中,它可用于确保诸如对内联值进行正确的转义(对于不支持正确绑定参数的驱动程序)以及通过确保数字是否正确来提高网络效率。适当打包二进制文件(提供协议支持)。看起来像在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(或者您什么也不说,因为这是默认值),并且您的数据的内部类型是double,那么它将使用一种方法将其转换为字符串,如果不是double,则它将会使用其他方法将其转换为字符串。
如果您说这是一个整数,但实际上是布尔值,那么它将把它转换为long。
如果您说的是布尔值,但实际上是一个数字,那么它将把它转换为真正的布尔值。
我实际上是(快速地)查看了stmt源代码,我想一旦将参数传递到驱动程序中,它们就可以做更多的事情。因此,我想您所获得的只是一点点正确的做,以及驾驶员之间很多行为的歧义和差异。