Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php pdo查询bindparam数组是否为字符串(或整数)?_Php_Arrays_Postgresql_Pdo - Fatal编程技术网

Php pdo查询bindparam数组是否为字符串(或整数)?

Php pdo查询bindparam数组是否为字符串(或整数)?,php,arrays,postgresql,pdo,Php,Arrays,Postgresql,Pdo,我想使用IN运算符进行pdo pgsql查询,其中值(来自变量)还包含单个id-s,以及id-s中的数组,如下所示: $result = "SELECT * FROM table WHERE table.id IN (:id)"; $query = $pgConn->prepare($result); $query->bindparam(':id', $id); $query->execute(); 更新: if ($_POST['select'] == '1') {

我想使用IN运算符进行pdo pgsql查询,其中值(来自变量)还包含单个id-s,以及id-s中的数组,如下所示:

$result = "SELECT * FROM table
WHERE table.id IN (:id)";

$query = $pgConn->prepare($result);
$query->bindparam(':id', $id);
$query->execute();
更新:

  if ($_POST['select'] == '1') {
    $id= 109;
  } elseif ($_POST['select'] == '2') {
    $id= 111;
  } elseif ($_POST['select'] == '3') {
    $id= 117;
  } elseif ($_POST['select'] == '4') {
    $id= 114;
  } elseif ($_POST['select'] == '5') {
    $id= [108, 107, 101, 103];
  } else {
    $id=NULL;
  }
查询如下所示:

$result = "SELECT * FROM table
WHERE table.id IN (:id)";

$query = $pgConn->prepare($result);
$query->bindparam(':id', $id);
$query->execute();
我尝试以多种方式将数组转换为sting,但查询总是返回相同的错误:“integer的输入语法无效”

一次尝试如下:

$ids_string = "'".implode("','", $id)."'";
返回: 整数的输入语法无效:“108”、“107”、“101”、“103”

另一个辅助问题是使用同一变量的single和array id-s,但我认为稍后使用if-else语句是可以管理的


谢谢你的帮助

根据PHP.net关于和。您可以指定要绑定的变量的类型。因此,为了避免PDO将字符串视为数字,请执行以下操作:

$query -> bindValue (':id', $id, PDO::PARAM_STR);
编辑

要解决将数组绑定到
IN()
的问题,我想您必须使用两个循环。一个用于创建占位符,另一个用于绑定参数。 以下是您案例的一个示例:

//create placeholders for IN()
foreach ($id_array as $i => $id) {
    if ($i == 0)
        $in_query = ':val_'.$i;
    else
        $in_query .= ', :val_'.$i;
}

//prepare statement with placeholders
$query = $pgConn -> prepare ("SELECT * FROM table WHERE table.id IN ($in_query)");

//bind values to placeholders
foreach ($id_array as $i => $id) {
    $query -> bindParam (":val_".$i, $id_array[$i]);
}

看一看是的,我查过这篇文章。我也尝试了一些解决方案。我可以将数组转换为sting,当我将转换后的变量直接放入查询时,它就可以工作了。但是如果我将其放入“$query->bindparam(':id',$id);”代码中,查询会将其视为一个整数值,并返回一个错误:/it不起作用。我也尝试过:$query->bindparam(':id',$id,PDO::PARAM_STR,settype($id,“string”)@阿提拉克好吧……奇怪。然后尝试
bindValue()
而不是
bindParam()
。我更新了我的回答:错误:bind消息提供了2个参数,但准备好的语句“pdo_stmt_00000001”需要3'对不起,
strlen($id)
必须删除。尚未找到解决方案。装订有问题。如果我将$id直接带到查询中,则无论数据类型如何,一切都正常。但如果我知道这是一个不安全的解决方案。。。