2013-04-19 18 views
11

Ich versuche zu überprüfen, ob ein bestimmter Wert bereits in meiner Datenbank existiert. Ich greife auf die Datenbank von Java-Standalone-App mit JDBC (Abfragen für das Einfügen von Datensätzen in db Arbeit, so dass meine Einrichtung und Verbindung in Ordnung sind).Java MySQL überprüfen, ob Wert in der Datenbank existiert

String queryCheck = "SELECT * from messages WHERE msgid = " + msgid; 
Statement st = conn.createStatement(); 
ResultSet rs = st.executeQuery(queryCheck); // execute the query, and get a java resultset 

// if this ID already exists, we quit 
if(rs.absolute(1)) { 
    conn.close(); 
    return; 
} 

ich diese Störung erhalte (es ist offensichtlich etwas falsch mit meiner SQL-Syntax):

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 'd-f05708071f8f' at line 1 

Allerdings, wenn ich versuche, diesen Befehl in meiner MySQL-Kommandozeile auszuführen, es funktioniert! Kannst du mir sagen, was ist falsch mit meiner Aussage? Danke für irgendwelche Tipps!

+2

Bitte, bitte, bitte, IMMER Abfrage Bindung ... IMMER nicht nur Verhindern Sie SQL-Injection-Angriffe. Sie helfen auch der Datenbank, da der Ausführungsplan zwischengespeichert wird und die nächste Abfrage schneller wird. –

Antwort

23

Sie benötigen einen String in Anführungszeichen in MySQL wickeln, so dass die Abfrage

SELECT * from messages WHERE msgid = 'd-f05708071f8f'; 

Nicht

sein muss
SELECT * from messages WHERE msgid = d-f05708071f8f; 

So ist die Code sollte

lesen
String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'"; 

Ich würde vorschlagen, eine PreparedStatement zu vermeiden, dass diese Art von Fragen und das Risiko einer SQL-Injection mit:

final String queryCheck = "SELECT * from messages WHERE msgid = ?"; 
final PreparedStatement ps = conn.prepareStatement(queryCheck); 
ps.setString(1, msgid); 
final ResultSet resultSet = ps.executeQuery(); 

für die Erstellung von Abfragen Mit String-Verkettung sehr schlechte Praxis betrachtet wird. War schon lange Zeit.

Weiter würde ich vorschlagen select count(*) anstatt der vollen select * als diese zurückgibt viel weniger Daten (denke an die Größe der ResultSet) und MySQL kann es auch zu optimieren.

+0

Yep, vergaß Bindestriche und ich testete es nur mit ganzen Zahlen ... meine schlechte .. danke! – Smajl

3

Da msgid ein varchar ist, müssen Sie den Wert in der WHERE-Klausel mit einfachen Anführungszeichen umgeben.

Das dynamische Generieren von SQL-Zeichenfolgen wird jedoch nicht empfohlen, da es Ihre Anwendung für SQL-Injection verfügbar machen kann.

Statt ein verwenden PreparedStatement:

  String queryCheck = "SELECT * from messages WHERE msgid = ?"; 
      PreparedStatement st = conn.prepareStatement(queryCheck); 
      st.setString(1, msgid); 
      ResultSet rs = st.executeQuery(); 
5

Sie müssen Bindevariablen verwenden.

PreparedStatement st = conn.prepareStatement(
    "SELECT * from messages WHERE msgid = ?"); 
st.setString(1, msgid); 
ResultSet rs = st.executeQuery(queryCheck); 

Oder in manuelle Angebotserstellung, aber das ist riskant.

Zusätzlich zur Verhinderung der SQL-Injektion sollten vorbereitete Anweisungen auch die Leistung verbessern, wenn Sie dieselbe Abfrage wiederholt ausführen.

+1

+1 für Query binding –

1

Sie benötigen

SELECT * from messages WHERE msgid = 'd-f05708071f8f'; 
3

einfache Anführungszeichen verwenden Sie diese versuchen:

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'"; 

Sie haben verpasst Anführungszeichen msgid. (Ich gehe davon aus, dass msgid ist String und nicht Integer Wert.)

+0

Nur ein Vorschlag, wenn Sie hier antworten, wenn ein Benutzer Strings für SQL-Abfragen verkettet, empfehlen Sie immer eine "PreparedStatement" viele Benutzer werden Sie sofort abmelden, wenn Sie nicht, in der gleichen Notiz Sie erhalten einige Upvotes für die Erwähnung von SQL Injection/Prepared Statements. –

0
String sql1 ="SELECT Time FROM monday_wednesday WHERE Time ='"+time.getSelectedItem()+"'"; 
pst=con.prepareStatement(sql1); 
rs=pst.executeQuery(); 
if(rs.next()) { 
    if(rs.getString("Time").equals(time.getSelectedItem())) { 
     JOptionPane.showMessageDialog(null,"Time is already taken","",JOptionPane.INFORMATION_MESSAGE); 
    } 
} else { 
    String sql="INSERT INTO monday_wednesday(pfname,pmname,plname,Birthdate,Gender,Address,City,Contact,Contactperson,Time,Date)\n" + "VALUES ('"+txtFirstName1.getText()+"','"+txtMiddleName1.getText()+"','"+txtLastName1.getText()+"','"+d+"','"+gender.getSelectedItem()+"','"+ txtAddress.getText()+"','"+txtCity.getText()+"','"+txtContact.getText()+"','"+txtContactPerson1.getText()+"','"+time.getSelectedItem()+"','"+dateFormat.format(date)+"')"; 
} 

Nur ein einfacher doppelter Eintrag Algorithmus

Verwandte Themen