0

ここに、codeigniter を使用したサンプル クエリがあります。これを使用して、where 条件を満たすデータを取得しています。

モデル:

    function quarterly1_sales($year_date, $q1_start){
     $where = array(
     'status'   => 'purchased',
     'payment.paymentdate >=' => $q1_start,
     'payment.paymentdate <=' => 'DATE_ADD('.$q1_start.',INTERVAL 1 QUARTER)');
    return $this->db
    ->select('COUNT(payment.keyid) AS rec_count')
    ->select('product_key.client_name, product_key.contact_email, product_key.status, product_key.id, payment.paymentdate, (payment.id) as pid,payment.subscription_type')
    ->from('product_key')
    ->where($where)
    ->join('payment', 'payment.keyid=product_key.id', 'left outer')
    ->group_by('product_key.id')
    ->get()
    ->result(); 
    }

コントローラ:

if($data['filter'] == 'quarterly'){
//1st quarter of the year
    @$q1_start = date('Y-m-d', strtotime(date($year_date).'-01-01'));
$data['quarterly1_sales'] = $this->basemodel->quarterly1_sales($year_date, $q1_start);
$this->load->view('sales', $data);          
}

見る:

if($filter == 'quarterly'){
    $title = "Quarterly Sales Summary for ".$date_year;

    echo "<br /><strong>".$title."</strong></div>
        </tr>"<tr>
    <th>Name</th>
    <th>Email Address</th>
    <th>Payment Date</th>
    <th>Subtotal Amount</th>

";

    foreach ($quarterly1_sales as $quarter1) :

        echo $client_name = $quarter1->client_name;
        echo $paymentdate = $quarter1->paymentdate;
        echo $email = $quarter1->contact_email;
        echo $recount= $quarter1->rec_count;
        echo $sum_amount = $recount * 588;
    if($recount == 0){
        $display = "display:none;";
    }else{
        $display = "";
    }

endforeach;

私の問題は、データが 2012 年と 2013 年から始まっているにもかかわらず、すべてを出力しているため、結果が得られないことです。誰かがこれについて私を助けてくれることを願っています。ありがとうございました。

4

1 に答える 1

1

Codeigniter のアクティブ レコード クラスは、where()関数に渡されたすべてのものを自動的にエスケープします。このため、MySQL 関数への呼び出しDATE_ADD()は文字列として渡され、評価される代わりに MySQL によって文字どおりに処理されます。これを修正するには、where 句を別の関数呼び出しに移動し、3 番目のパラメーターを FALSE に設定して、エスケープをオフにします。

$where = array(
     'status'   => 'purchased',
     'payment.paymentdate >=' => $q1_start);
    return $this->db
    ->select('COUNT(payment.keyid) AS rec_count')
    ->select('product_key.client_name, product_key.contact_email, product_key.status, product_key.id, payment.paymentdate, (payment.id) as pid,payment.subscription_type')
    ->from('product_key')
    ->where($where)
    ->where('payment.paymentdate <=', 'DATE_ADD('.$this->db->escape($q1_start).',INTERVAL 1 QUARTER)', FALSE)
    ->join('payment', 'payment.keyid=product_key.id', 'left outer')
    ->group_by('product_key.id')
    ->get()
    ->result(); 
于 2013-09-03T03:59:04.590 に答える