Tabela ma dwie kolumny - imię i nazwisko. Wpisuję w konsolę polecenie sprawdz(jakiesImie, jakiesNazwisko). Polecenie to jest przyjmowane jako parametr funkcji, która sobie odpowiednio tnie ten napis tak, aby jakiesImie i jakiesNazwisko były oddzielnie zapisane w tablicy stringów. Problem polega na napisaniu zapytania, które sprawdzi czy jest rekord z takimi wartościami i zwróci false/true. Jak powinno ono wyglądać? Kombinowałem z SELECT, ale bez skutku.
To pokaż jak kombinowałeś.
Np. w ten sposób:
PreparedStatement statement = con.getConnection().prepareStatement("SELECT login LIKE '?' AND password LIKE '?' FROM uzytkownicy);");
statement.setString(1, data[0]);
statement.setString(2, data[1]);
Albo:
PreparedStatement statement = con.getConnection().prepareStatement("SELECT * FROM uzytkownicy WHERE login = ? AND password = ?);");
statement.setString(1, data[0]);
statement.setString(2, data[1]);
Potem sprawdzałem za pomocą if (statement.executeUpdate()) czy się udało. W przypadku dodawania użytkowników do bazy wszystko działa jak trzeba.
Przecież pytałeś o nazwisku oraz imieniu, jak to się ma do tego co "kombinowałeś"?
SELECT count(login) FROM uzytkownicy WHERE login='?' AND password='?'
Bo z tym też próbowałem, ale o tym nie wspomniałem w pierwszym poście, wybacz.
Patrząc na to co masz na końcu oraz całą składnie podanych przez ciebie komend SQL'a jestem absolutnie pewien że jeżeli próbowałeś to zupełnie nie to.
Chodzi o te setStringi? Czy o coś innego? Jak powinno to wyglądać poprawnie?
PreparedStatement statement = con.getConnection().prepareStatement("SELECT COUNT(login) FROM uzytkownicy WHERE login = ? AND password = ?");
Dzięki. Tylko teraz jak sprawdzić, czy podane dane się zgadzają?
Count da Ci jakąś liczbę :) jak się nie zgadzają to z wielkim prawdopodobieństwem będzie to... 0 :)
Tylko jak się do tej liczby dostać? Coś z ResultSet?
Tak
Nadaj jakiś alias dla count(login) w ten sposób count(login) as total
ResultSet rs = statement.executeQuery();
int count = rs.getInt("total");
statement = con.getConnection().prepareStatement("SELECT COUNT(login) as howMany FROM uzytkownicy WHERE login = '?' AND password = '?'");
statement.setString(1, data[0]);
statement.setString(2, data[1]);
rs = statement.executeQuery();
count = rs.getInt("howMany");
if (count==1) {
success = true;
}
else if(count == 0){
success = false;
}
Mam to w try-catch zapisane, i dostaje SQLException. Co jest nie tak?
Spróbuj alternatywnie bez aliasu i wtedy
rs.getInt(1);
To samo. Jak ten stack trace ogarnąć?
edit: nie wiem co jest nie tak, ale w Analyze Stack Window mam tylko to co trzymam w schowku.
już wiem :P nie wołasz
rs.next()
i kursor jest przed pierwszym rekordem
Wrzucam całą funkcję :P
public static boolean stringLogin(String login) throws ClassNotFoundException, SQLException{
SqlConnection con = new SqlConnection();
PreparedStatement statement = null;
boolean success = false;
ResultSet rs = null;
int count = 0;
if(login.contains("logowanie[")){
int dlugosc = login.length();
String cut = login.substring(10, dlugosc-1);
String[] data = cut.split(",");
data[0] = data[0].replaceAll("\\s+","");
data[1] = data[1].replaceAll("\\s+","");
try{
statement = con.getConnection().prepareStatement("SELECT COUNT(login) FROM uzytkownicy WHERE login = '?' AND password = '?'");
statement.setString(1, data[0]);
statement.setString(2, data[1]);
rs = statement.executeQuery();
count = rs.getInt(1);
if (count==1) {
success = true;
}
else if(count == 0){
success = false;
}
}
catch(SQLException e){
System.out.println("Wystąpił bład");
success = false;
}
}
return success;
}
Wiem, bałagan...
StackTrace:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3813)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3795)
at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4616)
at javaserver.JavaServer.stringLogin(JavaServer.java:51)
at javaserver.JavaServer.main(JavaServer.java:144)
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
Usuń przy znakach zapytania apostrofy
Poszło... Ogromne dzięki garai za pomoc mimo późnej pory :)