2017-03-09 1 views
-2

Im avoir un léger problème où ma requête sql ne fonctionne pas, car il ne cesse de me donner cet erro où il est dit attendu, même si j'ai mis un semi-collan là. Im assez nouveau à Java donc toute aide serait appriticated.Requête SQL attendue ';'

import javax.swing.*; 
import java.awt.event.*; 
import java.sql.*; 



    public class Manager { 
     Connection con; 
     Statement st; 
     ResultSet rs; 

JFrame f = new JFrame("User Login"); 
JLabel U = new JLabel("Username"); 
JLabel P = new JLabel("Password"); 
JTextField t = new JTextField(10); 
JTextField t1 = new JTextField(10); 
JButton b = new JButton("Login"); 


public Manager() 
{ 
    connect(); 
    frame(); 
} 
public void connect() 
{ 

try 
{  

String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
Class.forName(driver); 
String db = "jdbc:odbc:db1"; 
con = DriverManager.getConnection(db); 
st = con.createStatement(); 
} 
catch(Exception ex) 
{ 

} 
} 
public void frame() 
{ 
    f.setSize(600,400); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 

    JPanel p = new JPanel(); 
    p.add(U); 
    p.add(t); 
    p.add(P); 
    p.add(t1); 
    p.add(b); 

    f.add(p); 

    b.addActionListener(new ActionListener(){ 


     public void actionPerformed(ActionEvent e) 
     { 
      try 
      { 
      String User = t.getText().trim(); 
      String Password =t1.getText().trim(); 


      String sql = "select User,Password from Table1 where User = '" + User +"'and Password='"+ Password"'"; 


      rs = st.executeQuery(sql); 

      int count = 0; 
      while(rs.next()) 
      { 
       count = count + 1; 
      } 
      if(count == 1) 
        { 
         JOptionPane.showMessageDialog(null,"User found, Acces"); 
        } 
      else if(count > 1) 
      { 
       JOptionPane.showMessageDialog(null,"Duplicated User, Access denied"); 

      } 
      else 
      { 
       JOptionPane.showMessageDialog(null,"User Not found"); 
      } 
      } 
      catch(Exception ex) 
      { 

      } 
     } 
    }); 
} 


public static void main(String[] args) { 

    new Manager(); 
} 

}

+2

Vous devriez envisager d'utiliser 'PreparedStatement' au lieu de créer toute la requête dans une chaîne – Dazak

+2

Tout d'abord: * utilisez des requêtes paramétrées *! Vous avez probablement des guillemets de fermeture dans votre champ, ce qui provoque la rupture de la requête.L'utilisation de requêtes paramétrées empêche cela d'être un problème avec la prévention de l'injection SQL (que votre code est * ouvert * à). Deuxièmement: NE PAS ENREGISTRER LES MOTS DE PASSE EN TEXTE. – Siyual

+0

Quel est le message d'exception/trace de pile? En outre, le 'sql' est ouvert à l'attaque SQL Injection - pensez à utiliser' PreparedStatement'. –

Répondre

0

vous êtes juste manque un signe '+'.

changement

+"'and Password='"+ Password"'";

à

+"'and Password='"+ Password + "'";

0

Essayez de mettre un; Chaîne sql = "sélectionnez Utilisateur, Mot de passe de Table1 où Utilisateur = '" + Utilisateur + "' et Mot de passe = '" + Mot de passe "'" + "dans votre chaîne sql ... un peu comme ça (après mot de passe)

";

-1

En dépit de ne pas répondre à votre question, je crois que cela mérite l'attention d'une réponse, les règles soient damnées. Ce que vous faites coûte littéralement du monde des tonnes d'argent chaque année, ruine la vie des gens, tue probablement aussi des gens (je connais des gens qui se sont suicidés parce qu'ils étaient financièrement ruinés).

(modifier) ​​En voyant ce que votre problème était, ce pourrait effectivement résoudre le problème pour vous. Prime. (/ Modifier) ​​

S'il vous plaît utiliser _Prepared Statements_ dans votre base de données accède. Si mon identité est volée et que mon crédit est épuisé parce que vous êtes le programmeur bon marché que ma banque a embauché, alors je vais rassembler un gang et nous viendrons vous trouver.

Dès que quelqu'un se rend compte que votre code est peu sûr, votre base de données croulera de ce trou béant de sécurité.

Je vais essayer de ne pas me déranger si cela se traduit par un tas de downvotes; prévenir ce problème de sécurité en vaut la peine.

C'est exactement dans la même API que vous utilisez. Créer une PreparedStatement, faire

myPreparedStatement = databaseConnection.prepareStatement(
    "select User,Password from Table1 where User = '?'and Password='?'"); 

puis avec execute

myPreparedStatement.setString(columnUser, user); 
myPreparedStatement.setString(columnPass, pass); 
myPreparedStatement.executeUpdate(); 

Vous serez très bien mieux. Sinon, je garantis que votre base de données finira sera piraté (et le reste de votre réseau, selon la façon dont tout est configuré).

Les injections SQL sont le pain et le beurre (et les fèces) des attaques de bases de données. Cette astuce simple vous permettra d'économiser 99% sur vos factures post-piratage.

+0

En fait, attendez une minute ... est-ce que vous stockez vos mots de passe en texte clair, ET êtes-vous simplement en train de télécharger des paires nom/mot de passe ici? Cela, en plus de votre autre problème que j'ai déjà traité, aurait été catastrophique pour vous. Ce que certains appelleraient un «événement de génération de CV», sauf que personne qui le connaissait n'accepterait ce CV. Assurez-vous de hacher les mots de passe et ajoutez un peu de sel, ou mieux encore utilisez un autre service d'annuaire pour faire le travail pour vous. Au minimum, exécutez une fonction de hachage sur les mots de passe avant de les enregistrer (et évidemment encore une fois lorsque vous vous authentifiez) – Aaron