2016-05-31 5 views
0

Я пытаюсь передать массив в оператор SELECT * FROM table WHERE IN(). Я ожидаю 3 результата. но вместо этого я получил 2 результата.php Связать массив с IN()

Я осознаю тот же вопрос ниже в 2 сообщений

Can I bind an array to an IN() condition?

и

MySQL WHERE IN() + AND , PDO returns only one row

Однако я все еще учусь PHP PDO, таким образом, я не понимаю, код достаточно, чтобы фигуры как перепрофилировать свой код на мой код.

Надеюсь, кто-то может указать, где я ошибся. потому что я получаю частичные результаты от оператора select in. Я подозреваю, что не прошел массив в IN() правильно.

ниже PHP код моей страницы Controler

$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); 
    } 
+1

Создайте строку PDO с таким количеством заполнителей, как элементы в массиве. Привяжите каждый заполнитель соответствующим значением. – user2864740

+1

В любом случае a/«проблема» есть '' .. IN (. $ Customer_id.) "' Приводит к '.. IN (.1,2,3,4,5,6,7.)', Который недействителен SQL - '.' является буквально внутри строки. Сообщение об ошибке было бы сказано так же. – user2864740

+0

Я думаю, вы просто решили мою проблему. удалив точки. Я получил правильный результат. – codenoob

ответ

3

Вы не привязываете массив. Вы преобразовываете массив в строку, а затем привязываете эту строку. Связанные параметры могут представлять собой только единичные значения, а не списки, из-значений, так что ваш Implode/связывающийся версия функционально идентична

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 (?,?,?,....) 

с заполнителем для каждого значения, которое необходимо связать.

0

Вы можете изменить нижнюю часть переключателя заявление на что-то вроде этого, что он будет делать это определить, если у вас есть array и implode оно с разделителем ,, а затем введите свой тип по умолчанию PDO::PARAM_STR ... который он сейчас.

case is_array ($value) : 
    $value = implode(',', $value); 
default : 
    $type = PDO::PARAM_STR; 
Смежные вопросы