0

データベースから抽出されたデータを取得し、それが販売アイテムであるかどうかを確認し、販売アイテムである場合は販売プロパティを追加する関数が codeigniter にあります。データを抽出する 2 つの同一の関数があります。1 つは最初の 20 の結果用で、次の 20 の結果を ajax 経由でロードします。

最初の 20 個の結果を抽出する関数は、sales コンバーターを正常に実行しますが、次の 20 個の結果を抽出する関数は、次のエラー メッセージを返します。

PHP エラーが発生しました

重大度: 警告

メッセージ: foreach() に無効な引数が指定されました

ファイル名: models/products_model.php

ライン番号: 15

以下は sales コンバーター関数です (15 行目にエラーが発生しています)。

private function checkSalesProducts($query)
{
    
    $i=0;
    //print_r($query);
    if (sizeof($query) > 0) {
        echo "<script type=\"text/javascript\">alert('".print_r($query)."');</script>";
        foreach($query as $row)  //LINE 15
        {
        
            $row->sale = 0;
            ++$i;
        
        }
    
    }
    
    $this->db->select("sale_product, sale_discount");
    $salesItems = $this->db->get("sale_items");
    
    foreach($salesItems->result() as $salesItem)
    {
        
        for($i=0; $i<sizeof($query); ++$i)
        {
            
            if($salesItem->sale_product == $query[$i]->prod_id)
            {
            
                $query[$i]->prod_price = $query[$i]->prod_price * (1 - $salesItem->sale_discount);
                $query[$i]->sale = true;
                $query[$i]->sale_discount = $salesItem->sale_discount;
                break;
            
            }               
        
        }
    
    }
    
    return $query;
    
}

最初の 20 を抽出する関数は次のとおりです。

public function searchProducts($searchText)
{

    $this->db->select("prod_id");
    $this->db->where("MATCH (`prod_title`, `prod_desc`) AGAINST ('{$searchText}' IN BOOLEAN MODE)", "", false);
    $this->db->or_where("prod_id LIKE '%{$searchText}%'");
    $this->db->or_where("prod_sku LIKE '%{$searchText}%'");
    $this->db->or_where("prod_title LIKE '%{$searchText}%'");
    $this->db->or_where("prod_desc LIKE '%{$searchText}%'");
    
    $query = $this->db->get("product_search", 20);
    
    if($query->num_rows() == 0) return null;
    
    foreach($query->result() as $row)
    {
    
        $this->db->or_where("prod_id", $row->prod_id);
    
    }
    
    $query = $this->db->get("products");
    
    return $this->checkSalesProducts($query->result());
}

次の 20 を返す関数は次のとおりです。

public function loadMoreSearchProducts($searchText, $id)
{

    $this->db->select("prod_id");
    $this->db->where("(MATCH (`prod_title`, `prod_desc`) AGAINST ('{$searchText}' IN BOOLEAN MODE) OR prod_id LIKE '%{$searchText}%' OR prod_sku LIKE '%{$searchText}%' OR prod_title LIKE '%{$searchText}%' OR prod_desc LIKE '%{$searchText}%') AND `prod_id` < {$id}", "", false);
    $this->db->order_by("prod_id", "desc");
    
    $query = $this->db->get("product_search", 20);
    
    if($query->num_rows() == 0) return null;
    
    foreach($query->result() as $row)
    {
    
        $this->db->or_where("prod_id", $row->prod_id);
    
    }
    
    $query = $this->db->get("products");
    
    return $this->checkSalesProducts($query->result());
    
    /*$this->db->select("prod_id, prod_sku, prod_title, prod_desc, prod_price, prod_main_image");
    $this->db->where("(prod_sku LIKE '%{$searchText}%' OR prod_title LIKE '%{$searchText}%' OR prod_desc LIKE '%{$searchText}%') AND `prod_id` < {$id}");
    $this->db->order_by("prod_id", "desc");
    $query = $this->db->get("products", 20);
    
    return $this->checkSalesProducts($query->result());*/

}

エラーの原因となっている配列の最初の 3 つの結果の例を次に示します。

Array
(
[0] => stdClass Object
    (
        [prod_id] => 5
        [prod_sku] => HY-FLY
        [prod_cat] => 68
        [prod_title] => Hy Guardian Fly Rug
        [prod_desc] => <p><font color="#ff0000" size="4">Our best selling Combo neck fly rug,</font><font color="#6e5d3f" size="2"> made from polyester silver close weave mesh giving maximum protection against all flying insects.</font></p>
        [prod_price] => 47.00
        [prod_weight] => 3000
        [prod_main_image] => Hydrophane-Guardian-fly-rug.jpg
        [prod_deliverable] => 1
    )

[1] => stdClass Object
    (
        [prod_id] => 6
        [prod_sku] => CITRONE
        [prod_cat] => 14
        [prod_title] => NAF Off Citronella Tags
        [prod_desc] => BRAND NEW TO THE MARKET FOR SUMMER 2012 - /NAF OFF Citronella Tags.
        [prod_price] => 9.10
        [prod_weight] => 200
        [prod_main_image] => NAF-Citronella-Tags.jpg
        [prod_deliverable] => 1
    )

[2] => stdClass Object
    (
        [prod_id] => 7
        [prod_sku] => FLARE-T
        [prod_cat] => 37
        [prod_title] => Liveryman Flare Trimmer 
        [prod_desc] => <p><font color="#6e5d3f" size="2">Very Quiet, Petit and Light Trimmer.</font></p>
        [prod_price] => 20.00
        [prod_weight] => 750
        [prod_main_image] => Liveryman-Flare-Trimmers.jpg
        [prod_deliverable] => 1
    )
)
4

2 に答える 2

1

これを試して...

if(is_array($query))
{
    foreach($query as $row)  //LINE 15
    {
        $row->sale = 0;
        ++$i;
    }
}
于 2012-08-07T11:38:45.363 に答える
0

$query配列または反復可能なオブジェクトではありません。の結果はvar_dump($query)

于 2012-08-07T11:41:51.537 に答える