繁体   English   中英

如何修复Codeigniter项目中的错误?

[英]How to fix the error in codeigniter project?

我在codeigniter框架中的错误消息:发生数据库错误

Error Number: 1140

In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'hms.rooms.id'; this is incompatible with sql_mode=only_full_group_by

SELECT `rooms`.*, count(room_no) as total_rooms FROM `rooms` WHERE `room_type_id` = '10'

Filename: D:/Installed_Apps/OpenServer/OpenServer/domains/hms.loc/system/database/DB_driver.php

Line Number: 691

为什么会出现这种错误以及如何消除它? 代码中可能存在什么问题?

在这些功能中,什么地方有问题或一切正常?

函数check_availability($ check_in,$ check_out,$ adults,$ kids,$ room_type_id){$ query ='?date_from ='。$ check_in。'&date_to ='。$ check_out。'&adults ='。$ adults。'&kids = '。$ kids。'&room_type ='; $ CI =&get_instance(); if($ check_in == $ check_out){$ check_out = date('Ym-d',strtotime($ check_out。'+ 1 day'));; }

                                            $CI->db->where('id',1);
                    $settings   =   $CI->db->get('settings')->row_array();

                                        $CI->db->where('id',$room_type_id);
                                        $CI->db->select('room_types.*,base_price as price');
                    $room_type  =   $CI->db->get('room_types')->row_array();
                    //echo '<pre>'; print_r($room_type);die;

                                        $CI->db->where('room_type_id',$room_type_id);
                                        $CI->db->select('rooms.*,count(room_no) as total_rooms');
                    $rooms      =   $CI->db->get('rooms')->row_array();
                    $total_rooms    =   $rooms['total_rooms'];
                    //echo '<pre>'; print_r($rooms);die;
                    $begin = new DateTime($check_in);
                    $end = new DateTime($check_out);

                    $interval = DateInterval::createFromDateString('1 day');
                    $period = new DatePeriod($begin, $interval, $end);

                    foreach($period as $dt){
                        $date       =    $dt->format( "Y-m-d" );    
                        $dayno      =    $dt->format( "N" );
                        $day        =    $dt->format( "D" );
                        $day        =   strtolower($day);
                        ///echo $date;die;          
                        //check for room block period

                        if($date >= $settings['room_block_start_date'] && $date <=$settings['room_block_end_date'])
                        {
                            $block_message  =   "Sorry.. No Room Available Between ".date('d/m/Y',strtotime($settings['room_block_start_date']))." to ".date('d/m/Y',strtotime($settings['room_block_end_date']))."  ";
                            $CI->session->set_flashdata('error', $block_message);
                            redirect('');

                        }
                                        $CI->db->where('O.room_type_id',$room_type_id);
                                        $CI->db->where('R.date',$date);
                                        $CI->db->select('R.*,');
                                        $CI->db->join('orders O', 'O.id = R.order_id', 'LEFT');
                        $orders     =   $CI->db->get('rel_orders_prices R')->result_array();
                        //echo '<pre>'; print_r($orders);die;
                        //echo $total_rooms;die; 
                        if($total_rooms > 0){
                            //echo count($orders);die;
                            if(count($orders) >= $total_rooms){
                                $CI->session->unset_userdata('booking_data');
                                $CI->session->unset_userdata('coupon_data');
                                $CI->session->set_flashdata('error', "Sorry.. This Dates Between Rooms Not Available Please Try With Another Date Or Room");
                                redirect('front/book/index'.$query);
                            }else{
                                continue;   // continue loop
                            }
                        }else{
                                $CI->session->unset_userdata('booking_data');
                                $CI->session->unset_userdata('coupon_data');
                                $CI->session->set_flashdata('error', "Sorry.. This Dates Between Rooms Not Available Please Try With Another Date Or Room");
                                redirect('front/book/index'.$query);
                        }
                    }

    return;
}

function check_availability_ajax($check_in,$check_out,$adults,$kids,$room_type_id){
                $query      =   '?date_from='.$check_in.'&date_to='.$check_out.'&adults='.$adults.'&kids='.$kids.'&room_type='; 
                $CI =& get_instance();
                if($check_in==$check_out){
                    $check_out  =   date('Y-m-d', strtotime($check_out.'+ 1 day'));
                }
                                        $CI->db->where('id',1);
                    $settings   =   $CI->db->get('settings')->row_array();

                                        $CI->db->where('id',$room_type_id);
                                        $CI->db->select('room_types.*,base_price as price');
                    $room_type  =   $CI->db->get('room_types')->row_array();
                    //echo '<pre>'; print_r($room_type);die;

                                        $CI->db->where('room_type_id',$room_type_id);
                                        $CI->db->select('rooms.*,count(room_no) as total_rooms');
                    $rooms      =   $CI->db->get('rooms')->row_array();
                    $total_rooms    =   $rooms['total_rooms'];
                    //echo '<pre>'; print_r($rooms);die;
                    $begin = new DateTime($check_in);
                    $end = new DateTime($check_out);

                    $interval = DateInterval::createFromDateString('1 day');
                    $period = new DatePeriod($begin, $interval, $end);

                    foreach($period as $dt){
                        $date       =    $dt->format( "Y-m-d" );    
                        $dayno      =    $dt->format( "N" );
                        $day        =    $dt->format( "D" );
                        $day        =   strtolower($day);

                        if($date >= $settings['room_block_start_date'] && $date <=$settings['room_block_end_date'])
                        {
                            $block_message  =   "Sorry.. No Room Available Between ".date('d/m/Y',strtotime($settings['room_block_start_date']))." to ".date('d/m/Y',strtotime($settings['room_block_end_date']))."  ";
                            return $block_message;


                        }

                                        $CI->db->where('O.room_type_id',$room_type_id);
                                        $CI->db->where('R.date',$date);
                                        $CI->db->select('R.*,');
                                        $CI->db->join('orders O', 'O.id = R.order_id', 'LEFT');
                    $orders     =   $CI->db->get('rel_orders_prices R')->result_array();
                        //echo $total_rooms;die; 
                        if($total_rooms > 0){
                            if(count($orders) > $total_rooms){
                                $CI->session->unset_userdata('booking_data');
                                $CI->session->unset_userdata('coupon_data');
                                return 'Sorry.. This Dates Between Rooms Not Available Please Try With Another Date Or Room';
                            }else{
                                continue;   // continue loop
                            }
                        }else{
                                $CI->session->unset_userdata('booking_data');
                                $CI->session->unset_userdata('coupon_data');
                                return 'Sorry.. This Dates Between Rooms Not Available Please Try With Another Date Or Room';
                        }
                    }

    return 1;
}

这是我使用该功能的Book.php控制器代码:

function index()
{
    //echo '<pre>'; print_r($_GET);
    //check availbilty
    //get_invoice_number();
    $this->session->unset_userdata('booking_data');
    $this->session->unset_userdata('coupon_data');
    $data['page_title']     = lang('make_reservation');
    $data['meta_description']   =   $this->setting->meta_description;
    $data['meta_keywords']      =   $this->setting->meta_keywords;  
    $data['banners']        = $this->homepage_model->get_banners();
    $data['testimonials']   = $this->homepage_model->get_testimonials();    // get 6 testimonials
    $data['room_types']     = $this->homepage_model->get_room_types_all();
    $data['taxes']          = $this->homepage_model->get_taxes();
        if(!empty($_GET['room_type'])){
            $data['services']           = $this->homepage_model->get_paid_services($_GET['room_type']);
        }
        //echo '<pre>'; print_r($data['services']);
    if(empty($_GET['room_type'])){
        $this->render('book/room_types', $data);        
    }else{
        check_availability($_GET['date_from'],$_GET['date_to'],$_GET['adults'],$_GET['kids'],$_GET['room_type']);

        $data['room_type']      = $this->homepage_model->get_room_type($_GET['room_type']);

        $this->render('book/view', $data);      
    }


}

您正面临这样的问题,因为在MYSQL中设置了ONLY_FULL_GROUP_BY选项,

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

解决问题。

包含COUNT()SUM()等聚合函数的SQL查询中始终带有GROUP BY子句。 它指定最终结果集中的其他非分组列。

在查询中,请注意以下几点:

  1. 您已指定rooms.*分组时不建议使用。
  2. 您可以在分组时提及特定的列,也可以在GROUP BY子句中指定这些列。

例如,

SELECT
    Count(product_tb.product_id),
    product_tb.`name`,
    product_tb.details
FROM
    `product_tb`
WHERE
product_tb.product_id = 1
GROUP BY
    product_tb.`name`,
    product_tb.details

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM