mysqli_stmt::bind_param中$types参数的重要性


the importance of the $types parameter in mysqli_stmt::bind_param

我一直在为mysqli准备好的语句测试包装器,并且遇到了一些我没有预料到的事情。在我的表guests中,first_name是一个varchar[32](基本上是一个字符串),id是一个整数。我的函数在下面的示例中对参数(如$first_name和$id)使用getType来为bind_param方法构建$types参数。我已经准备好解决这样的问题,当$id从表单输入中取出,实际上是一个字符串,或者,如果有人输入一个字符串,是一个数字,会发生什么,当我意识到这并不重要0_0

$SQL = 'update guests set first_name = ? where id = ?';
$mysqli->execute($SQL, $first_name, $id);

以下所有情况都导致插入成功:

$id = "1";$first_name = "Frank";

$id = 1;$first_name = 3;$types param was 'ii';

这是怎么回事?

编辑:

call_user_func_array(array($statement, 'bind_param'), $bind_params);

你认为我调用bind_param的方式是一个因素?无论如何,我很想知道为什么。

$types参数影响生成的SQL,因此第一个示例给出以下SQL:

update guests set first_name = 'Frank' where id = '1';

和第二个:

update guests set first_name = 3 where id = 1;

这两个都是有效的SQL语句,因为MySQL为您处理类型转换。因此,$types参数很重要,但仅限于它生成的SQL语句的有效性。