MySQL:在一个查询中一起使用名称NOT IN($ array)和age IN($ array)选择

时间:2018-06-26 09:53:36

标签: php mysql

我有一个使用php的mysql select查询语句,

"timestamp": "2015-01-02T09:00:00+00"

我尝试过:

"timestamp":"2018-06-25T15:25:35+00"
"timestamp":"2018-06-25T15:25:35z"
"timestamp":"2018-06-25 15:25:35"

错误输出

  

致命错误:未捕获的PDOException:SQLSTATE [HY093]:无效的参数   number:绑定变量的数量与中的令牌数量不匹配

$rrt = implode(',',array_fill(0,count($ees),'?'));
$rrr = implode(',',array_fill(0,count($array),'?'));



$select = $con ->prepare("SELECT name from table WHERE name NOT IN ($array) AND ageNOT IN ($rrt) GROUP BY name ");

错误输出

  

致命错误:未捕获的PDOException:SQLSTATE [HY093]:无效的参数   number:绑定变量的数量与中的令牌数量不匹配

$select = $con ->prepare("SELECT name from table WHERE name NOT IN ($rrr) AND age NOT IN ($rrt) GROUP BY name ");
$select->($array);

这个给出了一些结果,但是没有我想要的; 我想使用这样的查询:

$select = $con ->prepare("SELECT name from table WHERE name NOT IN ($array) AND age NOT IN ($rrt) GROUP BY name ");
$select -> bindParam(1,$array);
$select -> bindParam(2,$ees);
$select -> execute();

但是我不想得到参数绑定错误的数量,请帮忙!预先感谢。

2 个答案:

答案 0 :(得分:1)

这应该有效:

$rrr = implode(',',array_fill(0,count($array),'?'));
$rrt = implode(',',array_fill(0,count($ees),'?'));

$select = $con ->prepare("SELECT name from table WHERE name NOT IN ($rrr) AND age NOT IN ($rrt) GROUP BY name ");
$index = 1;
foreach($array as $key => $value) {
    $select -> bindParam($index++,$array[$key]);
}
foreach($ees as $key => $value) {
    $select -> bindParam($index++,$ees[$key]);
}
$select -> execute();

请注意bindParam需要变量引用。

答案 1 :(得分:0)

假设您正在使用PDO,只有两种方法可以将值传递给参数化查询:

  • 具有bindParam()
  • 通过将参数数组传递给execute()

在前一种情况下,您可以根据问号的位置(对于?样式参数)进行绑定,也可以根据参数的名称(对于命名参数)进行绑定

在任何一种情况下,您只能将一个变量绑定到一个参数。您不能使用bindParam绑定整个数组(尽管您可以绑定数组中的单个条目)。

要将数组传递到execute,它必须是索引数组,且条目数与问号相同(用于?样式),或者它必须是键与命名占位符匹配的数组(对于命名参数)样式)。同样,每个占位符只能绑定一个条目。

您似乎想做的是将两个数组绑定到同一查询。你不能那样做。您确实有选择。

  • 循环遍历每个数组和bindparam()
  • 使用要传递的所有参数构建单个数组(请注意,数组中的位置与您要在查询中绑定的问号的位置相对应!)并将其传递给execute()< / li>