2016-09-10 4 views
2

У меня есть код, который отделяет , от строки, используя взрыв.Взрыв с использованием foreach внутри codeigniter модель не работает

Теперь проблема в том, что цикл foreach повторяется только один раз. Я использую этот код в codeigniter model.

Мой код,

//Model 

     $product_id = '1,2,3'; 
     $products = explode(',', $product_id); 

     foreach($products as $products_id) { 
      echo $products_id.'<br><br>'; //output: 1 
      $query = $this->db->query('SELECT * FROM tbl_products WHERE products_id = "'.$products_id.'" AND products_status = "1"'); 
      $count = $query->num_rows(); 

      if($count > 0) { 
       return $result = $query->result_array(); 
      } 
      else { 
       return 0; 
      } 
     } 

Выход для указанного выше кода 1.

Другая цифра 2 и 3 отсутствует. Я делаю что-то неправильно. Пожалуйста, помогите мне. Я не могу понять.

+0

Вы хотите получить ответный результат всего 1,2,3 –

+0

Потому что вы «возвращаетесь». Возвращает завершает текущую функцию тогда и там. –

+0

Ваша логика ошибочна '} else {return 0;}' выйдет из цикла на первой итерации. Вы возвращаетесь с более чем 0 результатами или 0 результатами. – ArtisticPhoenix

ответ

2

Чтобы исправить это, вы могли бы сделать это

$product_id = '1,2,3'; 
    $products = explode(',', $product_id); 
    $data = []; 

    foreach($products as $products_id) { 
     echo $products_id.'<br><br>'; //output: 1 
     $query = $this->db->query('SELECT * FROM tbl_products WHERE products_id = "'.$products_id.'" AND products_status = "1"'); 
     $count = $query->num_rows(); 

     if($count > 0) { 
      $data = array_merge($data, $query->result_array()); 
     } 
    } 

    if(empty($data)){ 
     return 0; 
    } 
    return $data; 

Который уклоняется, выходящий в оригинале, если заявление вы возвращаетесь на более 0 результатов или 0 результатов, поэтому в основном на первой итерации цикла.

Но, что сказал, возможно, лучший способ исправить это

$product_id = '1,2,3'; 

    $query = $this->db->query('SELECT * FROM tbl_products WHERE products_id IN(?) AND products_status = "1"',$product_id); 
    $count = $query->num_rows(); 

    if($count > 0) { 
     return $query->result_array(); 
    }else{ 
     return 0; 
    } 

Использование IN вы можете избежать foreach, explode и дополнительные вызовы запросов, а также вы должны использовать подготовленные запросы. Это должно работать с числами, но строки все равно должны быть заключены в кавычки, 'IN("string","string", "string")' или $string = '"string","string","string"'; в качестве ввода, что может усложнить ситуацию для подготовленных запросов.

+0

Теперь он возвращает '0' –

+0

просто замените' array_merge ($ data, $ query-> result_array); 'на' array_merge ($ data, $ query-> result_array()); ' –

+0

Я бы использовал IN, намного проще. – ArtisticPhoenix

1

Everthing отлично подходит для вашего кода. Если вы хотите получить все данные, тогда вы должны вернуть все в массиве. проверить код:

$product_id = '1,2,3'; 
     $products = explode(',', $product_id); 
$data = array(); 

     foreach($products as $products_id) { 
      echo $products_id.'<br><br>'; //output: 1 
      $query = $this->db->query('SELECT * FROM tbl_products WHERE products_id = "'.$products_id.'" AND products_status = "1"'); 
      $count = $query->num_rows(); 

      if($count > 0) { 
       $data[]= $query->result_array(); 
      } 
      else { 
       $data[]= 0; 
      } 
     } 
return $data; 

На $data .. Вы можете сделать какие-либо действия с $ данные, как вы хотите.

Смежные вопросы