使用 IN () 子句的准备语句对我来说很棘手。我有一个 Ajax 调用声明,$_POST 是一个值数组。
我有一个由三个值“1,2,3”组成的字符串,我将其分解以对绑定子句(?)和绑定字符串(s或i)进行计数。
我正在努力让bind_params正确。当值作为字符串一次性传递时,查询不起作用。例如:
$values = "1, 2, 3";
$bindString = "sss";
$stmt->bind_param($bindString, $values);
当作为单独的值传递时它确实有效,例如:
$value1 = "1";
$value2 = "2";
$value3 = "3";
$stmt->bind_param($bindString, $value1, $value2, $value3 );
查看 var_dump(),我可以看到当每个值作为单独变量输入时显示值类型。但我不确定这是否是我无法通过一个变量传递字符串的原因。我发现这真的很难理解所需的正确格式。
由于这个查询是动态的并且会有很多不同的值,我需要它能够很好地工作并安全地准备。因此,我需要最好的方法来准备从 AJAX post 传递的值,以将它们传递到准备好的语句中。
我已经浏览了其他帖子,试图找到用 IN () 准备语句的方法,我几乎已经找到了,但我认为很多困难是基于这些值的传递。
如果有人可以帮助我理解这种正确的价值观传递,我认为我会处于一个更好的位置:我希望这将是实现这一目标的最后障碍。我还有一些其他有关“IN ()”的查询需要准备。我希望我不会再浪费一天的时间来解决这个问题。预先感谢。
注意:只是为了澄清一下,我认为绑定字符串和子句的准备工作是可以的。
$bindClause = implode(',', array_fill(0, count( $values ), '?'));
$bindString = str_repeat('s', count( $values ));
您本身不能将 IN 与 mysqli 准备好的语句一起使用。 我发现的最简单的解决方法是使用 sprintf 创建一串问号,在将变量绑定到查询字符串之前将其插入到查询字符串中。 以下是从变量数组中获取正确数量的问号字符串的方法:
implode(",", array_fill(0, count(array(1, 2, 3)), "?"))
虽然没有回答,@kloddart 已经指出我使用图书馆。不是推荐的,https://github.com/colshrapnel/safemysql是我用过的。非常干净,使用说明也很清楚。经过许多帖子的研究后,我已经接近了解如何手动执行此操作,但我现在需要继续处理事情。也许需要考虑 PDO,但我现在正在再次推进我的项目。