Προς το περιεχόμενο

Bοήθεια για sql query σε java..


christomar

Προτεινόμενες αναρτήσεις

Παιδιά προσπαθώ να κάνω μια εφαρμογή, στην οποία έχω checkboxes και μπορώ να επιλέξω παραπάνω από ένα,από τα οποία κρατάω τις τιμές των επιλεγμένων indexes σε μια λίστα.

Στη συνέχεια,με βάση τα checkboxes που θα πατήσω,θέλω να παίρνω κάποια δεδομένα από μία βάση που έχω συνδέσει στην java μου.Αυτό που δεν ξέρω πώς να κάνω είναι πώς να αντιστοιχίσω στο query τη λίστα με τα επιλεγμένα indexes.Δηλαδή θέλω να κάνω για παράδειγμα το query SELECT name FROM person WHERE nameid IN ... γιατί φαντάζομαι ότι με IN γίνεται,εκτός αν έχετε κάποια καλύτερη πρόταση!Τι βάζουμε όμως μετά το ΙΝ??Thanks προκαταβολικά!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχην, οριστε ενα προχειρο reference sql σε περιπτωση που δεν εχεις

http://www.1keydata.com/sql/sqlin.html

 

Οπως λεει, στο in βαζεις τις τιμες διαχωρισμενες με κομμα. Αν ειναι text τις βαζεις σε μονα εισαγωγικα την καθε μια. Αλλα εσυ εχεις αριθμους.

 

Δεν ξερω τι επιλογες δινουν τα chekboxes που εχεις. Επιτρεπουν και ranges μεταξυ τιμων? Σε τετοια περιπτωση δες και το between.

 

Φτιαξε πρωτα το πρωτο string κομματι της sql, SELECT name FROM person.

Αν εισαι σιγουρος οτι παντα θα εχει where βαλτο και αυτο μεσα, διαφορετικα φτιαξε αλλο ενα string " where "

To τριτο string θα εχει ολα τα conditions, η αν θες φτιαχνεις πολλα strings για καθε τυπο condition, πχ ενα τυπου in ενα τυπου between και τα ενωνεις μετα με ενα or.

 

Υποθετω οτι θα εχεις checkboxes που επιτρεπουν κατα περιπτωση μια μια τιμες, πχ τη 10 τη, 20, την 56 και καποια που να επιτρεπουν range οπως απο 10 ως 20

 

Οποτε φτιαχνεις ενα string "nameid in (" + value1 + "," + value2 + ")"

Τα value1, value2 η οσα υπαρχουν θα ειναι τα ονοματα των μεταβλητων στα οποια εχεις τα επιλεγμενα indexes. Αν ο αριθμος των Indexes δεν ειναι δεδομενος θα πρεπει να φτιαξεις το string με καποια διαδικασια προγραμματιστικα (πχ ενα loop) στο οποιο θα κανεις διαδοχικα append το καθε value και κομμα μεχρι να τελειωσουν.

Με παρομοια διαδικασια φτιαχνεις και το Between. Η συνταξη ειναι between value1 and value2.

 

Ολα τα conditions επιτρεπεται (δεν επιβαλλεται) να βρισκονται το καθενα σε δικια του παρενθεση, κατι που εφαρμοζω παντα οταν φτιαχνω δυναμικα statements

Οποτε ενα τυπικο τελικο statement θα ηταν:

 

SELECT name FROM person where (nameid in (4,7,16,34)) or (nameid between 50 and 60)

 

Ξεκινας κανοντας εναν ελεγχο οτι υπαρχουν conditions. Αν ναι, προσθετεις το where και φτιαχνεις το επομενο σκελος.

 

Ελπιζω να καταλαβα σωστα οτι κατι τετοιο ζητουσες

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Koitakse,tha yparxoun checkboxes apo ta opoia mporei kapoios na kanei pollaples epiloges,pes as poume oti tha mporeis na epilekseis 3 onomata kai tha patiseis ena submit button gia na sou emfanisei kapoia stoixeia gia afta ta onomata.Opote krataw tous deiktes twn checkboxes pou epilegei gia na tou deiksw stoixeia apo afta ta onomata,ta opoia omws egw de tha kserw poia einai. Ta stoixeia ola einai se mia vasi dedomenwn,omws kapoia checkboxes einai se ena table,kapoia se allo kai ta loipa.Dhladi pes oti yparxoun 3 checkboxes gia atoma, 5 checkboxes gia panepistimia kai 2 checkboxes gia estiatoria kserw gw.

Kai anyway, h lista afta periexei tous deiktes twn checkboxes pou tha epilexthoun apo ton xristi prin patisei to submit,omws egw den tha kserw poioi tha einai aftoi oi deiktes pou tha epilexthoun..afti einai i aporia mou diladi,pws tha mporesw na valw sto IN,i me kapoion allo tropo tis SQL wste na mporesei na dei tis times pou yparxoun mesa sti lista.Elpizw na min sas mperdevw poly,tha koitaksw kai to link pou mou edwses,thanks gia ti voitheia!an mporeis na me voithiseis pio sygkekrimena tha to ektimousa!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν καταλαβαίνω που κολλάς. Θα κάνεις πρώτα ένα q για να παίρνεις τις πιθανές επιλογές π.χ ονομάτων. Στη συνέχεια ανάλογα με το τι έχει επιλέξει ο χρήστης, θα φτιάχνεις το κατάλληλο string, το οποίο θα ενσωματώνεις στο υπόλοιπο q. Το string δεν θα είναι σταθερό, αλλά θα διαμορφώνεται δυναμικά όπως σου είπε ο bspus.

 

Αυτό με τα checkbox δεν το πιάσα επίσης. Αφού εσύ το φτιάχνεις το checkbox, ρώτα το μετά τι επέλεξε ο χρήστης, να σου πεί..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Νομιζω οτι καταλαβα που κολλας. Το προβλημα σου δεν ειναι η sql και πως θα σχηματισεις το ερωτημα, αλλα πως θα αναγνωρισεις τα id που θα μπουνε στο where. Ο χρηστης θα τα διαλεγει απο καπου, που θα φαινονται τα ονοματα τους αλλα οχι τα id.

Αν εννοεις αυτο, ειχα την ιδια απορια περυσι για δικια μου εργασια. H λυση ειναι μια βοηθητικη κλαση οπως

 

>
public class Item {
/*
* Βοηθητικη κλαση για την αποθηκευση πληροφοριων σε combo boxes και Jlists
* Φτιαχνουμε items δινοντας το κλειδι και ενα string. Στα combobox kai lists
* αυτο που εμφανιζεται ειναι το toString, το οποιο κανουμε override για να 
* δειχνει το string που μας ενδιαφερει
* 
*/

   private int id;
   private String description;

   public Item(int id, String description) {
       this.id = id;
       this.description = description;
   }

   public int getId() {
       return id;
   }

   public String getDescription() {
       return description;
   }

   public String toString() {
       return description;
   }
}

 

Αντι να φτιαχνεις λιστες με string αντικειμενα για να διαλεγει ο χρηστης, φτιαχνε αντικειμενα τυπου Item τα οποια περιλαμβανουν και τα 2 στοιχεια. Στα Jlist, Jcombobox, Jtable κλπ εμφανιζεται το description γιατι αυτα τα GUI αντικειμενα παντα χρησιμοποιουν την πανταχου παρουσα toString οποιουδηποτε object που θελουν να εμφανισουν μεσα στη λιστα τους.

Πλεον, αφου εχεις τα Item σε ενα array η vector (ο,τι σε βολευει, προτεινω vector), για το καθενα, η getid σου επιστρεφει την id.

 

Ελπιζω να ηθελες κατι τετοιο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οποτε φτιαχνεις ενα string "nameid in (" + value1 + "," + value2 + ")"

 

Καλύτερα να χρησιμοποιήσει bind στις variables των querys γιατι με τον παραπάνω τρόπο μπορεί να υπάρξουν προβλήματα με SQL Injection.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλύτερα να χρησιμοποιήσει bind στις variables των querys γιατι με τον παραπάνω τρόπο μπορεί να υπάρξουν προβλήματα με SQL Injection.

 

Μπορεις να δωσεις ενα παραδειγμα?

Πως κανεις bind variable στα queries και πως θα μπορουσε να κανει καποιος sql injection στον παραπανω κωδικα? (πραγματικα δεν εχω ιδεα)

 

Οχι οτι θα εχει σημασια για την εργασια του christomar (γιατι για εργασια το κοβω, ποιος καθεται να γραφει database application σε swing?)

Ασε που μιλαμε για java που σημαινει οτι οποιος ξερει να κανει sql injection προφανως δεν θα εχει και προβλημα να βρει ενα java decompiler και να παρει πληρη, ευαναγνωστο κωδικα απο τα class files. Το θεμα ασφαλειας πασχει γενικως.

 

PS Ασχετο, γιατι clockwerk orange αντι για clockwork orange?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

SQL Injection

statement : query="SELECT * FROM users WHERE name = '" + userName + "';"

Input: βάζεις στο userName a' or 't'='t

Result: SELECT * FROM users WHERE name = 'a' or 't'='t';

 

To παραπάνω παράδειγμα το πείρα απο το Wiki. Μπορείς να φτιάξεις και δικά σου. Απλά μπορεί να είναι περίπλοκο, ανάλογα με το query. Φυσικά μπορείς να έχεις και nested queryes στο Injection.

 

Bind variables σε Java (Έχω καιρό να ασχοληθώ με java, αλλά το παρακάτω μάλλον δουλεύει)

try {

Connection con = DriverManager.getConnection(url);

String select = "SELECT * FROM customer_tbl WHERE customer_id = ?";

PreparedStatement ps = con.prepareStatement(select);

ResultSet rs = null;

for(int i=0;i<10;i++) {

// PreparedStatement Example

ps.setString(1,""+i);

rs = ps.executeQuery();

}

} catch (SQLException sqle) {sqle.printStackTrace();}

 

PS έχεις δίκιο. clockwork είναι. Είπα να γράψω κάτι απλό και το έκανα λάθος :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

SQL Injection

statement : query="SELECT * FROM users WHERE name = '" + userName + "';"

Input: βάζεις στο userName a' or 't'='t

Result: SELECT * FROM users WHERE name = 'a' or 't'='t';

 

To παραπάνω παράδειγμα το πείρα απο το Wiki. Μπορείς να φτιάξεις και δικά σου. Απλά μπορεί να είναι περίπλοκο, ανάλογα με το query. Φυσικά μπορείς να έχεις και nested queryes στο Injection.

 

Bind variables σε Java (Έχω καιρό να ασχοληθώ με java, αλλά το παρακάτω μάλλον δουλεύει)

try {

Connection con = DriverManager.getConnection(url);

String select = "SELECT * FROM customer_tbl WHERE customer_id = ?";

PreparedStatement ps = con.prepareStatement(select);

ResultSet rs = null;

for(int i=0;i<10;i++) {

// PreparedStatement Example

ps.setString(1,""+i);

rs = ps.executeQuery();

}

} catch (SQLException sqle) {sqle.printStackTrace();}

 

PS έχεις δίκιο. clockwork είναι. Είπα να γράψω κάτι απλό και το έκανα λάθος :P

 

Ευχαριστω. Καταλαβα τι εννοεις. Δεν μου ειχε περασει απ το μυαλο γιατι θεωρουσα δεδομενο οτι οι μεταβλητες θα παιρναν συγκεκριμενες τιμες μεσα απο διαδικασιες επιλογης του χρηστη απο checkboxes και lists η comboboxes. Αλιμονο αν αφηναμε τον καθενα να γραφει οτι θελει στο textfield. Το προβλημα του injection λοιπον ελαχιστοποιειται η εξαφανιζεται τελειως.

 

Το δευτερο απ'οτι καταλαβα αποτελει την "javaδικη" εκδοχη των παραμετροποιημενων queries (αυτα που γινονται σε κανονικη sql με το : και ονομα παραμετρου). Χρησιμο κι σιγουρα πιο efficient απο το να φτιαχνεις συνεχεια strings. Αν βεβαια σε ενδιαφερει η αποδοτικοτητα του κωδικα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Και μια list με προκαθορισμένες τιμές να έχεις με ένα sniffer(πχ ethereal) ή proxy (achilles px) μπορείς να δεις ακριβώς τί στέλνεις στον server

 

http://www.insomnia.gr/vb3/newreply.php?do=newreply&p=1900189

 

Δεν με εμποδίζει πχ στο do=newreply να γράψω do=do_the_evil_injection και να το στείλω.

 

Αν και πάλι θα πρέπει πιστεύω να ελέγχουμε σε κάθε input με κάποιο φιλτρο τι έχει γράψει ο χρήστης. (Νταξ αμα φτιαχνεις κάτι για την πάρτη σου σιγα μην κάτσεις να κάνεις τέτοια κόλπα)

 

http://www.milw0rm.com/

Κοίτα στην κατηγορία web apps να δεις τι κόλαση γίνεται με το SQL Injection

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Paidia efxaristw poly gia tis apantiseis sas,tha tis diavasw prosektika otan gyrisw spiti gia na dw pws mporoun na me voithisoun me afto pou thelw na kanw!Vasika de doulevw me Jcheckboxes,se ena site ta exw prosthesei ta checkboxes kai doulevw sto netbeans,to opoio kanei mono tou conenction me tin msql an prostheseis ton antistoixo driver,alla den exw koitaksei akoma pws tha prostethoun ta queries,ta opoia ginontai se ksexwristo arxeio (SQL Command) mesa se ena apo ta arxeia tou project.Anyway,den kserw an exete asxolithei me netbeans,ki egw prwtaris eimai me afto to programma kai prospathw na vrw tin akri!

Kai kati allo an mporei kapoios na me voithisei giati den kserw ti sto kalo ftaiei..gia ti vasi mou xrisimopoiw tin MYSQL apo ton Apache 2.5.7. kai exw kapoious pinakes pou exoun sxesi polla pros polla..etsi loipon ftiaxnw ki enan allo pinaka pou exei ws primary keys ta kleidia twn dio pinakwn, kai ftiaxnw kai indexes pou na deixnoun se afta ta kleidia..episis vazw kai constraint ston kathe ksexwristo pinaka gia na valw pou deixnei to kathe kleidi..otan omws prospathw na ftiaksw ti vasi prosthetontas ton SQL kwdika mou grafei "can´t create table" kai den kserw ti grafw lathos...sorry gia to makroskeles alla i alitheia einai oti prwti fora kanw kati paromoio kai exw mperdeftei ligaki, kai i kathe voitheia einai parapanw apo dekti!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...