Login mit MySQL

J

JoMedics

Neues Mitglied
0
Hallo liebe Community,

ich habe ein kleines Problemchen.
In der Schule müssen wir eine kleine Android-App als Projekt schreiben. Ich will mir einen Login mit einer entsprechenden Registrierung machen, was alle Daten (Name, Passwort, E-Mail und Klasse) in eine Datenbank speichert und somit automatisch abläuft. Gleich vorne weg, es soll KEINE lokale Datenbank(also SQLite) sein, sondern will es Online mit MySQL erreichen um so von überall zugreifen zu können.
Ich habe mich schon etwas in Datenbanken eingearbeitet, stehe aber trotzdem noch ziemlich am Anfang. Ich habe natürlich erst (so einige Stunden) meinen besten Freund Google bemüht, aber nichts anständiges gefunden, nur "Tutorials" ala "so sieht die App aus, jetzt schreibst du dir noch ein kleines PHP-Skript und das war's". Tutorial heißt für mich verständlich Schritt für Schritt.

Wie dem auch sei, ich habe die App von der Oberfläche soweit fertig und habe mit Eclipse schon ein kleines Programm, um auf die Datenbank zuzugreifen (ich werde zur Verständlichkeit einfach Eclipse und Android Studio sagen. Die App programmiere ich in Android Studio, Java für den Computer in Eclipse).
Mit dem Connector/J funktioniert es eigentlich ziemlich gut, daher würde ich das gerne nach Möglichkeit in die App übernehmen und auf PHP verzichten. Hab da zwar Grundkenntnisse, aber würde trotzdem lieber das bekanntere benutzen.


Mir stehen momentan folgende Fragen im Wege:
- Wie greife ich mit der App auf die Datenbank zu, welche später online sein wird? (auch Connector/J? und ich hab mal was von bind-adress gelesen?)
- Ich werde vermutlich einen Webspace-Anbieter mit MySQL-Zugriff suchen (Angebote mit guten Erfahrungen natürlich gerne gesehen), aber auch da frage ich mich, wie genau der Zugriff dann für mich aussehen wird, per Putty o.ä.?

In diesem Bereich bin ich leider ziemlich unerfahren, aber ich will das unbedingt lernen!
Wenn daher jemand ein gutes Tutorial für mich hätte wäre ich natürlich auch äußerst dankbar, ich will nicht nur den Code abtippen sondern auch verstehen können. Natürlich kann man sich den Code anschauen und rumspielen was ich immer mache und hat bisher auch immer einwandfrei funktioniert, aber das ist meist nur ein kleiner Teil und ich würde gerne das gesamte dahinter verstehen.


Vielen Dank schon mal im Voraus, ich hoffe jemand kann mir da helfen!

MfG JoMedics



Hier die Quellcodes von Eclipse und die zwei XML-Dateien von Android Studio (die Java-Dateien in AS sind hier erst mal nicht notwendig, ist nur die Oberfläche da der DB-Zugriff noch nicht steht, kann sie aber auf Wunsch später gerne nachreichen):

content_registering.xml:

Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  android:paddingBottom="@dimen/activity_vertical_margin"
  app:layout_behavior="@string/appbar_scrolling_view_behavior"
  tools:showIn="@layout/activity_registering"
  tools:context=".RegisteringActivity"
  >


  <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textAppearance="?android:attr/textAppearanceMedium"
  android:text="Name:"
  android:id="@+id/textView"
  android:layout_alignParentTop="true"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true"
  android:layout_marginTop="34dp" />

  <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textAppearance="?android:attr/textAppearanceMedium"
  android:text="Passwort"
  android:id="@+id/textView2"
  android:layout_below="@+id/textView"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true"
  android:layout_marginTop="34dp" />

  <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textAppearance="?android:attr/textAppearanceMedium"
  android:text="Passwort wiederholen:"
  android:id="@+id/textView3"
  android:layout_below="@+id/textView2"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true"
  android:layout_marginTop="34dp"
  android:layout_alignRight="@+id/textView5"
  android:layout_alignEnd="@+id/textView5" />

  <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textAppearance="?android:attr/textAppearanceMedium"
  android:text="E-Mail:"
  android:id="@+id/textView4"
  android:layout_centerVertical="true"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true" />

  <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textAppearance="?android:attr/textAppearanceMedium"
  android:text="E-Mail wiederholen"
  android:id="@+id/textView5"
  android:layout_marginTop="46dp"
  android:layout_below="@+id/et_email"
  android:layout_alignLeft="@+id/cb_agb"
  android:layout_alignStart="@+id/cb_agb" />

  <CheckBox
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="AGBŽs gelesen und akzeptiert"
  android:id="@+id/cb_agb"
  android:layout_marginTop="53dp"
  android:checked="false"
  android:layout_below="@+id/textView5"
  android:layout_alignParentLeft="true"
  android:layout_alignParentStart="true" />

  <EditText
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:ems="10"
  android:id="@+id/et_name"
  android:layout_above="@+id/textView2"
  android:layout_toEndOf="@+id/textView3"
  android:layout_toRightOf="@+id/textView3" />

  <EditText
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:inputType="textPassword"
  android:ems="10"
  android:id="@+id/et_password"
  android:layout_above="@+id/textView3"
  android:layout_alignParentRight="true"
  android:layout_alignParentEnd="true"
  android:layout_alignLeft="@+id/et_password_2"
  android:layout_alignStart="@+id/et_password_2" />

  <EditText
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:inputType="textPassword"
  android:ems="10"
  android:id="@+id/et_password_2"
  android:layout_alignBottom="@+id/textView3"
  android:layout_alignLeft="@+id/et_name"
  android:layout_alignStart="@+id/et_name" />

  <EditText
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:inputType="textEmailAddress"
  android:ems="10"
  android:id="@+id/et_email"
  android:layout_alignBottom="@+id/textView4"
  android:layout_alignLeft="@+id/et_password_2"
  android:layout_alignStart="@+id/et_password_2" />

  <EditText
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:inputType="textEmailAddress"
  android:ems="10"
  android:id="@+id/et_email_2"
  android:layout_above="@+id/cb_agb"
  android:layout_alignLeft="@+id/et_email"
  android:layout_alignStart="@+id/et_email" />

  <Button
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Absenden"
  android:id="@+id/btn_submit"
  android:layout_alignTop="@+id/cb_agb"
  android:layout_alignRight="@+id/et_name"
  android:layout_alignEnd="@+id/et_name" />



</RelativeLayout>


activity_login.xml:

Code:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center_horizontal"
  android:orientation="vertical"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="lukas.myapplication.LoginActivity">

  <!-- Login progress -->
  <ProgressBar
  android:id="@+id/login_progress" style="?android:attr/actionBarTabStyle"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginBottom="8dp"
  android:visibility="gone" />

  <ScrollView android:id="@+id/login_form" android:layout_width="match_parent"
  android:layout_height="match_parent">

  <LinearLayout android:id="@+id/email_login_form" android:layout_width="match_parent"
  android:layout_height="wrap_content" android:orientation="vertical">

  <android.support.design.widget.TextInputLayout android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <AutoCompleteTextView android:id="@+id/email" android:layout_width="match_parent"
  android:layout_height="wrap_content" android:hint="@string/prompt_email"
  android:inputType="textEmailAddress" android:maxLines="1"
  android:singleLine="true" />

  </android.support.design.widget.TextInputLayout>

  <android.support.design.widget.TextInputLayout android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <EditText android:id="@+id/password" android:layout_width="match_parent"
  android:layout_height="wrap_content" android:hint="Passwort"
  android:imeActionId="@+id/login"
  android:imeActionLabel="@string/action_sign_in_short"
  android:imeOptions="actionUnspecified" android:inputType="textPassword"
  android:maxLines="1" android:singleLine="true" />

  </android.support.design.widget.TextInputLayout>

  <Button android:id="@+id/email_sign_in_button" style="?android:textAppearanceSmall"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="30dp"
  android:text="Anmelden"
  android:textStyle="bold" />

  <Button
  android:id="@+id/registering_button"
  android:layout_width="120dp"
  android:layout_marginLeft="200dp"
  android:layout_height="match_parent"
  android:layout_marginTop="150dp"
  android:text="Registrieren"
  android:layout_gravity="right" />

  <TextView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_marginTop="-35dp"
  android:textAppearance="?android:attr/textAppearanceLarge"
  android:text="Noch kein Konto?"

  />

  </LinearLayout>

  </ScrollView>



</LinearLayout>
 
ConnectorJ bei Maven Central verfügbar und du könntest es in dein Android Projekt einbinden, aber ich würde eher davon abraten JDBC in einer App zu verwenden. Es bietet m. E. drei Nachteile
1. Eine enge Kopplung zwischen Client-App und der DB auf dem Server.
2. Du müsstest die Zugangsdaten in der Client-App hinterlegen. Andere könnten die Daten auslesen und damit deine DB kaputt machen.
3. Viele DB Hoster (gerade die kostenlosen) beschränken den Zugriff auf die Datenbank von außen. Es können dann nur Anwendungen, die auf dem Server laufen, auf die DB zugreifen. Das ist im Grunde auch sehr vernünftig.

Wenn du es trotzdem unbedingt mit JDBC machen willst, geht es in Android im Grunde wie in normalem Java. Du musst nur daran denken die Internet Permission in das Manifest zu schreiben und Netzwerkoperationen müssen in Android immer in einem parallelen Thread laufen.
 
  • Danke
Reaktionen: JoMedics
Hallo,

vielen Dank schon mal.
Allerdings wirft mir das gleich wieder neue Fragen entgegen, ich geh das mal gewohnt von oben nach unten durch.

1. Wieso ist eine enge Kopplung zwischen Client-App und DB deiner Meinung nach ein Nachteil? So nach dem theoretischen würde ich das als Vorteil sehen. Da die App direkt auf die DB zugreift müssen keine Umwege gemacht werden was nochmal Zeit brauchen und gleichzeitig mehr Möglichkeiten zum Abgreifen der Daten bieten würde.
2. Ich hab mir gedacht, dass der Client sich mit Name, E-Mail und Passwort (Klasse spielt hier keine Rolle für den Login) registriert und beim Login den Namen oder E-Mail und ein Passwort angibt, in der DB wird überprüft, ob ein User mit genau diesen Daten vorhanden ist und dann eine entsprechende Rückmeldung gibt, der dann den Login gewährt oder eben nicht, da würden die Zugangsdaten nicht in der App liegen (soweit ich es mir vorstelle und verstanden habe). Und wenn ich es richtig verstanden hab mit PHP übergibt man dem Skript nur die Daten, der spricht die Datenbank an und gibt nach deren Auswertung eine entsprechende Rückmeldung. Praktisch nur das gleiche, nur über einen kleinen Umweg über das Skript.
3. Ich würde als Administrator natürlich schon gerne auf die Datenbank zugreifen können wie im Terminal (nutze mittlerweile größtenteils Linux). Ich will auch der einzige sein und bleiben, der direkten Zugriff auf die Datenbank hat. Wenn das nicht möglich ist müsste ich meinen eigenen Server irgendwie einrichten müssen..

Wie gesagt, ich bin neu in der Datenbank-Welt, ich programmiere größtenteils in Java.
Ich bestehe nicht unbedingt darauf JDBC zu benutzen wenn es wirklich große Nachteile hat, aber ich hätte es gerne in die Richtung getan da ich Java schon kenne und mein Programm in nicht mehr als 5 Minuten problemlos seinen Zweck erfüllt hat, sonst müsste ich mich erst noch in PHP arbeiten (oder empfiehlst du da nochmal was anderes?).
 
Der Nachteil einer engen Kopplung liegt daran, dass du an der Datenbank nur wenig Änderungen vornehmen kannst, ohne dass du die App auch updaten musst. Vielleicht stellst du irgendwann fest MySQL ist doch nicht so die richtige Lösung und du möchtest zukünftig PostgreSQL: So ein eine Umstellung würde die App gar nicht merken, wenn du nicht direkt über JDBC, sondern über ein PHP Skript zugreifst. Selbst einfache Änderungen wie z. B. das Umbenennen einer Tabellenspalte würden dazu führen, dass du eine neue Version der App raus bringen müsstest. Deine User könnten deinen Service nicht mehr nutzen, bis sie das Update installiert haben und dabei bringt das Update keine für sie erkennbaren Vorteile.
Aber es stimmt schon diese Probleme treten eher bei großen Projekten auf und bei dir wird die enge Koppelung nicht so schlimm sein.

Mit Zugangsdaten meinte ich nicht die Login Daten des einzelnen Anwenders, sondern die Daten mit denen deine Anwendung die Verbindung zur Datenbank herstellt. In der Regel hat man dafür zwar neben dem Admin User wengistens einen weiteren User, aber wenn dieser weitere User insert, update oder delete Rechte hat, kann er damit schon gut Schaden anrichten.

Zum letzten Punkt bin ich ehrlich gesagt überfragt, möglicherweise gibt es Hoster die einen direkten Zugriff erlauben. Persönlich habe ich die Erfahrung gemacht, dass der Datenbankzugriff über ein Webinterface wie PHPMyAdmin erfolgt.
[doublepost=1449178108,1449177822][/doublepost]Wenn du möchtest, dann Poste mal deine JDBC Zugriffe und dann können wir darüber reden, wie man das mit PHP machen könnte
 
  • Danke
Reaktionen: JoMedics
Okay, das stimmt natürlich, das vernichtet meine Vorstellung sofort, da ich wahrscheinlich besonders am Anfang einiges ändern werden muss bei größeren Projekten. Da muss ich wohl auf PHP umsteigen, für kleinere Sachen die nur mich betreffen reicht JDBC aus.

Das stimmt. Als erstes will ich, dass dieses Projekt relativ stabil läuft, aber dann wird die Sicherheit bei mir definitiv eine große Rolle spielen. Hab mich damit in letzter Zeit ziemlich viel befasst und will wahrscheinlich möglichst in der Richtung studieren.

Dann werd ich mich die Tage mal damit befassen, googlen bis die Tasten glühen und dann hier Rückmeldung geben :)



Ich hab dieses kleine Beispiel aus einem Buch, nur leicht abgeändert, eine Sache von 10 Minuten da ich noch nicht zu mehr gekommen bin, aber hier meine 2 Klassen:



Database_Test.java:
Code:
package JDBC;

public class Database_Test {

    public static void main(String[] args) {


        MySQLTest test = new MySQLTest();
        test.setUpConnection();

    }

}


MySQLTest.java:
Code:
package JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MySQLTest {
   
    private Connection conn;
    private String trennung ="--------------------------------------------";
   
        public void setUpConnection() {

            try {

                conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/TestDB", "name", "passwort");  //name und passwort behalt ich mal für mich
                testQuery();
               
               
            } catch (SQLException e) {

                System.out.println("SQLException: " + e.getMessage());
                System.out.println("SQLState: " + e.getSQLState());
                System.out.println("VendorError: " + e.getErrorCode());
                e.printStackTrace();

            }


        }

        public void testQuery() {
           
            Statement stmt;
           
           
           
            try {
               
                stmt = conn.createStatement();
                ResultSet resultSet = stmt.executeQuery("USE TestDB");
       
                PreparedStatement stmt2 = conn.prepareStatement("INSERT INTO test_db (vorname, nachname, gruppe) VALUES(?, ?, ?);");
                stmt2.setString(1, "vorname2");
                stmt2.setString(2, "nachname2");
                stmt2.setString(3, "gruppe3");
               
                //stmt2 = conn.prepareStatement("DELETE FROM user WHERE vorname = 'vorname2'");
               
                stmt2.execute();
                stmt2.close();
               
               
                resultSet = stmt.executeQuery("SELECT * FROM test_db");
      
                while (resultSet.next()) {
                   
                    System.out.println("Name: " + resultSet.getString("vorname") + " " + resultSet.getString("nachname"));
                    System.out.println("Gruppe: " + resultSet.getString("gruppe"));
                    System.out.println(trennung + resultSet.getInt("user_id")+ ". Reihe" +trennung);
                   
                   
                } resultSet.close();
                stmt.close();
               
            } catch (SQLException e) {
               
                System.out.println("SQLException: " + e.getMessage());
                System.out.println("SQLState: " + e.getSQLState());
                System.out.println("VendorError: " + e.getErrorCode());
                e.printStackTrace();
               
            }   
           
        }

}


Die Ausgabe verwirrt mich ein bisschen. Ich habe alle Reihen mit DELETE gelöscht, das Feld mit ID hab ich auf auto_increment. Nach dem Löschen einer Reihe wird die ID aber anscheinend verändert bzw. beim Löschen aller nicht zurückgesetzt, kann man das irgendwie ändern/umgehen?

Name: vorname1 nachname1
Gruppe: gruppe2
--------------------------------------------6. Reihe--------------------------------------------
Name: vorname2 nachname2
Gruppe: gruppe3
--------------------------------------------7. Reihe--------------------------------------------
 
Du könntest natürlich auch eine Rest-Schnittstelle benutzen (Statt einer direkten Koppelung). Die Datenbankschnittstelle muss du natürlich absichern. (JDBC muss man nicht direkt ansprechen, man kann so etwas auch kapseln. Stichwort DAO und DTO).
Ein recht gutes Beispiel für ein DAO:
How do I implement a DAO manager using JDBC and connection pools?

Die ganze Sache in Java zu bauen ist natürlich recht sportlich. Es gibt Frameworks wie Spring, die Dir so eine Konstruktion erleichtern. Wahrscheinlich ist Java in Deinen Fall nicht die richtige Wahl, da man schon etwas Zeit und Erfahrung mitbringen muss, um so etwas vernünftig zu implementieren.

PHP ist die einfachere und schnellere Lösung. :)
[doublepost=1449183584,1449183146][/doublepost]PS:
Dein Beispielcode ist schon eine direkte Einladung für ungebetene Gäste, sich ungeniert in der Datenbank zu bedienen. ;)
 
  • Danke
Reaktionen: JoMedics
Werd ich mir morgen gleich anschauen, vielen Dank!
Java muss für die App natürlich trotzdem sein, die Frage ist eben wie man am besten die Kommunikation zwischen App und DB bewerkstelligt, direkt oder eine andere Möglichkeit.


Da dieser Code zu 90% aus dem Buch besteht und zu 8% aus einem Tutorial im Internet kommt mit ein bisschen Mühe jeder da dran, hier ist kein Geheimnis, Algorithmus oder sonst was versteckt den man schützen müsste (noch zumindest)
Wenn ich das ganze als größeres Projekt machen will wird das ganze natürlich komplett anders aussehen, mir ist bewusst das dieser Code hier keine große Hürde ist. Aber es gibt mir einen kleinen Einblick wie das ganze funktioniert, es ist nur lokal auf meinem Laptop und sowieso im Buch/Internet zu erhalten.
Von dem her würde ich mich darum eher weniger sorgen, sondern wie ich die Kommunikation zwischen App und Datenbank aufrichten kann.

Aber du hast mir schon extrem viel geholfen, und auch das ist ein guter Tipp, vielen Dank! :)
 
Meinte das Backend. Sprich für die App Java, für das Backend PHP.

Leute die ein Java - Backend programmieren können, werden schon gesucht, aber man sollte schon recht viel Zeit mitbringen, wenn man sich damit beschäftigen will. PHP ist einfach die schnellere Lösung.
 
  • Danke
Reaktionen: JoMedics
Was ist denn genau ein Backend?


So nach dem ganzen werde ich um PHP wohl für größere Projekte erst mal nicht rumkommen wie es aussieht oder?
Wenn ich etwas an der Datenbank ändern will hätte ich entweder per Terminal oder einer extra kleinen App die Änderung vorgenommen, aber ich schätze mal PHP wird da eher eure Empfehlung sein.
Wenn ihr noch Tipps oder evtl. ein Tutorial hättet wäre das ziemlich hilfreich, sonst würde ich mich mal dran machen mich da in PHP einzuarbeiten, wenn dann Probleme auftauchen oder etwas gutes dabei rauskommen sollte werde ich mich natürlich wieder hierhin wenden :)

Vielen Dank schon mal an alle, hat mir wirklich jetzt schon sehr geholfen und hab auch schon einiges gelernt.
 
Wenn du vorhast ein wirklich größeres Projekt umzusetzen würde ich um PHP einen großen Bogen machen und auf der Serverseite sowas wie JavaEE oder c# einsetzen. PHP ist imho totaler Murks, aber ist halt überall dabei.
Nachteil bei der Java/C# Lösung ist halt, dass man einen richtigen Server braucht statt einfach nur Webspace mit PHP. Hier bietet sich aber zum Beispiel auch die Google App Engine an, dort ist ein bestimmtes Kontingent kostenlos.
 
Wirklich groß wird es erst mal nicht werden, das wird noch lange brauchen bis ich mich an ein wirklich großes Projekt wagen kann/werde.

Wie gesagt, erst mal will ich eine Online-Datenbank für Login/Registrierung für ca 30 Personen, die danach auf eine andere Activity geleitet werden.
Am Anfang werde ich wahrscheinlich ein paar Sachen ändern müssen, daher bräuchte ich natürlich Zugriff auf die Datenbank.

Was wäre für diese Größenordnung denn am besten bzw. für Anfänger möglich?
 
hi Jo,

sicher wirst Du nur begrenzt Zeit haben für das Projekt. Ich schätze mal es ist eine der üblichen Projektarbeiten für die 3-4 Wochen Zeit bleiben.
Wenn Du eine funktionierende App abliefern musst, dann tue genau das mit einfachsten Mitteln und informiere Dich gut über die Vor- und Nachteile
deiner Lösung und dokumentiere diese so ausführlich wie es nur geht.

Hast Du kein direkten DB-Zugriff, dann vergiss JDBC und nimm PHP. Habt Ihr ein lokalen Server und WLAN in der Schule, dann mach es halt mit JDBC direkt ( wenn Du schon am Desktop einen funktionierenden Einstieg geschafft hast ).

Kläre ab welche Voraussetzungen Du bei der Abnahme hast. Die werden jedenfalls bisher nicht wirklich unmissverständlich von Dir genannt.
Wenn Kosmus schreibt: "der Datenbankzugriff über ein Webinterface wie PHPMyAdmin erfolgt" Ist Deine Antwort später: "Wenn ich etwas an der Datenbank ändern will hätte ich entweder per Terminal oder einer extra kleinen App die Änderung vorgenommen, aber ich schätze mal PHP wird da eher eure Empfehlung sein."

Etwas strukturierter musst Du schon arbeiten. Ich nehme an Du hast auf deinem Laptop nur den MySQL-Server installiert, ansonsten wäre Dir phpMyAdmin
schon längst vor die Füße gefallen - mindestens mit einer WAMP Installation und auf einer Linux-Frickelkiste sowieso !

Du hast die Möglichkeit in deiner App dir beide Wege offen zu halten, wenn die JDBC Verbindung funktioniert, ergänze den Aufruf des PHP-Scriptes mit
Parameter-Übergabe und Ergebnis-Rückgabe ( JSON ).

Bau Dir ein Script, was die Parameter als Ergebnis einfach wieder zurück liefert. Erst wenn das funktioniert und Du Dir sicher bist das der Aufruf aus Android-App
arbeitet, dann ergänze das PHP-Script um den Datenbankzugriff.

Erarbeite Dir den Ablauf der Registrierung. Ob Du Passwörter im Klartext überträgst oder nicht ( und damit etwas mehr Aufwand hast ) ist völlig egal.
Wichtig ist nur, dass Du bekannte Mängel deiner funktionierenden Lösung dokumentierst und ansonsten wenig logische Mängel enthalten sind !

Warum Ihr Hoster suchen müsst um die Aufgabe zu lösen ist mir völlig unverständlich. Wenn die Schule das Projektergebnis später real verwenden möchte
kann diese doch selbst den Server stellen. Um die Aufgabe zu lösen käme für Dich eine Umgebung aus Linux-VM und WLAN Zugriff am nächsten den späteren realen Bedingungen. Fällt es Dir leichter mit einer WAMP Installation klar zu kommen, nimm diese und vergiss Linux-VM.

und ja : "conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/TestDB".

Wenn Du ein reales Gerät hast, nimm das und lass die Finger von den ätzend langsamen Emulatoren. Andere Möglichkeit, der Code stammt aus einer
NICHT-Android-App. Es bleibt offen ob der von Dir verwendete Connector auch tatsächlich in einer Android-Umgebung funktioniert !

Kleine überschaubare Aufgabe, aber für Anfänger durchaus viel Arbeit.
 
  • Danke
Reaktionen: JoMedics
Hallo,
vielen Dank auch dir erst einmal.

Ich hätte mehr auf die Bedingungen des Projektes gehen sollen, my bad, sorry. Ich habe sogar minimum 3-4 Monate Zeit für diese App, als Thema hab ich einfach nur Login und Registrierung mithilfe einer Datenbank gewählt, es spielt nicht mal eine Rolle ob online oder offline. Also stehen mir da so ziemlich alle Türen offen, aber da ich mich auch weiterhin mit Datenbanken beschäftigen will, möchte ich da schon die Grundlagen lernen, verstehen und nicht nur irgendwas hinkleistern einfach nur dass es läuft.

Ob ich nun direkten Zugriff auf die DB habe oder nicht kann ich ja eben noch nicht sagen, da mir die Auswahl des Servers noch fehlt, aber würde das natürlich gerne haben. Den Server der Schule dürfen wir nicht benutzen, wir dürfen dort so gut wie gar nichts (haben wohl Angst wir würden ihr Netzwerk auseinander bauen, selbst Wireshark dürfen wir nur unter absoluter Aufsicht eines Lehrers benutzen, Vortrag musste ich über Handy-Hotspot machen) und habe auch gar nicht vor das auf den Schulserver zu legen.
phpMyAdmin ist mir zwar auch bekannt, aber damit hab ich mich noch gar nicht befasst, und vielleicht sollte ich dazu sagen dass ich auf meinem PC Windows 7 und auf dem Laptop Ubuntu 15.04 UND Windows 8.1 habe, allerdings benutze ich zu 95% Linux.

Wie auch immer, mir fehlt am meisten der Zugriff auf die DB, also wie das erfolgen soll.

"Bau Dir ein Script, was die Parameter als Ergebnis einfach wieder zurück liefert. Erst wenn das funktioniert und Du Dir sicher bist das der Aufruf aus Android-App arbeitet, dann ergänze das PHP-Script um den Datenbankzugriff." Damit kann ich herzlich wenig mit anfangen wie ich anfangs erwähnt habe. Ich bin in dem Bereich neu und "bau dir ein Skript" hilft mir da leider recht wenig wenn ich nicht weiß wie, das ist ja genau mein Problem.

Warum ich einen Hoster möchte hat folgende Gründe:
1. Ich habe zwar einen alten, kleinen Server, aber den muss ich erst komplett neu aufsetzen. Für Tests okay, aber mein Vater will nicht dass ich unser Netzwerk nach außen öffne solange ich es nicht ordentlich absichern kann, somit fällt das spätestens nach funktionierender Schnittstelle ins Wasser.
2. Den Schulserver darf und will ich nicht benutzen, und die Schule hat keinerlei Interesse an der App, genauso wenig wie an denen der anderen meiner Klasse.
3. Würde ich mich gerne erst mal um die Kommunikation kümmern, statt gleichzeitig noch einen kompletten Server einrichten und absichern zu müssen. Sonst wird es wahrscheinlich zu viel, ich hab privat auch meine eigenen Probleme die sich nicht in 2 Minuten lösen lassen und Fachabitur braucht auch seine Zeit.



Ich fasse mal alles kurz zusammen:

Ich muss eine Android-App mit Login + Registrierung mithilfe einer Datenbank (offline oder online egal, aber ich will online) realisieren, restlicher Zeitraum sind mindestens 3-4 Monate, mehr ist nicht festgelegt aber mehr natürlich immer gerne gesehen. Ich bin neu im Bereich der Datenbanken, daher hilft mir ein "bau dir ein Skript" herzlich wenig. Ein kleines Tutorial der Grundladen würde mir allerdings fast schon reichen sofern keine großen Probleme auftreten, mir fehlt meist nur die Quelle und den Rest kann ich mir dann eigentlich immer selbst Schritt für Schritt beibringen.
Ich benötige einen Server (zu Testzwecken geht auch mein kleiner (2TB) sobald der aufgesetzt ist, aber nur in meinem Netzwerk), aber würde wahrscheinlich eher zu einem Hoster tendieren. Mein größtes Problem ist die Schnittstelle der Kommunikation zwischen Datenbank und App, es gibt ja einige Möglichkeiten (phpMyAdmin, PHP, JDBC, etc. pp), es sollen am Ende etwa 30 Leute drauf zugreifen können, auch wenn es erst mal reicht wenn man sich einfach registrieren und einloggen kann.
 
Hallo,

dann ist alles halb so wild. Wie man unter PHP eine Datenbank (am besten MySQL) einrichtet, gibt es unzählige Anleitungen. Für die Verbindung zur App benutzt du einen einfachen HTTP-Request (Wenn du noch Zeit hast, kannst du HTTPS benutzen). Sprich du übergibst einfach User und Password an den Server, überprüfst die Werte auf dem Server, und gibst das Ergebnis der Prüfung an den Server zurück. Die Wahl des Server ist erst mal zweitrangig, Hauptsache er unterstützt deine Datenbank.

Für die Netzwerk-Schnittstelle unter Android solltest Du HttpUrlConnection benutzen. HttpClient ist seit Android 6.0 nicht mehr Teil des Frameworks (und einfach nicht mehr performant genug).

HttpURLConnection | Android Developers
Processes and Threads | Android Developers

Java für die Datenbank ist völlig überdimensioniert, und wahrscheinlich auch zu komplex.
 
JoMedics schrieb:
"Bau Dir ein Script, was die Parameter als Ergebnis einfach wieder zurück liefert. Erst wenn das funktioniert und Du Dir sicher bist das der Aufruf aus Android-App arbeitet, dann ergänze das PHP-Script um den Datenbankzugriff." Damit kann ich herzlich wenig mit anfangen wie ich anfangs erwähnt habe. Ich bin in dem Bereich neu und "bau dir ein Skript" hilft mir da leider recht wenig wenn ich nicht weiß wie, das ist ja genau mein Problem.
Was RED BACON damit meinte ist, dass dein PHP Skript noch nicht wirklich auf die DB zugreifen muss um den client zu programmieren:
Also etwas wie dieses Skript:
PHP:
<?php
if($_POST["user"] == "tester" && $_POST["passwort"] == "geheim") {
echo "true";
} else {
echo "false";
}
?>
Dieses Skript vergleicht nur die über POST übergebenen Werte von user und passwort, das reicht aus um in Android die Übergabe von Werten über eine HTTPConnection zu testen. Für die Registrierung machst du dir ein ähnliches Skript, dass erstmal nur prüft ob alles vollständig ausgefüllt wurde. Wenn du dann diesen Teil einer App fertig hast, kannst du dich mit der PHP Entwicklung beschäftigen und deine App zum Testen der PHP Skripte nutzen.
 
  • Danke
Reaktionen: JoMedics
Genau,

damit das aber funktioniert, müssen die Parameter in Android-App HTTPUrlConnection wohl auch expliziet als "POST" - Parameter
angegeben werden. Um das Script ohne App zu prüfen kannst Du $_POST in $_GET ändern und das Script über die URL im Browser
http://127.0.0.1/scriptname.php?user=tester&passwort=geheim
aufrufen. Mit HTTPUrlConnection geht das natürlich auch, es gibt nur eben ein Unterschied der Aufrufe, das weisst Du aber vll. auch schon.
Das True oder False erhältst Du dann in der App per HTTPResonse (?)

Im nächsten Schritt erstezt Du echo "true" / "false"; durch eine Rückgabe im JSON-Format PHP: json_encode - Manual
In der App erhälst Du dann das Resultat auch in HTTPResponse und schaust Dir an wie Du das Ergebnis in ein Java-Object bekommst.
JsonReader | Android Developers

Auch hier bietet sich an, mit einer fest definierten "JSON-Antwort" die Funktionalität in der App zu realisieren ohne auf eine Verbindung zum
Server angewiesen zu sein.

Wenn Du es nicht nur "hinklatschen" willst, was sehr löblich ist :) dann versuche Dich mit dem Gedanken anzufreunden Unit-Tests zu erstellen.
Wichtig ist dabei gar nicht, dass Du gigantischen Aufwand treibst. Allein die Denkweise Interfaces zu definieren und zu verwenden für Objekte
bringt Dich schon mal sehr viel weiter.

In dem Bsp. könntes Du ein Interface: Communication definieren mit den Methoden Request und Response. Dein TestObject enthält eine
leere Methode Request, und liefert Dir die fest definierte "JSON-Antwort" zurück. Das RealObject führt in Request die tatsächliche Anfrage an
den Server aus und liefert Dir das tatsächliche Ergebnis.
In dem beschriebenen Beispiel könnte so der JsonReader ( und nur dieser ) unabhängig von anderen Bedingungen/Abhängigkeiten einzeln
getestet werden ohne dein App-Code zu "zerreissen/kommentieren/Code ersetzen" oder ein Test-Projekt expliziet anzulegen.

Sinn des ganzen ist weite Teile deiner App funktional prüfen zu können ohne später in den Code einzugreifen. Es werden nur andere Objekte
instanziert in der realen App ( die hinter den Interfaces hängen ).

Bei 3-4 Monaten hast Du dafür genug Zeit.
 
  • Danke
Reaktionen: JoMedics
Vielen vielen Dank euch,
das bringt mich wirklich weiter!

Das Thema Datenbanken und die Kommunikation ist schon ziemlich kompliziert, vor allem am Anfang, aber es interessiert mich wirklich und ich will es lernen und verstehen, daher bin ich um jeden Tipp extrem dankbar! Ihr habt mir wirklich extrem viel zum nachlesen und ausprobieren gegeben, ich werd mich die nächsten Tage damit intensiv befassen und mich mal daran versuchen und werde mich dann mit den entsprechenden Erfolgen der Problemen wieder melden.


Ich werd das mal zusammenfassen ob ich das richtig verstanden hab, nicht das ich falsch beginne:

In der App werden per HTTPUrlConnection per POST-Parameter das Skript aufrufen (ohne Server GET), welches mir dann ein echo "false" bzw "true" zurückgibt. Wenn das funktioniert, soll die Rückgabe im JSON-Format zurückgegeben werden.

Wenn es funktioniert und die Zeit noch reicht, kann man HTTPS verwenden.
Die Abfrage, ob alles ausgefüllt ist, würde ich allerdings in der App machen (das hab ich auch schon gemacht), denn ich will auch das Passwort und E-Mail 2 mal eingeben und überprüfen lassen ob sie gleich sind bzw. das Passwort lange genug.

Durch das Skript bräuchte man dann auch keinen direkten Server-Zugriff, somit könnte ich auch einen Hoster suchen ohne direkten DB-Zugriff, einfach das Skript auf den Server legen und ansprechen.


Hab ich das so richtig erfasst?
Dann würde ich mich da mal ransetzen und das ganze mal versuchen und entsprechende Rückmeldung geben. Schon mal vielen vielen Dank euch allen! Da wir in der Schule leider sowas nicht dran nehmen aber mich das sehr interessiert, will ich das ganze lernen und auch verstehen, um alleine und auch größere Projekte realisieren zu können und bin somit am Anfang auch andere Hilfe angewiesen, die ich hier absolut bekomme.
 
Ja, so ähnlich. Ist alles nicht so kompliziert.

Ist eigentlich, dass gleiche, wie bei einer normalen Webseite.Du rufst einen Link mit ein paar Parameter auf. Statt dem vom Server übermittelten String in einem Browser darzustellen, wertet die App diesen aus, und macht dann irgendwelche Dinge.

Dieses kann man dann beliebig verkomplizieren, aber das Grundprinzip ist recht einfach.

Einfach anfangen. Bau ruhig am Anfang eine einfache Lösung, die funktioniert (Ohne den ganzen foobar (Https, Post, usw).
Wenn die Lösung läuft, kannst du sie dann in Ruhe ausbauen. Wenn dann etwas schiefgehen sollte, hast du immer etwas, was du abgeben kannst.
 
  • Danke
Reaktionen: JoMedics
Alles klar, vielen vielen Dank euch! Nach genau sowas hab ich gesucht.

Ich werd mich dann ab morgen dran setzen und mich dann wieder melden wenn es Probleme oder Fragen gibt.
 
Heyho,

ging nun leider etwas länger, ich war in den letzten Tagen zu beschäftigt, aber wie erwartet meld ich mich natürlich wieder.. :biggrin:


So, ich hab ein kleines PHP-Skript mit dem ich per URL ein paar Kleinigkeiten tun kann wie beschrieben und ein kleines Beispiel mit JSON decode/encode, hier kurz der Quelltext:

PHP:
<!DOCTYPE html>
<html>
<link href="design.css" type="text/css" rel="stylesheet">
<head>
<meta charset="utf-8" />
<title>Connection-Test</title>
</head>
    <body>

   
        <?php
       
            echo "Name: " . $_GET["user"];
            echo "</br>";
            echo "Password: " . $_GET["pw"];
           
            echo "</br>";
            echo "</br>";
           
            if ($_GET["user"] == "user" && $_GET["pw"] == "pw")           
                echo "Benutzer registriert";
            else echo "Benutzer noch nicht registriert :(";   

           
            echo "</br>";
            echo "</br>";
            echo "</br>";
            echo "JSON-Test";
            echo "</br>";
            echo "</br>";
           
           
            $namen = '{"Fabian":20,"Stefan":65,"Simon":18,"Joerg":60,"Bettina":12,"Uwe":18,"Mark":15,"Franz":65,"Heinz":90}';
            print_r(json_decode($namen));
           
            echo "</br>";
            echo "</br>";
           
            $namen = array(
                'Fabian'    =>  20,
                'Stefan'    =>  65,
                'Simon'     =>  18,
                'Joerg'     =>  60,
                'Bettina'   =>  12,
                'Uwe'       =>  18,
                'Mark'      =>  15,
                'Franz'     =>  65,
                'Heinz'     =>  90
            );
           
            echo json_encode($namen);

       
    ?>
       
       
    </body>
</html>


und die Ausgabe dazu:

Name: user
Password: pw

Benutzer registriert


JSON-Test

stdClass Object ( [Fabian] => 20 [Stefan] => 65 [Simon] => 18 [Joerg] => 60 [Bettina] => 12 [Uwe] => 18 [Mark] => 15 [Franz] => 65 [Heinz] => 90 )

{"Fabian":20,"Stefan":65,"Simon":18,"Joerg":60,"Bettina":12,"Uwe":18,"Mark":15,"Franz":65,"Heinz":90}




Soweit so gut, das funktioniert alles. Allerdings hab ich jetzt Probleme, wie ich das in die App packen soll.. :blushing:
Könnte mir da jemand eine kleine Hilfe geben? :confused2:



Vielen Dank schon mal im Voraus :thumbsup:
 

Ähnliche Themen

F
Antworten
0
Aufrufe
837
FlorianAlfredo
F
S
Antworten
33
Aufrufe
2.674
Sempervivum
S
J
Antworten
0
Aufrufe
557
JoEntwickler
J
Zurück
Oben Unten