Avatar billede zapzie Nybegynder
09. juli 2004 - 13:01 Der er 30 kommentarer og
1 løsning

Adgang til localhost

Jeg vil gerne lave et program, hvor jeg kan tilføje/slette i en mysql database. Problemet er bare at jeg kun har adgang til databasen via localhost.

Kan jeg på en eller anden måde få adgang til databasen fra en Frame?
Har tænkt på at få programmet til at lave en php-side med sql-sætninger og så på en eller anden måde få den til at uploade det til serveren og kører det.
Er der andre måder, eller bliver jeg nødt til at gøre det med en applet, hvis det overhovedet er muligt, der er jo nogle begrænsninger.

Jeg kan også lave det i html/php, men det er jeg ikke lige så skrap til, så det vil jeg helst undgå.

Håber i forstår hvad jeg mener, ellers spørg.
Avatar billede arne_v Ekspert
09. juli 2004 - 13:29 #1
Hvis din MySQL database kun kan tilgåes fra localhost, så er der jo begrænsede
muligheder:

client app på samme system---(JDBC)---MySQL

client app---(HTTP)---PHP---MySQL

applet---(HTTP)---PHP---MySQL
Avatar billede arne_v Ekspert
09. juli 2004 - 13:31 #2
Jeg tror ikke at det er nødvendigt at uploade PHP scripts for at lave de sidste.
Avatar billede zapzie Nybegynder
09. juli 2004 - 13:32 #3
Programmet ligger ikke på samme system.

client app --- (HTTP) --- PHP --- MySQL, skal det forstås som at jeg skal lave en php side og køre den?
Avatar billede zapzie Nybegynder
09. juli 2004 - 13:33 #4
Er der ikke begrænsninger på en applet, så den ikke kan skrive på disken eller noget i den stil?
Avatar billede arne_v Ekspert
09. juli 2004 - 13:39 #5
Jo en applet kan ikke med standard sikkerheds indstilling bruge harddisken
på client PC.
Avatar billede arne_v Ekspert
09. juli 2004 - 13:41 #6
Det fungerer sådan at din client app eller applet har et GUI interface. Brugeren
indtaster så data i den GUI. Og når brugeren submitter så sender Java en HTTP
request til et PHP script som gemmer i databasen.

Tilsvarende når der skal hentes data. Java requester data fra et PHP script der
henter i databasen. Data formateres så og vises i GUI.

Jeg har engang lavet et lille eksempel:

java applet---PHP script---MySQL database
Avatar billede arne_v Ekspert
09. juli 2004 - 13:50 #7
DatabaseApplet.java:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.*;

public class DatabaseApplet extends Applet implements ActionListener {
    TextArea select = new TextArea();
    TextField f1 = new TextField();
    TextField f2 = new TextField();
    Button insert = new Button();
    public void init() {
        select.setColumns(40);
        select.setRows(20);
        select.setText(select());
        f1.setColumns(10);
        f2.setColumns(20);
        insert.setLabel("Add");
        insert.addActionListener(this);
        add(select, null);
        add(f1, null);
        add(f2, null);
        add(insert, null);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent ev) {
        insert(f1.getText(), f2.getText());
        select.setText(select());
        repaint();
    }
    private String select() {
        StringBuffer res = new StringBuffer("");
        try {
            URL url = new URL("http://localhost/select.php");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            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();
    }
    private void insert(String f1, String f2) {
        try {
            URL url = new URL("http://localhost/insert.php");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            String info = "F1=" + f1 + "&F2=" + f2;
            con.setDoOutput(true);
            con.getOutputStream().write(info.getBytes());
            con.connect();
            if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.err.println("POST failed");
            }
            con.disconnect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

insert.php:

<?php
$con = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("Test") or die(mysql_error());
$f1 = $_POST["F1"];
$f2 = $_POST["F2"];
mysql_query("INSERT INTO T1(F1,F2) VALUES($f1,'$f2')") or die(mysql_error());
mysql_close($con);
?>

select.php:

<?php
$con = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("Test") or die(mysql_error());
$rs = mysql_query("SELECT * 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($con);
?>

Så det er altså ikke så svært igen.
Avatar billede zapzie Nybegynder
09. juli 2004 - 13:51 #8
Kan du hjælpe mig med at lave det? Eller hvor kan jeg finde det eksempel?
Avatar billede zapzie Nybegynder
09. juli 2004 - 13:52 #9
Tak, der var du lige lidt hurtigere end mig :). Jeg går i gang med det samme.

Kan jeg gøre det samme med en JFrame?
Avatar billede arne_v Ekspert
09. juli 2004 - 13:53 #10
Sagtens.
Avatar billede zapzie Nybegynder
09. juli 2004 - 14:00 #11
Hvis man nu skrive insert om til:
update.php

<?php
$con = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("Test") or die(mysql_error());
$sql = $_POST["sql"];
mysql_update($sql) or die(mysql_error());
mysql_close($con);
?>

Så kan man vel bare lave sqlsætningen i java og så sende hele den over. Så kan den jo alle update ting og er ikke begrænset så meget. Eller vil det ikke virke?
Der skal vel stå mysql_update(), skal der ikke?
Avatar billede zapzie Nybegynder
09. juli 2004 - 14:28 #12
Næ, der skulle stå query.
Men det virker jo fint ..
Avatar billede arne_v Ekspert
09. juli 2004 - 15:01 #13
Jep.

Det var det jeg tænkte på med min 13:31:36 kommentar !
Avatar billede arne_v Ekspert
09. juli 2004 - 15:02 #14
OK at jeg ligger svar nu ?
Avatar billede zapzie Nybegynder
11. juli 2004 - 13:14 #15
Ja, du skal da lige have dine points.. mange tak.
Avatar billede zapzie Nybegynder
11. juli 2004 - 22:34 #16
Har problemer med at den ikke skriver æ, ø og å'er rigtigt i databasen. Har du en ide til hvordan jeg kan fikse det?
Avatar billede arne_v Ekspert
11. juli 2004 - 23:50 #17
Måske.

Men du skal nok lige beskrive lidt mere præcist hvordan  problemet giver
sig udslag.
Avatar billede zapzie Nybegynder
12. juli 2004 - 13:58 #18
Nå jeg skriver et æ, et ø eller et å i en af tekstfelterne i mit java program, og så gemmer det ned i mysql-databasen via den php-side jeg har lavet, så bliver de skrevet sådan her i databasen:

æ = æ
ø = ø
å = Ã¥
Æ = Æ
Ø = Ø
Å = Ã…
Avatar billede zapzie Nybegynder
12. juli 2004 - 14:25 #19
Nå jeg læser det ind i java igen, så bliver det vist rigtigt.
I databasen og når jeg henter det ud på hjemmesiden, bliver det vist forkert!

Et andet problem er hvis der bliver gemt noget med linjeskift, så går det galt når jeg prøver at hente det ind i java programmet igen. Men det ser jeg lige om jeg selv kan fikse.
Avatar billede arne_v Ekspert
12. juli 2004 - 14:27 #20
Det er fordi at de bliver gemt som UTF-8.

Prøv evt. at erstatte:

con.getOutputStream().write(info.getBytes());

med:

con.getOutputStream().write(info.getBytes("ISO-8859-1"));
Avatar billede zapzie Nybegynder
12. juli 2004 - 14:33 #21
Jepper.. det virker tak.
Avatar billede zapzie Nybegynder
12. juli 2004 - 14:44 #22
Jeg ser lige at linjeskift ikke kommer med på hjemmesiden, selvom de er i databasen. Skal jeg udskifte linjeskift med et/nogle tegn?
Avatar billede arne_v Ekspert
12. juli 2004 - 14:48 #23
Indeni <PRE></PRE> bør linieskift vises korrekt.

Udenfor ignorerer HTML linieskift. Der skal man erstatte linieskift med <BR/>.

Det mener jeg at PHP har en funktion til.
Avatar billede zapzie Nybegynder
12. juli 2004 - 14:51 #24
Ok, det kigger jeg da lige på.
Avatar billede zapzie Nybegynder
12. juli 2004 - 14:57 #25
Jo, det med <PRE> </PRE> virkede fint.
Men når jeg henter det ind i java, bruger jeg readline, til at hente de forskellige rækker fra databasen ud, men hvis der er lavet en linjeskift i en af felterne går det galt. Kan man ikke sætte et sluttegn ind og så bruge det til at bestemme hvornår der kommer en ny række? Og hvilken reader er det så lige man skal bruge til det?
Eller er der en mere elegant måde?
Avatar billede arne_v Ekspert
12. juli 2004 - 15:01 #26
readLine forventer rigtige linie skift.

Men du kan konvertere mellem <n og <BR/> i både Java og PHP, så
hvis du bliver enig om i hvilken form data skal være forskellige
steder så er det bare at konvertere.
Avatar billede arne_v Ekspert
12. juli 2004 - 15:01 #27
\n
Avatar billede zapzie Nybegynder
12. juli 2004 - 15:29 #28
Ja tak igen igen.
Tror ikke der er mere nu. :)
Avatar billede zapzie Nybegynder
13. juli 2004 - 12:37 #29
Det fik jeg lige skrevet lidt for tidligt.
Når jeg nu henter noget, fra databasen, tilbage i java-programmet, bliver æ, ø og å vist som en firkant.
Hvordan kan det fikses? Skal det konverteres tilbage til UTF-8, og hvordan gør man så det?
Avatar billede arne_v Ekspert
13. juli 2004 - 12:53 #30
Prøv og angiv eksplicit at du læser ISO-8859-1.

F.eks.:

BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "ISO-8859-1"));
Avatar billede zapzie Nybegynder
13. juli 2004 - 13:27 #31
Jep det virkede.
Tak, nu tror jeg det virker helt som det skal.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester