Запрос к базе данных и Java - PullRequest
0 голосов
/ 02 сентября 2018

Я учусь на проекте о создании простого веб-приложения. Я создаю веб-приложение об отеле, и у меня проблема с бронированием номера. У меня есть 3 вида комнат, и я хочу, чтобы когда кто-то бронировал комнату, другой не мог забронировать ту же комнату за тот же период. Проблема в таком контроле. Я написал этот код:

КОД ОБНОВЛЕНИЯ ПОСЛЕ ОТВЕТА

 Statement  st =  con.createStatement();
        Statement stmt = con.createStatement();
        out.println("connection successfull");
        int total = 0;
        ResultSet rs3 = stmt.executeQuery( "SELECT COUNT(*) as total FROM reservation WHERE idRoom = '" + idRoom + 
                "' AND ('" + arrivaldate + "' >= arrivaldate AND '" + arrivaldate + "' <= departuredate) OR ('" + departuredate + "' >= arrivaldate "
                + "AND '" + departuredate + "' <= departuredate)");
        rs3.next(); // You'll ever have only one row
        total = rs3.getInt("total");


       /* String query = "SELECT COUNT(*) FROM reservation WHERE idRoom = '" + idRoom + 
                "' AND ('" + arrivaldate + "' >= arrivaldate AND '" + arrivaldate + "' <= departuredate) OR ('" + departuredate + "' >= arrivaldate "
                        + "AND '" + departuredate + "' <= departuredate)" ;

        */

       // ResultSet rs2  = stmt.executeQuery(check);
        out.println("<h1> Stringa check eseguito </h1>");


        if( total  > 0) { // THIS DOESN't WORK OF COURSE    
            response.sendRedirect("home.jsp");
        }
        else {
         st.executeUpdate("insert into reservation (login,email,typeroom,idRoom,arrivaldate,departuredate)values ('"+login+"','"+email+"','"+typeroom+"','"+idRoom+"','"+arrivaldate+"','"+departuredate+"')");
        }

Но это не работает должным образом, потому что позволяет мне бронировать одну и ту же комнату с теми же данными. Как я могу сделать по вашему мнению? Спасибо за Ваше внимание.

1 Ответ

0 голосов
/ 02 сентября 2018

Во-первых, вы полностью игнорируете свою сумму:

while(rs3.next()){
   rs3.getInt("total");
}

Должно быть:

rs3.next(); // You'll ever have only one row
total = rs3.getInt("total");

И, во-вторых, никогда не используйте конкатенации в своих запросах:

ResultSet rs3 = stmt.executeQuery( "SELECT COUNT(*) as total FROM reservation WHERE idRoom = '" + idRoom + 
                    "' AND ('" + arrivaldate + "' >= arrivaldate AND '" + arrivaldate + "' <= departuredate) OR ('" + departuredate + "' >= arrivaldate "
                    + "AND '" + departuredate + "' <= departuredate)");

Всегда используйте вместо этого PreparedStatements:

 PreparedStatement ps = stmt.prepareStatement( "SELECT COUNT(*) as total FROM reservation WHERE idRoom = ? AND (? >= arrivaldate AND ? <= departuredate) OR (? >= arrivaldate AND ? <= departuredate)");

int c = 0;
ps.setInt(++c, idRoom);
ps.setDate(++c, arrivaldate);
ps.setDate(++c, departuredate);
ps.setDate(++c, arrivaldate);
ps.setDate(++c, departuredate);

ResultSet rs = ps.executeQuery();
// And your usual code here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...