2016-07-25 3 views
1

Ich entwickle ein Basisprogramm mit 3 JFrames. Ein Login, eine Registrierung und ein Dashboard, die nach einem erfolgreichen Anmeldeversuch geöffnet werden. Ich erhalte jedoch einen Fehler, nachdem ich den Benutzernamen und das Passwort eingegeben und auf den Login-Button geklickt habe.SQL Syntax Error In Java und MySql SELECT Anfrage

Hier ist der Fehler:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' password='1234'' at line 1

Und hier ist mein Code:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 

import com.mysql.jdbc.Statement; 

import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.ImageIcon; 
import java.awt.Font; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.awt.event.ActionEvent; 

public class Login extends JFrame { 

private JPanel contentPane; 
private JTextField txtUsrName; 
private JTextField txtPAss; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Login frame = new Login(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public Login() { 
    setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
    setBounds(100, 100, 450, 348); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    JLabel lblLogin = new JLabel("Welcome To TechApp"); 
    lblLogin.setFont(new Font("Tekton Pro", Font.PLAIN, 18)); 
    lblLogin.setBounds(135, 19, 163, 28); 
    contentPane.add(lblLogin); 

    JLabel lblUsername = new JLabel("UserName:"); 
    lblUsername.setFont(new Font("Alaska", Font.PLAIN, 15)); 
    lblUsername.setBounds(174, 58, 88, 28); 
    contentPane.add(lblUsername); 

    txtUsrName = new JTextField(); 
    txtUsrName.setBounds(145, 90, 132, 20); 
    contentPane.add(txtUsrName); 
    txtUsrName.setColumns(10); 

    JLabel lblPassword = new JLabel("Password:"); 
    lblPassword.setFont(new Font("Alaska", Font.PLAIN, 15)); 
    lblPassword.setBounds(182, 118, 95, 46); 
    contentPane.add(lblPassword); 

    txtPAss = new JTextField(); 
    txtPAss.setColumns(10); 
    txtPAss.setBounds(145, 156, 132, 20); 
    contentPane.add(txtPAss); 

    JButton btnNewButton = new JButton("login"); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 


      String _username = txtUsrName.getText(); 
      String _password = txtPAss.getText(); 
      String url = "jdbc:mysql://127.0.0.1:3306/javabase"; 
      String user = "java"; 
      String passw = "password"; 

      try{ 
       // 1.Get a connection To Database 
       Connection myConn = DriverManager.getConnection(url, user, passw); 

       // 2.Create a statement 
       Statement myStmt = (Statement) myConn.createStatement(); 

       // 3.Execute SQL Query 
       String sql = "SELECT userame, password FROM registration WHERE userame='"+_username+"', password='"+_password+"' "; 
       ResultSet result = myStmt.executeQuery(sql); 
       //myStmt.executeUpdate(sql); 

       int count = 0; 
       while(result.next()){ 
        count = count + 1; 
       } 
       if(count == 1){ 
        Dashboard frame = new Dashboard(); 
        frame.setVisible(true); 
       } 
       else if(count > 1){ 
        JOptionPane.showMessageDialog(null, "Duplicate User! Access Denied!"); 
       } 
       else{ 
        JOptionPane.showMessageDialog(null, "User Not Found!"); 
       } 


      } 
      catch(Exception ex) 
      { 
       ex.printStackTrace(); 
      } 





     } 
    }); 
    btnNewButton.setBounds(169, 202, 89, 49); 
    contentPane.add(btnNewButton); 

    JButton btnRegister = new JButton("Register"); 
    btnRegister.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Main frame = new Main(); 
      frame.setVisible(true); 
     } 
    }); 
    btnRegister.setBounds(168, 264, 89, 23); 
    contentPane.add(btnRegister); 

    JLabel lblNewLabel = new JLabel(""); 
    lblNewLabel.setFont(new Font("Alaska", Font.PLAIN, 16)); 
    lblNewLabel.setIcon(new ImageIcon("D:\\ExploitGate\\MAS-9831-Offwhite2.jpg")); 
    lblNewLabel.setBounds(0, 0, 434, 310); 
    contentPane.add(lblNewLabel); 
} 
} 

ich die Stackoverflow Forum gesucht habe und führte die mögliche Lösung heraus gegeben here Kann mir jemand bitte leite, wie man diesen Fehler behandeln? Vielen Dank im Voraus :)

+0

verwundbar sind Ich glaube, Sie brauchen 'Passwort verwenden = ' "+ _ Passwort +"' ' "', sondern als' password ='" + _password + "'"; '- Beachten Sie das Fehlen eines schließenden' '' - Zeichens am Ende des "Passwort" -Wertes. – Castaglia

Antwort

1

Sie verwendeten ein Komma , zwischen Ihren WHERE-Klauseln anstelle einer AND.

Zeichenfolge sql = "SELECT userame, Passwort FROM Registrierung WHERE userame = '" + _ Benutzername + "und Passwort ='" + _ Passwort + "'";

+0

Danke Alot :) Es löste das Problem. –

+0

Sie sind herzlich willkommen. –

3

All der oben genannte Code ist im Grunde nutzlos. Es ist ein SQL-Syntax-Fehler, die es ist diese eine Zeile bedeutet:

... WHERE userame='"+_username+"', password='"+_password+"' "; 
           ^--- 

Sie nicht , verwenden where Klausel Argumente zu trennen. Sie verwenden boolesche Operationen. and, or, etc ...

Und beachten Sie, dass Sie sql injection attacks

+0

Danke Alot :) Es löste das Problem. –

+0

Ja, ich weiß, ich habe gerade Datenbankverbindung in Java gelernt. Jetzt werde ich mich auf die Sicherheit konzentrieren. Danke tho :) –