Erro ao comparar dados no BD[RESOLVIDO]

3 respostas
vanessa.tenorio

Boa Tarde, pessoal!!!
Estou construindo um projeto simples no qual este tem que verificar se o login e a senha que o usuário inseriu já está contida no banco, caso esteja, retorna o número identificador desta senha e login (ambos então contidos na mesma trupa da tabela).

Para teste, eu estou passando duas Strings para o método que verificará o login e a senha no banco:
Para estas duas estrings, eu já as tenho cadastradas no banco.

IdVendedora = loginDAO.encontrarVendedora("abc123", "123a"); // login e senha
import br.com.teletronix.conexao.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 *
 * @author vanessa
 */
public class LoginDAO {
     /***********************************************      
     * Faz consuta dos login`s e senhas do bd              *
     *                                                                 
     *********************************************** /
    public int encontrarVendedora(String  login, String  senha) {

        Conexao.abrirConexao();
        String comando = "SELECT * FROM login l WHERE l.loginVendedora = " + login + "AND l.senha= " + senha;
        int comparaLoginVendedora = 0;
 
        try {
            PreparedStatement ps = Conexao.conexao.prepareStatement(comando);

            ResultSet rsDados = ps.executeQuery();

            while (rsDados.next()) {
                
                comparaLoginVendedora = rsDados.getInt("idLogin");
            }
            
            Conexao.fecharConexao();

        } catch (Exception e) {
            e.printStackTrace();
        }
      
       return comparaLoginVendedora;
    }

}
Porém o erro apresentado é: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'l.senha= 123a' at line 1

No meu banco os atributos loginVendedora e senha estão declarados como VARCHAR(250).

Realizei o teste, inserindo uma nova trupa no banco contendo os valores de loginVendedora e senha = 1, alterei o método, fazendo com que o mesmo tenha seus parametros delarado como double : public int encontrarVendedora(Double login, double senha) e passei para o método dois números: IdVendedora = loginDAO.encontrarVendedora(1, 1);

Para este teste houve exito. Porém meu projeto deve executar com string e nao com double. Como eu resolvo este erro?
Grata!!!

3 Respostas

Hebert_Coelho

Coloca um espaço antes do AND.

Você poderia ter jogado para uma string e ver qual a consulta está sendo formada.

Você fazendo concatenação de string, igual oq vc está fazendo, vocÊ está vulnerável ao sql injection.

drsmachado

jakefrog:
Coloca um espaço antes do AND.

Você poderia ter jogado para uma string e ver qual a consulta está sendo formada.

Você fazendo concatenação de string, igual oq vc está fazendo, vocÊ está vulnerável ao sql injection.


Ou a problemas com nomes como Louis McAdams e Joana DArc…
O mais adequado é você fazer uso do que o preparedStatement fornece.

String comando = "SELECT * FROM login l WHERE l.loginVendedora = ? AND l.senha = ? ";  
        int comparaLoginVendedora = 0;  
  
        try {  
            PreparedStatement ps = Conexao.conexao.prepareStatement(comando);  
            ps.setString(1, login);
            ps.setString(2, senha);
            ResultSet rsDados = ps.executeQuery();

Assim você não se preocupa com SQL Injection, nem terá problemas com apóstrofos/aspas únicas.

vanessa.tenorio
drsmachado:
jakefrog:
Coloca um espaço antes do AND.

Você poderia ter jogado para uma string e ver qual a consulta está sendo formada.

Você fazendo concatenação de string, igual oq vc está fazendo, vocÊ está vulnerável ao sql injection.
Ou a problemas com nomes como Louis Mc`Adams e Joana D`Arc... O mais adequado é você fazer uso do que o preparedStatement fornece.
String comando = "SELECT * FROM login l WHERE l.loginVendedora = ? AND l.senha = ? ";  
        int comparaLoginVendedora = 0;  
  
        try {  
            PreparedStatement ps = Conexao.conexao.prepareStatement(comando);  
            ps.setString(1, login);
            ps.setString(2, senha);
            ResultSet rsDados = ps.executeQuery();
Assim você não se preocupa com SQL Injection, nem terá problemas com apóstrofos/aspas únicas.
drsmachado e jakefrog, muito obrigada pela ajuda!!! Utilizei as dicas apontadas por ambos, construindo meu método com a estrutura abaixo e foi SUCESSO:
public int encontrarVendedora(String login, String senha) {

        Conexao.abrirConexao();
        String comando = "SELECT * FROM login l WHERE l.loginVendedora = ? AND l.senha = ? ";
        int comparaLoginVendedora = 0;
               
       try {
            PreparedStatement ps = Conexao.conexao.prepareStatement(comando);
            ps.setString(1, login);   
            ps.setString(2, senha);   
            ResultSet rsDados = ps.executeQuery(); 

            while (rsDados.next()) {
                
                comparaLoginVendedora = rsDados.getInt("idLogin");

            }

            Conexao.fecharConexao();

        } catch (Exception e) {
            e.printStackTrace();
        }
      
       return comparaLoginVendedora;
    }
MUITO OBRIGADA!!!
Criado 23 de julho de 2012
Ultima resposta 23 de jul. de 2012
Respostas 3
Participantes 3