08. december 2003 - 19:22Der er
73 kommentarer og 1 løsning
Connecte en db via applet ( mysql)
Hvordan connecter jeg en database på internettet, hvor db er mysql ?
Har prøvet rimelig meget... har fået at vide af nogen at det ikke kan lade sig gøre, men kun hvis man bruger servlets... Passer det? eller er der en vej hvor man kan få sin applet til at snakke med database på nettet?
det skal måske lige nævnes at hvis du lagde en applet ud der kunne connecte til mysql så kan alle og enhver tage den og decompile din kode og finde brugernavn,password,hostname. Er databasen ikke sat sikkert op kan det misbruges...
URL url = new URL("http://www.domain.dk/side.php"); HttpURLConnection con = (HttpURLConnection)url.openConnection(); con.setRequestMethod("POST"); String info = "felt1=value1&felt2=value2"; con.setDoOutput(true); con.getOutputStream().write(info.getBytes()); con.connect(); if(con.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream is = con.getInputStream(); byte[] b = new byte[1000]; int n; while((n = is.read(b)) >= 0) { String line = new String(b,0,n); // process line } is.close(); } con.disconnect();
Well syntes ikke jeg fatter specielt meget af det... Tror du at du kan skære det lidt mere ud i pap ?? både hvordan man sender det fra java og præcist hvad det er man sender... og hvordan man modtager det i php? Kan nemlig ikke rigtig se det udfra det der :(
Mit 08/12-2003 22:34:18 eksempel sende samme request som når en browser submitter en form med 2 felter med navnene felt1 og felt2 som er udfyldt med værdierne value1 og value2.
Og det betyder at det samme PHP script som kunne processe sådan en form submit (og hente data fra databasen baseret på værdierne) også kan kaldes fra appletten.
har nu prøvet at skrive noget af koden ind og prøvet at kigge lidt nærmere på hvordan det fungere... så har lidt spørgsmål... Har lavet en applet med 2 tekstfelter navn og efternavn, og hvordan sender jeg dem videre?
Hvad er con.setRequestMethod("POST"); altså post ?????? hvad er: String info = "felt1=value1&felt2=value2"; ?????
og forstår ikke rigtig hvad der sker i den if sætning der... Kan du ikke lige prøve at forklare det yderligere så jeg forstår hvordan jeg skal takle det?
sætter metoden til POST og ikke GET - den skal bare være der.
String info = "felt1=value1&felt2=value2";
er felternes navne og værdier. De felt værdier henter du så i dit PHP script og bruger til at konstruere den rigtieg SQL sætning som henter de rigtige data.
Ok Starter på Select metoden så :) Nok den der er sværest da den skal kunne returne noget tilbage fra php til java. Men java koden burde være ok nu i det jeg laver iflg det du har skrevet. Der hvor du linker til php siden... popper den side så op i IE eller skal der bare kun være kode i den, hvor den bare læser i den uden at åbne den? og hvordan sender man så info tilbage fra php til java ? og hvordan kan jeg kontrollere at den overhoved når så langt som fra applet til php ???
InputStream is = con.getInputStream(); byte[] b = new byte[1000]; int n; while((n = is.read(b)) >= 0) { String line = new String(b,0,n); // process line } is.close();
læser svaret.
Det kunne modiferes til:
StringBuffer sb = new StringBuffer(""); InputStream is = con.getInputStream(); byte[] b = new byte[1000]; int n; while((n = is.read(b)) >= 0) { String line = new String(b,0,n); sb.append(line); } is.close(); myTextField.setText(sb.toString());
hmm hvad nu hvis jeg f.eks. skal finde navn efternavn alder f.eks. så har jeg jo 3 ting jeg skal hente ud fra db... Du bruger så toString der. Hvordan kan jeg sætte navn efternavn og alder i hvert sit tekstfelt? Kan ikke rigtig se det :(
Hvis jeg nu tillader mig at forudsætte at du bruger Java 1.4.x, så kan du bruge:
PHP sender:
Niels Nielsen 33
Og Appletten læser det som:
StringBuffer sb = new StringBuffer(""); InputStream is = con.getInputStream(); byte[] b = new byte[1000]; int n; while((n = is.read(b)) >= 0) { String line = new String(b,0,n); sb.append(line); } is.close(); String[] parts = sb.toString().split(" "); fornavn.setText(parts[0]); efternavn.setText(parts[1]); alder.setText(parts[2]);
Ved ikke helt hvordan den skal se ud men hvad med noget i den stil her?? ved godt at nederst der ved form ikke helt passer sammen, men hvordan skal det stå?
<?php
if ($submit) { include("header.inc");
$sql = "INSERT INTO tilmelding (navn,efternavn) VALUES ('$navn','$efternavn')";
ok dvs. at det skal stå hvordan ? :) altså felt1 skal vel være = med navn og felt2 skal være = med efternavn.. Eller skal felt1 og felt2 også ændres ? og hvad med den der form method der med post og action hvad gør de helt præcist?
Altså sådan som jeg forstår det, så den der <form method="POST" action="noget.php"> den bliver aktiveret pga den der hedder form i java koden... men den der action="" ved jeg ikke lige hvad gør og heller ikke linierne under.. plz forklar :)
Jamen... det skal der jo ikke stå i koden da den får oplysningerne fra applet jo... Er lidt lost.. kan du ikke prøve at skrive php koden så det er lige til at kopiere?
Tænkte på... Hvordan skal man egentlig lave det hvis man skal hente flere end 1 oplysning ud af gangen? Så hvis du skal lave et eksempel gider du så ikke lave til Insert select og select alle, ville nemlig være super!!! :) Føler mig lidt som en plageånd lige nu....
Tusinde tak!! Har så ikke prøvet dem af endnu men gør jeg senere! :) Muligt at du også gider lave et hvor du selecter flere end 1 ting af gangen? normalt ville jeg bare sætte det ind i en Vector og så bare pille det ud af den.. Men ser lidt mere indviklet ud når det er igennem php.. Btw godt nytår :)
Nice!! Fik lige insert til at virke :) Så mangler jeg bare lige select og de andre små metoder.. Men lidt spørgsmål til den kode du har skrevet... Hvad betyder: or die(mysql_error()) ? er det sådan en fejlmeddelelse hvis den ikke finder tabel eller lign ?
Men mangler at få 1 ud.. altså dvs når jeg henter bare 1 post.. skal den sættes ind i en constructor på f.eks. person.. hvor der er f1 og f2... Sådan som du skriver det får jeg jo kun toString ud fra den. Har du lige et råd der? :D
Hmm forstår ikke helt hvordan jeg skal sætte det ind, eller bare hvordan koden fungere... Kan du ikke prøver at modificere denne metode så den smider det ind i Person classen hvor der er String f1 og String f2 Her er select metoden som KUN skal have 1 post tilbage
Java koden:
public String select(String f1){ Vector v = new Vector(); StringBuffer res = new StringBuffer(""); try { URL url = new URL("http://www.theredcarpet.dk/lasse/applet/Select.php"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); con.setRequestMethod("POST"); String info = "F1=" + f1; con.setDoOutput(true); con.getOutputStream().write(info.getBytes()); con.connect(); if (con.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(con. getInputStream())); String line; while ( (line = br.readLine()) != null) { res.append(line); res.append("\r\n"); } con.disconnect(); } } catch (IOException ex) { ex.printStackTrace(); } return res.toString(); }
PHP koden:
<?php
include("header.inc");
$f1 = $_POST["F1"];
$rs = mysql_query("SELECT $f1 FROM t1") or die(mysql_error()); while ($row = mysql_fetch_array($rs, MYSQL_ASSOC)) { print $row["F1"] . " " . $row["F2"] . "\n"; } mysql_free_result($rs); mysql_close($db); ?>
Hvis vi nu siger at f1 er navn og f2 er efternavn dvs har en klasse, som vi kalder for person, hvor der er constructor mutators og accessors i kun med de 2 attributter. Så når jeg henter det ud fra databasen vil jeg istedetfor at få det ud som en toString som jeg gør nu, så sat det ind i Constructoren så jeg kan arbejde videre med det, det kan jeg jo ikke når det er en toString?
Fik at vide det var en god ide at bruge den der StringTokenizer, men ham jeg spurgte vidste ikke lige hvordan man brugte, men har du lige et eksempel der?
Hmm forstår ikke lige hvad der sker.. Kunne man få dig til at udspesificere det lidt plz? er s toStringen man skal smide ind? skal xxx yyy zzz forstås som at der er 3 poster i den 2 string? Og Hvordan smider jeg hver enkelt information ind i en attribut?
Har fået svar på det nu:) Tror ikke jeg har flere spørgsmål nu:) Så slipper du for mig lidt tid heh, men tusinde tak for hjælpen!! har hjulpet RIMELIG meget!!!
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.