2017-10-13 1 views
1

Mon message d'erreur dans le cadre de CodeIgniter: Une erreur de base de données ApparuComment réparer l'erreur dans le projet 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 

Pourquoi une telle erreur et comment l'éliminer? Dans quoi il peut y avoir un problème dans le code?

Dans ces fonctions, quelque chose ne va pas ou tout est normal?

Fonction check_availability ($ check_in, $ check_out, $ adultes, $ kids, $ type_type_id) { $ query = '? Date_from ='. $ Check_in. ' & date_to = '. $ Check_out.' & adultes = '. $ Adultes.' & enfants = '. $ Enfants.' & room_type = '; $ CI = & get_instance(); if ($ check_in == $ check_out) { $ check_out = date ('Y-m-d', strtotime ($ check_out. '+ 1 jour)); }

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

Voici mon code de contrôleur Book.php où j'utiliser que les fonctions:

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


} 
+0

Montrez-nous le code où l'erreur réelle s'est produite. – shahsani

+0

Ligne 691? @shahsani – John

+0

Lol, et où est la ligne 691? de toute façon, vous devez spécifier l'expression 'GROUP BY' dans la requête – shahsani

Répondre

2

vous êtes face à ce problème en raison de l'option ONLY_FULL_GROUP_BY dans le MYSQL si gentiment mis,

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

pour résoudre le problème.

1

requête SQL, y compris des fonctions d'agrégation comme COUNT() ou SUM() etc. toujours une clause GROUP BY en elle. Ce qui spécifie les autres colonnes non groupées dans le résultat final.

En vous interrogez les remarques suivantes sont notées:

  1. Vous avez spécifié rooms.* qui est pas recommandé tout regroupement.
  2. Vous pouvez mentionner des colonnes spécifiques lors du regroupement et spécifier ces colonnes dans la clause GROUP BY également.

Par exemple,

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 
+0

J'ai modifié ma question et ajouté quelques fonctions – John