2010-10-05 2 views
1

Это заставляет меня слишком долго разбираться. Я использую Codeigniter для запроса базы данных. Модель делает этоCodeigniter Count/If

function currentfunction($id) 
{ 
    $query = $this->db->get_where('mytable', array("id =" => $id)); 

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

Контроллер

$this->load->model('Display'); 
$results = $this->Display->currentfunction($id); 
$this->load->view('current_items', array('currentitems' => $results)); 

Точка зрения

foreach($currentitems as $row){ 
       echo $row['name'] 
       ///....do more 
       } 

работает нормально за исключением, если строки не возвращаются

затем

Message: Invalid argument supplied for foreach()... 

Как обрабатывать если ... то ... сценарий

Я попытался this Q-A, но не работает для меня. PlsHlp.

ответ

0

Вобще:

if(is_array($currentitems)) { 
    foreach($currentitems as $row){ 
       echo $row['name'] 
       ///....do more 
    } 
} 
else 
{ 
    echo "No items in database!"; 
} 

Вы получаете сообщение об ошибке, потому что Еогеасп ожидает, что ее первый аргумент представляет собой массив. Если в базе данных нет элементов, но ваши функции возвращают false.

+0

Спасибо. Оно работает. –

+0

ах человек. Я написал код для вас, хотя :( – Pavan

0

Это происходит потому, что при запуске кода:

$query = $this->db->get_where('mytable', array("id =" => $id)); 

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

когда есть строки не вернулся приведенный выше код работает отлично он просто не работает в окне, где вы пытаетесь запустить цикл. Этот цикл цикла не должен запускаться, если нет возвращенных строк. но вы пытаетесь запустить forloop, хотя нет строк для работы.

Мое предложение изменить код следующим образом:

$ запроса = $ this-> db-> get_where ('MyTable', массив ("ID =" => $ ID));

if($query->num_rows() > 0){ 
    return $query->result_array(); 
}else { 
    $noResults = true; 
} 

в представлении вы будете иметь что-то вроде этого, прежде чем ваш цикла:

if($noResults != true){ 
    foreach($currentitems as $row){ 
     echo $row['name'] 
     ///....do more 
    } 
} 
else{ 
    //do something 
    echo "No items in database!"; 

} 

Надеется, что это помогает.

PK

+0

Да, но хорошо знать альтернативные решения. Спасибо. –

+0

Не беспокойтесь, вы добрались туда передо мной. У нас обоих была такая же уверенность в том, что вы не можете запустить затвор не проверяя сначала, есть ли какие-либо строки, с которыми нужно работать. GrRr в следующий раз я доберусь до вас: P nice one – Pavan

0

Почему вы не просто делать это:

function currentfunction($id) 
{ 
    return $this->db->get_where('mytable', array("id =" => $id)); 
} 

В представлении, если нет результатов, пустой массив будет возвращен и foreach не будет бросаться ошибка:

foreach($currentitems->result_array() as $row) 
{ 
    echo $row['name'] 
    ///....do more 
} 

Много более чистый ИМО.

Если вы хотите, чтобы показать сообщение об ошибке в вашей точке зрения, вы можете сделать:

if($currentitems->num_rows() > 0) 
{ 
    foreach($currentitems->result_array() as $row) 
    { 
     echo $row['name'] 
     ///....do more 
    } 
} 
else 
{ 
    // Error message 
} 

Это лучше, чем проверка, есть ли результаты с, если/еще дважды, как Хальвдан и Паван предлагает ,

+0

Привет, один запрос. Не правда ли, если ... хорошая логика лучше всего оставлена ​​для контроллера в MVC-модели? Но я не уверен, каковы будут реальные преимущества. –

+0

По-моему, нет ничего плохого в использовании итераций if/else или foreach в представлении. В представлении мне нравится использовать альтернативный синтаксис для структур управления (http : //php.net/manual/en/control-structures.alternative-syntax.php), чтобы очистить просмотр. Если вы не хотите показывать сообщение об ошибке, вам даже не нужно, если/else! – Mischa