[Решено] Глюк в запросе (BETWEEN)

Тема в разделе "Базы Данных", создана пользователем Flexx, 15 сен 2015.

Метки:
Статус темы:
Закрыта.
  1. Flexx

    Flexx

    Регистрация:
    8 янв 2013
    Сообщения:
    122
    Симпатии:
    86
    Добрый день уважаемые гуру.
    Сложилась ситуация, никак не могу правильно рассчитать формулу.
    Сделал календарь событий, все нормально добавляет в базу, время и т.д., вытаскивает результат.
    но вопрос вот в чем, не получается правильно сделать (если клиент выбрал одну и туже дату, которая уже имеется в календаре, чтоб он выводил ошибку), данная схема уже практически реализована, но имеется косяк,
    Например, если выбрали дату 11.09.2015 15-00 и 11.09.2015 16-00 и второй выбрал дату 11.09.2015 14-00 и 11.09.2015 15-30 то он выводит ошибку(все правильно), а если выбрали одинаковую дату 11.09.2015 15-00 и 11.09.2015 15-00 то он заносится в базу и ставится рядом(косяк)
    вот пример sql запроса
    PHP:
    $str_start date("Y-m-d H:i",strtotime("+1 minutes",strtotime($start)));
    $str_end date("Y-m-d H:i",strtotime("-1 minutes",strtotime($end)));
    $sql_check 'SELECT * FROM events WHERE room = "' $room '" AND (start BETWEEN "' $str_start '" AND "' $str_end '" OR end BETWEEN "' $str_start '" AND "' $str_end '")';
     
  2. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    не понятно что заносится в базу, у вас же селект

    и немного не ясна логика. распишите чуть подробней.
     
  3. Flexx

    Flexx

    Регистрация:
    8 янв 2013
    Сообщения:
    122
    Симпатии:
    86
    тут просто идет выборка
    PHP:
     $str_start date("Y-m-d H:i",strtotime("+1 minutes",strtotime($start)));
            
    $str_end date("Y-m-d H:i",strtotime("-1 minutes",strtotime($end)));
            
    $sql_check 'SELECT * FROM events WHERE room = "' $room '" AND (start BETWEEN "' $str_start '" AND "' $str_end '" OR end BETWEEN "' $str_start '" AND "' $str_end '")';
            
    $sql 'INSERT INTO wp_events (
                start,
                end,
                type,
                room,
                name)
                VALUES
                ("' 
    date("Y-m-d H:i"strtotime($start)) . '",
                "' 
    date("Y-m-d H:i"strtotime($end)) . '",
                "' 
    $type '","' $room '","' $name '")';
            
    $db_check_res mysql_query($sql_check);
            
    $row mysql_fetch_assoc($db_check_res);
            if (
    $row == false){
                if(
    mysql_query($sql)) {
                    
    //echo mysql_insert_id();
                
    }
            }else{
                echo 
    'Already booked';
            }
    дата 11.09.2015 15-00 и 11.09.2015 16-00 и второй выбрал дату 11.09.2015 14-00 и 11.09.2015 15-30 то он выводит ошибку(все правильно, показывает что занято место) .
    а если выбрали одинаковую дату 11.09.2015 15-00 и 11.09.2015 15-00 то он заносится в базу и ставится рядом(все равно добавляется, хотя должно показать что место занято)
     
  4. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    потому что в самом начале ты делаешь:
    PHP:
    $str_start date("Y-m-d H:i",strtotime("+1 minutes",strtotime($start)));
    $str_end date("Y-m-d H:i",strtotime("-1 minutes",strtotime($end)));
    т.е. ввода 11.09.2015 15-00 в оба поля, по факту получается:
    start 11.09.2015 15-01
    end 11.09.2015 14-59

    т.е. пересечение неверное) вот он и не находит. Выход - либо не прибавлять и вычитать, либо у старта вычитать одну минуту, а энду добавлять.
     
  5. Flexx

    Flexx

    Регистрация:
    8 янв 2013
    Сообщения:
    122
    Симпатии:
    86
    спасибо за ответ, решил вот таким способом
    PHP:
     $sql_check 'SELECT * FROM wp_events WHERE room = "' $room '" AND (start BETWEEN "' $str_start '" AND "' $str_end '" OR end BETWEEN "' $str_start '" AND "' $str_end '")';
     
Статус темы:
Закрыта.