MySQL Datenbank per PHP erreichen

A

akkulader

Ambitioniertes Mitglied
0
Moin moin


Ich plane, meine App mit dem Internetz zu verbinden.
Bis jetzt habe ich als beste Möglichkeit für mich entdeckt, bei meinem Hoster eine PHP Datei zu erstellen, die ich dann in meiner Activity per HTTP Request ansprechen kann.


Jetzt folgende Anfängerfragen:

1) Ist das die einfachste und lohnendste Methode?

2) Kann ich auch verschiedene Tabellen der Datenbank abfragen und deren Daten in anderen Tabellen abspeichern?
(Eine Tabelle enthält bei mir beispielsweise die Spieltage und die andere die Mannschaften)
Ich meine: Es steht in der PHP Datei geschrieben, welche Tabelle angesprochen werden soll.

4) Kann man auch nur gewisse Werte aus der Datenbank auslesen und diese direkt speichern, ohne nen ganzen Stream zu bekommen, den man mühsam aufsplitten muss.
Also so in der Art: int tore = datenbank.getTore(mannschaftA)

3) Vor allem: Kennt ihr ein gutes Tutorial dafür?^^


Ich wäre euch sehr dankbar für Hilfe!!!:unsure:

Hier mal kurz meine PHP und meine Activity, damit ihr seht, was ich meine.

Code:
<?php

$host="localhost"; //replace with database hostname 
$username="username"; //replace with database username 
$password="password"; //replace with database password 
$db_name="dbname"; //replace with database name

mysql_connect("$host","$username","$password");
mysql_select_db("$db_name")or die("cannot select DB");

$q=mysql_query("SELECT * FROM user");
while($e=mysql_fetch_assoc($q)) $output[]=$e;

print(json_encode($output));

mysql_close();
?>


package de.example.dbtest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Toast;



public class MainActivity extends ListActivity implements OnClickListener {

InputStream is;
ArrayList<String> results = new ArrayList<String>();
JSONObject json_data;
Boolean dataComplete = false;
private String line;
private String result;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(this);
getData();

while(!this.dataComplete){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
this.fillList();

}


@Override
public void onClick(View v)
{
Runnable r = new Runnable(){
@Override
public void run()
{
getData();
}

};
Thread t = new Thread(r);
t.start();
}






public void getData(){

Thread t = new Thread(){

String result ="";
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

public void run()
{

try{

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("link zur datenbank");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();

}catch(Exception e){
Log.e("log_tag", "Fehler bei der http Verbindung" + e.toString());
}

try{
BufferedReader reader = new BufferedReader (new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;

while((line = reader.readLine()) != null){
sb.append(line + "n");
}
is.close();
result = sb.toString();
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}

try{
JSONArray jArray = new JSONArray(result);
for(int i = 0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
results.add((String) json_data.getString("id") + " " + json_data.get("name"));
}
dataComplete = true;
}catch(JSONException e){
Log.e("log_tag", "Error parsing data "+e.toString());
}
}

};


t.start();
}



public void fillList()
{
this.setListAdapter(new ArrayAdapter <String>(this, android.R.layout.simple_list_item_1, results));

}
 
1) Es ist zumindest eine einfache und - wenn mans denn richtig macht - sichere Methode. Du könntest auch direkt aus der App auf den MySQL-Server zugreifen, aber das ist ungefähr so sicher wie eine Kartoffel als Antivirenprogramm...
2) 4) Mit MySQL geht ALLES... :D
Zwar nicht wie bei dir, aber z.B. mit "SELECT tore FROM tortabelle WHERE mannschaft = 'A'"
3) Ja, aber eins reicht dir nicht ;)
Zugriff mit PHP: http://www.peterkropff.de/site/php/mysqli.htm sieht ganz gut aus, lies dir da auch unbedingt das zu Advanced MySQL durch...
Die SQL-Sprache: http://www.1keydata.com/de/sql/
Um das ganze auch noch sicher zu bekommen: http://serpentsembrace.wordpress.co...ormance-durch-mysqli-und-prepared-statements/
 
momar schrieb:
Zugriff mit PHP: PHP - MySQLi sieht ganz gut aus, lies dir da auch unbedingt das zu Advanced MySQL durch...

Gibt's denn genau so eine gute Anleitung auch für das normale MySQL? Ich glaube das reicht mir^^
 
Das i in MySQLi steht für improved. MySQLi kann objektorientiert benutzt werden ($db->query("...") statt mysqli_query($db, "...")), und es beherrscht neuere MySQL-Sachen. Ansonsten ist es identisch zu den MySQL-Funktionen, d.h. du kannst nehmen was dir passt - einziger Unterschied ist ob da ein i steht oder nicht. Aber da das i kein wirklicher Tippaufwand ist, würde ich mal das nehmen, einfach weils neuer ist und mehr kann ;)
P.S. die Prepared Statements sind übrigens auch nur in MySQLi enthalten...
 
Hallo,
habe am Wochenende zum ersten Mal genau das implementiert was du auch vor hast. War schon ein bisschen Arbeit, jedenfalls wenn man es das erste Mal macht^^
Bin auch über das ein oder andere Tutorial gestolpert ("gestolpert" triffts wohl ganz gut, da die meisten ziemlich für die Füße sind - wenig Erklärung viel nicht-funktionierender Code etc und schlechtes Englisch habe ich hauptsächlich gefunden^^)...
Daher möchte ich dir ganz stark DAS von kosmus empfehlen,meiner Meinung nach absolute Oberklasse, was er hier bereitstellt.

Zur Vorgehensweise mit dem Hoster:
Ich habs jetzt so gemacht, dass ich meinen PC 24/7 laufen lasse und per No-IP ("dynDNS") meinen "eigenen Server" betreibe, bei Strato wars mir irgendwann zu blöd mich auf den Seiten durch Werbung etc. durchzuklicken^^.
https://www.android-hilfe.de/kosmus
 
Wenn wer einen Hoster sucht, ich kann bplaced.net sehr empfehlen.
Bin seit ca 2 Jahren da angemeldet, bisher nur 1x wegen Wartung down, keine Spammails (nur wenn man sich 3 Monate nicht eingeloggt hat eine Erinnerung da ungenutzte Accounts gelöscht werden)
1-2 GB Webspace, unlimited Traffic und mehrere MySQL-Datenbanken (incl PHPmyAdmin).
Und Werbung gibt es nur auf 404-Seiten.
Ist evtl kostengünstiger als einen PC 24/7 laufen zu lassen ;)

Edit: Soll jetzt keine Werbung sein, sondern eher eine Empfehlung :D
 
Vergesst doch eure Hosterempfehlungen, wozu gibt's Uberspace.de? 10GB, unendlich Datenbanken, alle Programmiersprachen und SSH-Zugriff für mehr als 49 Cent im Monat... Aber das ist hier ja der falsche Thread für sowas...
Ne im Ernst, PC den ganzen Tag laufenlassen für ne Datenbank ist teurer als jeder Hoster, und auch noch unsicherer und öfter down... Lasst sowas für den Produktiv-Einsatz doch bitte bleiben!
@Topic wg. dem Codeschnipsel: du kannst den Datenbanknamen direkt in mysql(i)_connect() reinschreiben ;)
Außerdem brauchst du array_push statt deinem merkwürdigen Zeug und mysql_close möchte doch sicher die Verbindung wissen...
 
Kk, dann werde ich mir das mal ansehen. "Produktiv-Einsatz" ist vielleicht auch etwas uebertrieben.. Meine App ist derzeit ist im Alpha-Status mit Null Installationen (habe aber auch noch niemand drauf aufmerksam gemacht^^) Mir gings erstmal nur darum den Code frei vom Localhost (besser gesagt "Outdoor") zu testen.
Trotzdem vielen Dank fuer den Hinweis. Ich finde, dass ein Tipp immer berechtigt ist erwaehnt zu werden, wenn der jenige Gruende dafuer nennen kann, so wie du es getan hast - hier von "Werbung" zu sprechen faende ich jedenfalls etwas weithergeholt^^
Und letztlich hat die Wahl des Anbieters uU einen eben so grossen Einfluss auf die Funktionstuechtigkeit wie der Code selbst, jedenfalls dann wenn der Anbieter schlecht ist. :D
 
Natürlich kannst du das mit einer Menge .php Routinen für jede Menge Anfragen nutzen.

1 Datei Mannschaft / 1 Datei Spieler / 1 Datei was weiss ich,
das Problem bei einer solchen Lösung - sie ist schwer wartbar / erweiterbar.

Entweder du schreibst Dir selber eine kleine Api -> Request per JSON
Beispiel für den gesamten Workflow hier

How to create REST API for Android app using PHP, Slim and MySQL - Day 1/2

oder wenn du keinen Bock hast die ganze REST Sache selber zu schreiben kannst du auch auf ein REST Framework zurückgreifen

https://www.luracast.com/products/restler



Der Vorteil?
Eine definierte Schnittstelle mit Standards ist immer was "handfestes", wenn jetzt irgendein Programmierer zu deinem Team stösst und die Daten deiner DB für die IPhone Version deiner App braucht dann ist das 1,2 fix implementiert.
 
  • Danke
Reaktionen: ui_3k1

Ähnliche Themen

S
Antworten
33
Aufrufe
2.646
Sempervivum
S
B
Antworten
6
Aufrufe
1.046
jogimuc
J
B
Antworten
0
Aufrufe
684
basementmedia
B
Zurück
Oben Unten