2 votes

Explose en utilisant foreach à l'intérieur du modèle codeigniter ne fonctionne pas

J'ai un code qui sépare , de la chaîne en utilisant explode.

Maintenant le problème est la boucle foreach ne s'itérant qu'une seule fois. J'utilise ce code dans codeigniter model.

Mon code est,

//Model

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

        foreach($products as $products_id) {
            echo $products_id.''; //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;
            }
        }

La sortie pour le code ci-dessus est 1.

L'autre chiffre 2 et 3 manque. Est-ce que je fais quelque chose de mal. S'il vous plaît aidez-moi. Je ne peux pas le comprendre.

2voto

ArtisiticPhoenix Points 1091

Pour le corriger, vous pourriez faire ceci

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

    foreach($products as $products_id) {
        echo $products_id.''; //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;

Ce qui évite de sortir dans l'instruction originale si vous retournez sur plus de 0 résultats ou 0 résultats, donc essentiellement lors de la première itération de la boucle.

Mais, cela dit, peut-être une meilleure façon de le réparer est la suivante

  $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;
  } 

En utilisant IN, vous pouvez éviter le foreach, explode et les appels de requête supplémentaires, vous devriez également utiliser des requêtes préparées. Cela devrait fonctionner avec des nombres, mais les chaînes doivent toujours être enveloppées dans des guillemets, 'IN( "chaîne","chaîne", "chaîne" )' ou $string = '"chaîne","chaîne","chaîne"'; en tant qu'entrée, ce qui peut compliquer les choses pour les requêtes préparées.

1voto

Kumar Rakesh Points 2270

Tout est bien dans votre code. Si vous voulez obtenir toutes les données, alors vous devriez les retourner toutes dans un tableau. Vérifiez le code :

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

        foreach($products as $products_id) {
            echo $products_id.''; //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;  

Sur $data ... Vous pouvez effectuer n'importe quelle action avec $data comme vous le souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X