Блок JDBC try не выполняется - PullRequest
0 голосов
/ 12 мая 2018

так что проблема в том, что Try code code не выполняется, что я могу сделать? а в чем проблема?

public class verif {
    public static String checki(String pseudo, String mdp) {
        boolean check = false;
        String psDB = "", passDB = "";
        Connection con = null;
        PreparedStatement stmt;
        ResultSet res;
        try {

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel", "naila", "pass");
            stmt = con.prepareStatement("select pseudo,mdp from recp");
            res = stmt.executeQuery();
            while (res.next()) {
                psDB = res.getString("pseudo");
                passDB = res.getString("mdp");
            }

            boolean us = psDB.equals(pseudo);
            boolean ps = passDB.equals(mdp);
            if (us && ps)
                check = true;
            else
                check = false;
        } catch (ClassNotFoundException | SQLException e) {
        }
        return psDB;
    }
}

а это сервлет:

 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pseudo=request.getParameter("username");
    String mdp = request.getParameter("password");
    PrintWriter p = response.getWriter();
    p.print("pseudo est "+verif.checki(pseudo, mdp));
  }

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Вы просто забыли вызвать next() на ResultSet res, чтобы навести курсор ResultSet на первую запись (если она есть).Если вы не вызываете метод next, этот курсор будет указывать непосредственно перед первой записью результата, а затем res.getString(#) ничего не вернет.

Просто сделайте это:

.
.
.
res = stmt.executeQuery();
while(res.next()){
    psDB = res.getString(1).toString();
    passDB = res.getString(2).toString();
}
.
.
.

Еще одна подсказка - вызов res.getString(#) вернет значения типа String, и нет необходимости снова вызывать .toString().Поэтому лучше изменить его следующим образом:

.
.
.
res = stmt.executeQuery();
while(res.next()){
    psDB = res.getString(1);
    passDB = res.getString(2);
}
.
.
.

И хорошей практикой является сделать результат вашего sql как можно более узким, чтобы в этом случае была только одна запись (проверка имени пользователя и пароля для входа в систему и т. Д.)..).Это означает только выбор пароля для имени пользователя, которое передается вашему checki методу:

.
.
.
stmt = con.prepareStatement("select pseudo, mdp from recp where pseudo = ? ");
stmt.setString(1, pseudo);
res = stmt.executeQuery();
while(res.next()){
    psDB = res.getString(1);
    passDB = res.getString(2);
}
.
.
.

Если после этого у вас появятся другие ошибки, вы можете проверить, сколько записей у вас в таблице.и проверьте, есть ли запись, которую вы выбираете в своем коде, есть или нет.

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

}catch (ClassNotFoundException | SQLException e) {
    e.printStackTrace();
}
0 голосов
/ 14 мая 2018

Ваш код должен выглядеть следующим образом.

public class verif {
    public static boolean checki(String pseudo, String mdp) {
        boolean check = false;
        String psDB = "", passDB = "";
        Connection con = null;
        PreparedStatement stmt;
        ResultSet res;
        try {

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel", "naila", "pass");
            stmt = con.prepareStatement("select pseudo,mdp from recp where pseudo=? AND mdp=?");
            stmt.setString(pseudo);
            stmt.setString(mdp);

            res = stmt.executeQuery();
           /* Not  Needed
         while (res.next()) {
                psDB = res.getString("pseudo");
                passDB = res.getString("mdp");
            }

            boolean us = psDB.equals(pseudo);
            boolean ps = passDB.equals(mdp);*/
            if (res.next())
                check = true;
            else
                check = false;
        } catch (Exception e) {
              e.printStackTrace();
        }
        return check;
    }
}

И код стороны сервлета должен быть таким:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{   
    String pseudo=request.getParameter("username");
    String mdp = request.getParameter("password");
    PrintWriter p = response.getWriter();
    if(verif.checki(pseudo, mdp)){
        // Put your Business Logic (Create session and redirect to Main Page)
        p.print("Successfully Logged in");
    }
    else{
        // Redirect to LogIn page
        p.print("Invalid Credential ");
    }

}
0 голосов
/ 12 мая 2018
Connection con = null;
Connection co=DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel" ,"naila","pass"); 

У вас есть эти 2 соединения, которые вы объявили, но в подготовленном вами заявлении вы используете:

stmt = con.prepareStatement("select pseudo,mdp from recp.hotel");

Просто удалите con и используйте co , и это должно сработать

Кроме того, когда вы выполняете подготовленный оператор, вы получаете курсор. и этот курсор должен быть перемещен в следующую позицию. Например, если вы считаете, что будет возвращено несколько записей, выполните do:

while(rs.next()){  
  psDB=res.getString("pseudo");
  passDB=res.getString("mdp");
}
...