我一直在为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语句的有效性。