Помогите поправить код проверки сооответствия в базе данных

Тема в разделе "PHP", создана пользователем Menro, 4 июл 2016.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    686
    Симпатии:
    129
    Всем привет!
    Нужна Ваша помощь, иначе никак...
    Есть некий функционал на сайте, который позволяет пользователям оставить отзыв об отеле, но для того, что бы этот отзыв можно было оставить, идёт проверка его брони по 2-м параметрам:

    Booking Number
    Pin Code

    Появилась задача убрать эту проверку, то есть дать возможность писать отзыв даже тем, кто этот отель не заказывал.

    Вот собственно код:

    PHP:
    /*
    * Handle submit reviews ajax request
    */
    if ( ! function_exists'ct_ajax_submit_review' ) ) {
        function 
    ct_ajax_submit_review() {
            global 
    $wpdb;
            
    $result_json = array( 'success' => 0'result' => '''title' => '' );
            if ( ! isset( 
    $_POST['_wpnonce'] ) || ! wp_verify_nonce$_POST['_wpnonce'], 'post-' $_POST['post_id'] ) ) {
                
    $result_json['success'] = 0;
                
    $result_json['result'] = esc_html__'Sorry, your nonce did not verify.''citytours' );
                
    wp_send_json$result_json );
            }

            
    $fields = array( 'post_id''booking_no''pin_code''review_text''review_rating' );

            
    //validation
            
    $data = array();
            foreach( 
    $fields as $field ) {
                
    $data[$field] = ( isset( $_POST[$field] ) ) ? sanitize_text_field$_POST[$field] ) : '';
            }

            
    $order = new CT_Hotel_Order$data['booking_no'], $data['pin_code'] );
            if ( ! 
    $order_data $order->get_order_info() ) {
                
    $result_json['success'] = 0;
                
    $result_json['result'] = esc_html__'Wrong Booking Number and Pin Code.''citytours' );
                
    wp_send_json$result_json );
            }

            if ( ! 
    is_array$order_data ) || $order_data['status'] == 'cancelled' ) {
                
    $result_json['success'] = 0;
                
    $result_json['title'] = esc_html__'Sorry, You cannot leave a rating.''citytours' );
                
    $result_json['result'] = esc_html__'You cancelled your booking, so cannot leave a rating.''citytours' );
                
    wp_send_json$result_json );
            }

            if ( ( empty( 
    $order_data['date_to'] ) && ct_strtotime$order_data['date_from'] ) > ct_strtotimedate("Y-m-d") ) )
                || ( 
    ct_strtotime$order_data['date_to'] ) > ct_strtotimedate("Y-m-d") ) ) ) {
                
    $result_json['success'] = 0;
                
    $result_json['title'] = esc_html__'Sorry, You cannot leave a rating before travel.''citytours' );
                
    $result_json['result'] = esc_html__'You can leave a review after travel.''citytours' );
                
    wp_send_json$result_json );
            }

            
    $data['post_id'] = $order_data['post_id'];
            
    $data['reviewer_name'] = $order_data['first_name'] . ' ' $order_data['last_name'];
            
    $data['reviewer_email'] = $order_data['email'];
            
    $data['reviewer_ip'] = $_SERVER['REMOTE_ADDR'];
            
    $data['review_rating_detail'] = serialize$_POST['review_rating_detail'] );
            
    $data['review_rating'] = array_sum$_POST['review_rating_detail'] ) / count$_POST['review_rating_detail'] );
            
    $data['date'] = date'Y-m-d H:i:s' );
            
    $data['status'] = 'pending';
            if ( 
    is_user_logged_in() ) $data['user_id'] = get_current_user_id();
            if ( ! 
    $review_data $wpdb->get_row$wpdb->prepare'SELECT * FROM ' CT_REVIEWS_TABLE ' WHERE booking_no=%d AND pin_code=%d'$data['booking_no'], $data['pin_code'] ), ARRAY_A ) ) {
                if ( 
    $wpdb->insertCT_REVIEWS_TABLE$data ) ) {
                    
    $result_json['success'] = 1;
                    
    $result_json['title'] = esc_html__'Thank you! Your review has been submitted successfully.''citytours' );
                    
    $result_json['result'] = esc_html__'Your review has been submitted.''citytours' );
                } else {
                    
    $result_json['success'] = 0;
                    
    $result_json['title'] = esc_html__'Sorry, An error occurred while add review.''citytours' );
                    
    $result_json['result'] = esc_html__'Please try again after a while.''citytours' );
                }
            } else {
                if ( 
    $wpdb->updateCT_REVIEWS_TABLE$data, array('booking_no'=>$data['booking_no'], 'pin_code'=>$data['pin_code']) ) ) {
                    
    $result_json['success'] = 1;
                    
    $result_json['title'] = esc_html__'Thank you! Your review has been submitted successfully.''citytours' );
                    
    $result_json['result'] = esc_html__'You can change your review anytime.''citytours' );
                    
    ct_review_calculate_rating$data['post_id'] );
                } else {
                    
    $result_json['success'] = 0;
                    
    $result_json['title'] = esc_html__'Sorry, An error occurred while add review.''citytours' );
                    
    $result_json['result'] = esc_html__'Please try again after a while.''citytours' );
                }
            }
            
    wp_send_json$result_json );
        }
    }
    Я конечно по дилетантски пробовал удалять всё, что имеет отношение к пин коду и букинг номеру, но мне это не помогло. Буду очень признателен за любую помощь! Спасибо!
     
  2. borodatych

    borodatych Постоялец

    Регистр.:
    24 июн 2016
    Сообщения:
    125
    Симпатии:
    75
    Как минимум интересно, что там происходит.
     
    oecsvftt175 и Menro нравится это.
  3. kadurinho

    kadurinho Shop Script

    Регистр.:
    21 июн 2011
    Сообщения:
    621
    Симпатии:
    261
    Код:
    $result_json['success'] = 0;
    на 1 поменять, что будет?

    P.S. сложно судить, не видя какие данные отправляются запросами и какие возвращаются
     
    Menro нравится это.
  4. Soru

    Soru Создатель

    Регистр.:
    28 окт 2014
    Сообщения:
    42
    Симпатии:
    18
    ну тут как минимум на компонент поглядеть бы...
    дилетантски удалить не поможет хотя бы из-за
    т.е. они являются свойствами данного объекта. в общем, надо смотреть, причем не в одну только функцию.
     
    oecsvftt175 и Menro нравится это.
  5. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    686
    Симпатии:
    129
    По поиску много чего нашёл, хз, даже чего скидывать.
    Пробовал ничего не получается:)

    Всем спасибо!
    Моих знаний не хватит для того, что даже предоставить развёрнутую информацию по проблема.
    Можно удалить пост.
    Ещё раз спасибо тем кто откликнулся.
     
  6. Casper_R

    Casper_R Создатель

    Регистр.:
    3 май 2007
    Сообщения:
    87
    Симпатии:
    31
    а если перед
    PHP:
    $order = new CT_Hotel_Order$data['booking_no'], $data['pin_code'] );
    добавить
    PHP:
    $data['booking_no'] = 'Реально существующий в базе booking_no';
    $data['pin_code'] = 'Реально существующий в базе pin_code';
    $order = new CT_Hotel_Order$data['booking_no'], $data['pin_code'] );
    ?
     
    Menro нравится это.
  7. Soru

    Soru Создатель

    Регистр.:
    28 окт 2014
    Сообщения:
    42
    Симпатии:
    18
    прокатить то прокатит чисто теоретически, но там есть еще интересная проверка
    , которая, скорее всего, запорет сохранение. и терзают меня смутные сомнения, что и отзыв будет привязан к этому пину и номеру.
     
    Menro нравится это.
  8. Casper_R

    Casper_R Создатель

    Регистр.:
    3 май 2007
    Сообщения:
    87
    Симпатии:
    31
    а мне вот кажется, что эта строчка просто проверяет, что такая запись может быть добавлена. Она же не мержит никакие результаты с массивом для вставки $data. Может и прокатить :)

    P.S.
    Да, ты прав. Но все запорит вот эта строчка
    PHP:
     if ( $wpdb->updateCT_REVIEWS_TABLE$data, array('booking_no'=>$data['booking_no'], 'pin_code'=>$data['pin_code']) ) ) {
    все будет просто перезаписываться. Тогда топикстартеру надо просто сгенерить и вставить новую строчку в таблицу перед проверкой их существования.
     
    Menro нравится это.
  9. Soru

    Soru Создатель

    Регистр.:
    28 окт 2014
    Сообщения:
    42
    Симпатии:
    18
    топикстартеру лучше выложить код класса CT_Hotel_Order. потому что исправив его можно будет с легкостью дилетантски грохать все упоминания о номере и пине в данной функции :)
    и да, понятно что это какой то плугин для вордпресса. но вот какой? ) топикстартер хоть сказал бы )
     
    Menro нравится это.
  10. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    686
    Симпатии:
    129
    Эххх, даже не представляете как я приятно удивлён такой отзывчивостью.
    Честно скажу, после первых двух вопросов я психанул и решил было забить, но коль такое внимание тут мне, просто не могу не попытаться собрать всё необходимую информацию в кучу.

    Вот нашёл класс:

    Код:
    <?php
    if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
    if ( ! class_exists( 'CT_Hotel_Order' ) ) {
        class CT_Hotel_Order {
            public $order_id = '';
            public $service_data;
            public function __construct() {
                $a = func_get_args();
                $i = func_num_args();
                if (method_exists($this,$f='__construct'.$i)) {
                call_user_func_array(array($this,$f),$a);
                }
            }
            public function __construct1( $order_id ) {
                $this->order_id = $order_id;
            }
    
            public function __construct2( $booking_no, $pin_code ) {
                $this->order_id = $this->get_order_id( $booking_no, $pin_code );
            }
    
    
            public static function get_order_id( $booking_no, $pin_code ) {
                global $wpdb;
                $order_id = $wpdb->get_var( 'SELECT ct_order.id FROM ' . CT_ORDER_TABLE . ' AS ct_order WHERE ct_order.booking_no="' . esc_sql( $booking_no ) . '" AND ct_order.pin_code="' . esc_sql( $pin_code ) . '"' );
                if ( empty( $order_id ) ) return false;
                return $order_id;
            }
    
            public function get_order_info() {
                global $wpdb;
                if ( empty( $this->order_id ) ) return false;
                $order_data = $wpdb->get_row( 'SELECT ct_order.* FROM ' . CT_ORDER_TABLE . ' AS ct_order WHERE ct_order.id="' . esc_sql( $this->order_id ) . '"', ARRAY_A );
                if ( empty( $order_data ) ) return false;
                return $order_data;
            }
    
            public function get_rooms() {
                global $wpdb;
                if ( empty( $this->order_id ) ) return false;
                $hotel_data = $wpdb->get_results( 'SELECT ct_bookings.* FROM ' . CT_ORDER_TABLE . ' AS ct_order
                                                INNER JOIN ' . CT_HOTEL_BOOKINGS_TABLE . ' AS ct_bookings ON ct_bookings.order_id = ct_order.id
                                                WHERE ct_order.id="' . esc_sql( $this->order_id ) . '"', ARRAY_A );
                if ( empty( $hotel_data ) ) return false;
                return $hotel_data;
            }
    
            public function get_tours() {
                global $wpdb;
                if ( empty( $this->order_id ) ) return false;
                $tour_data = $wpdb->get_row( 'SELECT ct_bookings.* FROM ' . CT_ORDER_TABLE . ' AS ct_order
                                                INNER JOIN ' . CT_TOUR_BOOKINGS_TABLE . ' AS ct_bookings ON ct_bookings.order_id = ct_order.id
                                                WHERE ct_order.id="' . esc_sql( $this->order_id ) . '"', ARRAY_A );
                if ( empty( $tour_data ) ) return false;
                return $tour_data;
            }
    
            public function get_services() {
                global $wpdb;
                if ( empty( $this->order_id ) ) return false;
                $add_service_data = $wpdb->get_results( 'SELECT ct_add_bookings.* FROM ' . CT_ORDER_TABLE . ' AS ct_order
                                                INNER JOIN ' . CT_ADD_SERVICES_BOOKINGS_TABLE . ' AS ct_add_bookings ON ct_add_bookings.order_id = ct_order.id
                                                WHERE ct_order.id="' . esc_sql( $this->order_id ) . '"', ARRAY_A );
                if ( empty( $add_service_data ) ) return false;
                return $add_service_data;
            }
        }
    }
    Пара важных (возможно моментов).
    При написании отзыва я указываю два кода, это и определяет к какому отелю будет добавлен отзыв. То есть если есть такой код с таким номеров, то он завязан за отелем, а значит этот отзыв добавится к нему. То есть перед публикацией как верно заметил Soru, надо создать эту бронь. Хотя я так понял Вам уже известно больше чем мне)

    Кстати, плагин хз какой. Он шёл вместе с темой. По-этому сказать ничего не могу.
    Сама тема: citytours
     
Статус темы:
Закрыта.