php将数组绑定到IN()中

php将数组绑定到IN()中,php,mysql,Php,Mysql,我试图将数组传递到SELECT*FROM table WHERE IN()语句中。我期待3个结果。但我得到了2个结果 我在下面的两篇文章中也知道同样的问题 及 然而,我仍然在学习php pdo,因此我对代码的理解不够,无法理解如何将他们的代码重新调整到我的代码中 我希望有人能指出我哪里做错了。因为我从select in语句中获得部分结果。我怀疑我没有正确地将数组传递到IN()中 下面是我的控件页面的php代码 $customer_ids = array(1,2,3,4,5,6,7); //

我试图将数组传递到
SELECT*FROM table WHERE IN()
语句中。我期待3个结果。但我得到了2个结果

我在下面的两篇文章中也知道同样的问题

然而,我仍然在学习php pdo,因此我对代码的理解不够,无法理解如何将他们的代码重新调整到我的代码中

我希望有人能指出我哪里做错了。因为我从select in语句中获得部分结果。我怀疑我没有正确地将数组传递到IN()中

下面是我的控件页面的php代码

$customer_ids = array(1,2,3,4,5,6,7); 
//in actual case I get array from another query.

$customer_id = implode(',',$customer_ids);
//add comma to the array

$template->orders = $rephome->getOrder($customer_id);
//passing the imploded array into my Model page with class named rephome, 
//call on the method of getOrder, which is the select query
下面是我的模型页面

public function getOrder($customer_id){
$this->db->query("SELECT * FROM orders WHERE customer_id_fk IN(.$customer_id.)");
$results = $this->db->resultset();
return $results;
下面是我的数据库类中的内容

public function query($query) {
        $this->stmt = $this->dbh->prepare($query);
    }


    public function bind($param, $value, $type = null) {
        if (is_null ( $type )) {
            switch (true) {
                case is_int ( $value ) :
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool ( $value ) :
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null ( $value ) :
                    $type = PDO::PARAM_NULL;
                    break;
                default :
                    $type = PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue ( $param, $value, $type );
    }


    public function execute(){
        return $this->stmt->execute();
    }


    public function resultset(){
        $this->execute();
        return $this->stmt->fetchAll(PDO::FETCH_OBJ);
    }

您可以将switch语句的底部修改为类似这样的内容,它将做的是识别是否有
数组
使用
分隔符内爆
,然后流入默认类型的
PDO::PARAM_STR
。。。现在就是这样

case is_array ( $value ) :
    $value = implode(',', $value);
default :
    $type = PDO::PARAM_STR;

您可以将switch语句的底部修改为类似这样的内容,它将做的是识别是否有
数组
使用
分隔符内爆
,然后流入默认类型的
PDO::PARAM_STR
。。。现在就是这样

case is_array ( $value ) :
    $value = implode(',', $value);
default :
    $type = PDO::PARAM_STR;

您没有绑定数组。将数组转换为字符串,然后绑定该字符串。绑定参数只能表示单个值,不能表示值列表,因此您的内爆/绑定版本在功能上与

SELECT ... foo IN ('1,2,3')
它的执行方式与

SELECT ... foo = '1,2,3'                   
而不是

SELECT ... IN (1,2,3)
               ^-^-^--- three separate values
使用单个占位符根本不可能实现您想要的内容。您需要动态构建查询(每个值一个占位符),然后将数组传入查询调用,例如

$temp = array_fill(1, count($customer_ids), '?');
$in_arg = implode(',', $temp);
$sql = "SELECT ... IN ($in_arg)";
$stmt = $db->prepare(sql);
$res = $stmt->execute($customer_ids);
这将生成一个查询字符串,如

SELECT ... IN (?,?,?,....)

每个要绑定的值都有一个占位符。

您没有绑定数组。将数组转换为字符串,然后绑定该字符串。绑定参数只能表示单个值,不能表示值列表,因此您的内爆/绑定版本在功能上与

SELECT ... foo IN ('1,2,3')
它的执行方式与

SELECT ... foo = '1,2,3'                   
而不是

SELECT ... IN (1,2,3)
               ^-^-^--- three separate values
使用单个占位符根本不可能实现您想要的内容。您需要动态构建查询(每个值一个占位符),然后将数组传入查询调用,例如

$temp = array_fill(1, count($customer_ids), '?');
$in_arg = implode(',', $temp);
$sql = "SELECT ... IN ($in_arg)";
$stmt = $db->prepare(sql);
$res = $stmt->execute($customer_ids);
这将生成一个查询字符串,如

SELECT ... IN (?,?,?,....)

每个要绑定的值都有一个占位符。

使用与数组中的项一样多的占位符构建PDO字符串。用适当的值绑定每个占位符。在任何情况下,“问题”都是
“。在(.$customer_id.)中,
会导致
。。在(.1,2,3,4,5,6,7。)
中,这是无效的SQL-
只是字符串中的一个文本。错误消息也会这么说。我想你刚刚解决了我的问题。通过去除这些点。我得到了正确的结果。使用与数组中的项一样多的占位符构建PDO字符串。用适当的值绑定每个占位符。在任何情况下,“问题”都是
“。在(.$customer_id.)中,
会导致
。。在(.1,2,3,4,5,6,7。)
中,这是无效的SQL-
只是字符串中的一个文本。错误消息也会这么说。我想你刚刚解决了我的问题。通过去除这些点。我得到了正确的结果。