2013-04-19 3 views
11

में मान मौजूद है, तो मैं जांचने की कोशिश कर रहा हूं, यदि मेरे डेटाबेस में कोई विशिष्ट मान पहले से मौजूद है। मैं जेडीबीसी का उपयोग कर जावा स्टैंडअलोन ऐप से डाटाबेस एक्सेस कर रहा हूं (डीबी काम में रिकॉर्ड डालने के लिए प्रश्न इसलिए मेरा सेटअप और कनेक्शन ठीक है)।जावा MySQL जांचें कि डेटाबेस

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; 
} 

मैं यह त्रुटि (जाहिरा तौर कुछ मेरी SQL सिंटैक्स साथ कुछ गड़बड़ है) हो रही है:

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 

हालांकि, अगर मैं अपने MySQL कमांड लाइन में इस आदेश पर अमल करने की कोशिश है, यह काम करता है! क्या आप मुझे बता सकते हैं, मेरे बयान में क्या गलत है? किसी भी सुझाव के लिए धन्यवाद!

+2

कृपया, कृपया, कृपया, हमेशा क्वेरी बंधन का उपयोग करें ... हमेशा न केवल आप एसक्यूएल इंजेक्शन हमलों को रोकें, आप डेटाबेस की भी मदद करते हैं क्योंकि यह अगली क्वेरी को तेजी से निष्पादन योजना को कैश करेगा। –

उत्तर

23

तो क्वेरी

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

नहीं

SELECT * from messages WHERE msgid = d-f05708071f8f; 

तो होने की जरूरत है आप, MySQL में उद्धरण में एक String रैप करने के लिए की जरूरत है कोड

पढ़ना चाहिए

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

स्ट्रिंग संयोजन क्वेरी निर्माण के लिए बहुत बुरा व्यवहार माना जाता है का उपयोग करना:

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

मैं एक PreparedStatement मुद्दों के इन प्रकार के और एसक्यूएल इंजेक्शन के किसी भी जोखिम से बचने के उपयोग करने का सुझाव होगा। अब काफी समय से रहा है।

इसके अलावा मैं इस बहुत कम डेटा रिटर्न के रूप में select count(*) बल्कि पूर्ण select * से उपयोग करने का सुझाव होगा (ResultSet के आकार के बारे में सोच) और MySQL यह भी अनुकूलन कर सकते हैं।

final String queryCheck = "SELECT count(*) from messages WHERE msgid = ?"; 
final PreparedStatement ps = conn.prepareStatement(queryCheck); 
ps.setString(1, msgid); 
final ResultSet resultSet = ps.executeQuery(); 
if(resultSet.next()) { 
    final int count = resultSet.getInt(1); 
} 
+0

हाँ, हाइफ़न भूल गए और मैं इसे केवल पूर्णांक के साथ परीक्षण कर रहा था ... मेरा बुरा .. धन्यवाद! – Smajl

3

चूंकि एक वर्चर है, इसलिए आपको एकल कोट्स के साथ खंड में मूल्य को घेरने की आवश्यकता है।

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

गतिशील रूप से पैदा एसक्यूएल तार तथापि सिफारिश नहीं है क्योंकि यह एसक्यूएल इंजेक्शन के लिए आपके आवेदन को बेनकाब कर सकते हैं।

इसके बजाय का उपयोग एक PreparedStatement:

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

आपको बाइंड चर का उपयोग करने की आवश्यकता है।

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

या मैन्युअल उद्धरण प्राप्त करें, लेकिन यह जोखिम भरा है।

एसक्यूएल इंजेक्शन को रोकने के अलावा, तैयार कथन भी प्रदर्शन में सुधार करना चाहिए यदि आप बार-बार वही क्वेरी चलाते हैं।

+1

क्वेरी बाध्यकारी –

3

उपयोग एकल उद्धरण पैरामीटर arount:

"SELECT * FROM messages WHERE msgid = '" + msgid + "'"; 

या बेहतर आप prepared statements का उपयोग करें।क आसपास

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

आप चूक गए उद्धरण:

1

आप आप इस कोशिश कर सकते हैं एकल उद्धरण

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

उपयोग करने के लिए की जरूरत है। (मैं यह सोचते हैं रहा है कि String और नहीं Integer मूल्य है।)

+0

के लिए +1 यहां जवाब देने पर एक सुझाव, यदि कोई उपयोगकर्ता एसक्यूएल प्रश्नों के लिए उपयोग किए जाने वाले स्ट्रिंग्स को जोड़ रहा है, तो हमेशा एक 'प्रीपेडस्टेटमेंट' की अनुशंसा करें, यदि आप नहीं करते हैं तो कई उपयोगकर्ता तुरंत आपको डाउनवोट करेंगे आपको एसक्यूएल इंजेक्शन/तैयारस्टेटमेंट्स का उल्लेख करने के लिए कुछ अपवॉट मिलेगा। –

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)+"')"; 
} 

बस एक साधारण डुप्लिकेट प्रविष्टि एल्गोरिथ्म

संबंधित मुद्दे