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

Статус
В этой теме нельзя размещать новые ответы.

Menro

web, seo, email, hack
Регистрация
27 Янв 2008
Сообщения
689
Реакции
138
Всем привет!
Нужна Ваша помощь, иначе никак...
Есть некий функционал на сайте, который позволяет пользователям оставить отзыв об отеле, но для того, что бы этот отзыв можно было оставить, идёт проверка его брони по 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_strtotime( date("Y-m-d") ) )
            || ( ct_strtotime( $order_data['date_to'] ) > ct_strtotime( date("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->insert( CT_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->update( CT_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 );
    }
}

Я конечно по дилетантски пробовал удалять всё, что имеет отношение к пин коду и букинг номеру, но мне это не помогло. Буду очень признателен за любую помощь! Спасибо!
 
Код:
$result_json['success'] = 0;
на 1 поменять, что будет?

P.S. сложно судить, не видя какие данные отправляются запросами и какие возвращаются
 
ну тут как минимум на компонент поглядеть бы...
дилетантски удалить не поможет хотя бы из-за
$order = new CT_Hotel_Order( $data['booking_no'], $data['pin_code'] );
т.е. они являются свойствами данного объекта. в общем, надо смотреть, причем не в одну только функцию.
 
Как минимум интересно, что там происходит.
По поиску много чего нашёл, хз, даже чего скидывать.
Код:
$result_json['success'] = 0;
на 1 поменять, что будет?

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

Пробовал ничего не получается:)

Всем спасибо!
Моих знаний не хватит для того, что даже предоставить развёрнутую информацию по проблема.
Можно удалить пост.
Ещё раз спасибо тем кто откликнулся.
 
а если перед
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'] );
?
 
а если перед
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'] );
?
прокатить то прокатит чисто теоретически, но там есть еще интересная проверка
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 ) )
, которая, скорее всего, запорет сохранение. и терзают меня смутные сомнения, что и отзыв будет привязан к этому пину и номеру.
 
прокатить то прокатит чисто теоретически, но там есть еще интересная проверка, которая, скорее всего, запорет сохранение. и терзают меня смутные сомнения, что и отзыв будет привязан к этому пину и номеру.

а мне вот кажется, что эта строчка просто проверяет, что такая запись может быть добавлена. Она же не мержит никакие результаты с массивом для вставки $data. Может и прокатить :)

P.S.
Да, ты прав. Но все запорит вот эта строчка
PHP:
 if ( $wpdb->update( CT_REVIEWS_TABLE, $data, array('booking_no'=>$data['booking_no'], 'pin_code'=>$data['pin_code']) ) ) {

все будет просто перезаписываться. Тогда топикстартеру надо просто сгенерить и вставить новую строчку в таблицу перед проверкой их существования.
 
Тогда топикстартеру надо просто сгенерить и вставить новую строчку в таблицу перед проверкой их существования.
топикстартеру лучше выложить код класса CT_Hotel_Order. потому что исправив его можно будет с легкостью дилетантски грохать все упоминания о номере и пине в данной функции :)
и да, понятно что это какой то плугин для вордпресса. но вот какой? ) топикстартер хоть сказал бы )
 
Эххх, даже не представляете как я приятно удивлён такой отзывчивостью.
Честно скажу, после первых двух вопросов я психанул и решил было забить, но коль такое внимание тут мне, просто не могу не попытаться собрать всё необходимую информацию в кучу.

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

Код:
<?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
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху