2010-10-05 4 views
1

cela me prend trop de temps pour comprendre. J'utilise Codeigniter pour interroger une base de données. Le modèle fait ceCodeigniter Count/Si

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

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

Le contrôleur

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

La vue

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

fonctionne très bien SAUF SI aucune ligne sont renvoyés

puis

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

Comment puis-je gérer l'if ... else ... scénario

J'ai essayé this Q-A, mais ne fonctionne pas pour moi. PlsHlp.

Répondre

0

Il suffit de faire:

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

Vous obtenez une erreur, car foreach attend son premier argument est un tableau. S'il n'y a aucun élément dans la base de données, vos fonctions retournent false.

+0

Merci. Ça marche. –

+0

ah homme. J'ai écrit le code pour vous si :( – Pavan

0

En effet, lorsque vous exécutez votre code:

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

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

quand il n'y a pas de lignes retournées le code ci-dessus fonctionne très bien, il ne marche pas dans le travail que le point de vue où vous essayez d'exécuter une boucle. Cette boucle for ne doit pas être exécutée si aucune ligne n'est renvoyée. Pourtant, vous essayez d'exécuter un forloop même s'il n'y a pas de lignes à travailler avec.

Ma suggestion est en train de changer le code comme ceci:

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

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

dans la vue que vous aurez quelque chose comme ça avant votre boucle:

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

} 

Hope this helps.

PK

+0

Oui, mais il est bon de savoir des solutions de rechange.Merci –

+0

ne vous inquiétez pas.Vous avez là avant moi.Nous avons tous les deux eu le même condept à l'esprit.C'est que vous ne pouvez pas exécuter le forloop sans vérifier d'abord s'il y a des lignes avec lesquelles travailler. GrRr la prochaine fois j'y arriverai avant vous: P gentil – Pavan

0

Pourquoi ne pas vous faire ceci:

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

Dans la vue, s'il n'y a pas de résultats, un tableau vide sera retourné et foreach ne jetterai pas un erreur:

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

Beaucoup plus propre IMO.

Si vous souhaitez afficher un message d'erreur dans votre vue, vous pouvez le faire:

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

Cela vaut mieux que de vérifier s'il y a des résultats avec if/else deux fois, comme Halfdan et Pavan suggérez .

+0

Salut, une requête cependant .Le if..else .. n'est pas la meilleure logique au contrôleur Dans un modèle MVC, mais je ne suis pas sûr de ce que les vrais avantages seraient –

+0

À mon avis, il n'y a rien de mal à utiliser if/else ou foreach itérations dans la vue Dans la vue, j'aime utiliser une syntaxe alternative pour les structures de contrôle (http : //php.net/manual/fr/control-structures.alternative-syntax.php) Si vous ne voulez pas afficher un message d'erreur, vous n'avez même pas besoin d'if/else! – Mischa