IN(?,?)准备语句mysqli精确值

时间:2018-01-19 16:13:46

标签: ajax mysqli prepared-statement

使用IN()子句,准备好的语句对我来说很棘手。我有一个Ajax调用语句,$ _POST是一个值数组。

我有三个值的字符串" 1,2,3和#34;我爆炸,以计算绑定子句(?)和绑定字符串(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帖子传递的值,以便将它们传递给准备好的语句。

我已经通过其他帖子试图找到使用IN()编写语句的方法,而我几乎已经得到了它,但我认为很难以提供这些值。

如果有人可以帮助我理解这种正确的价值观,那么我认为我会处于一个更好的地方:我希望这将是实现这一目标的最后障碍。我对" IN()"还有一些其他疑问。需要准备。我希望我可能不会浪费另一天试图解决这个问题。提前谢谢。

注意:只是为了澄清,我认为bind string和子句的准备工作正常。

$bindClause = implode(',', array_fill(0, count( $values ), '?'));

$bindString = str_repeat('s', count( $values  ));

2 个答案:

答案 0 :(得分:0)

您无法在mysqli预处理语句中使用IN。我发现的最简单的解决方法是使用sprintf创建一个问号字符串,在将变量绑定到查询字符串之前将其插入到查询字符串中。以下是从变量数组中获取正确数量的问号字符串的方法:

implode(",", array_fill(0, count(array(1, 2, 3)), "?"))

答案 1 :(得分:0)

虽然没有回答,但@kloddart指出我要使用图书馆。不是推荐的那个,https://github.com/colshrapnel/safemysql是我使用过的那个。它非常干净,使用说明清楚。从一些帖子研究到了解如何手动完成后我已经接近但我现在需要继续处理。也许需要考虑PDO,但我现在正在继续推进我的项目。