MySQL Datenbankanbindung mit PHP


Wie praktisch ist es doch, wenn man die in einem Script anfallenden Daten in einer Datenbank speichern kann. Dazu verwenden wir in diesem Fall eine MySQL Datenbank auf http://www.bplaced.net/. Auf der Plattform sind nach der Anmeldung bis zu 8 Datenbanken erstellbar.

Mein Beispiel sollte die Ergebnisse eines Facebook Users bei einem Online-Game (programmiert in ProcessingJS) zwecks Highscore Listenerstellung in einer Datenbank abspeichern.

Wir werden uns hier anschauen, wie man Daten mit der Hilfe von kleinen PHP Scripts von Processing aus in eine MySQL Datenbank übertragen kann. Das ist besonders bei der Verwendung von ProcessingJS praktisch, da man vom Browser aus keine Berechtigung hat, Dateien zu erstellen und zu verändern. Somit bleibt eigentlich nur der Weg über die Datenbank.

Also beginnen wir mit der Erstellung der Datenbank. Das kann auf bplaced.net sehr kompfortabel über phpmyadmin erledigt werden.

PhpMyAdmin Tutorial: http://www.vms-tutorial.de/wiki/PhpMyAdmin#Zugang_zu_phpMyAdmin

Ich will mich hier nicht weiter mit Datenbankgrundlagen beschäftigen. Einschlägige Tutorials sind überall im Netz zu finden. Zum Beispiel hier: PHP und MySQL Einführung

Datenbank erstellen

Wir erstellen also hier nun eine Datenbank laut Anleitung: http://eass.bplaced.net/4-Datenbanken.

Beliebiger Name, bei mir: „facebook„. Und darin eine Tabelle mit dem Namen „Ergebnisse„.

In dieser Tabelle legen wir nun 4 Spalten an:

  1. ID: mit autoincrement, bewirkt eine eindeutige Kennung für jeden Eintrag
  2. fbid: speichert in userem Beispiel eine Zahl vom Typ bigint mit den jeweiligen Facebook-UserID’s
  3. name: Name des Facebook-Users als String
  4. score:  Das Ergebnis bei einem fiktiven Facebook-Spiel

Datenbank füllen:

Wenn die Struktur der Datenbank steht können wir versuchen Daten mit PHP per get oder post über http in die Datenbank einzutragen.

Hilfreich ist hier diese Seite: http://www.tutorialspoint.com/mysql/index.htm. Sie enthält für alle wichtigen Aufgaben Quellcode in SQL und PHP. Mehr braucht man nur selten!

Vorsicht: XXXXXX ist mit entsprechenden Werten zu ersetzten!

<?PHP

//Variablen für den Verbindugsaufbau
$dbhost = 'localhost';
$dbuser = 'XXXXXX';
$dbpass = 'XXXXXX';
$dbname = 'kobe_facebook';

//Verbindung wird aufgebaut
$dblink = mysql_connect("$dbhost", "$dbuser", "$dbpass")  or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db("$dbname");

//Variablen werden aus über GET entgegengenommen.
$fbid = $_GET['fbid'];
$name = $_GET['name'];
$score = $_GET['score'];

//Variablen werden in die Datenbank geschrieben
$result = mysql_query("INSERT INTO ergebnisse (fbid, name, score) VALUES ('$fbid','$name','$score')");

//Abfrage auf Fehler
if(! $result )
{
die('Could not enter data: ' . mysql_error());
}

//Datenbankverbindung wird geschlossen
mysql_close($dblink);
?>

So. Will man dieses Script mit ProcessingJS nutzen kann, muss man es im Sketchordner unter /template_js speichern. Ist der Ordner nicht vorhanden, kann er mit im Processing Menü mit –> JavaScript –> Show Custom Template erstellt werden. Wenn man nun den Sketch „Exportiert“, wird von Processing automatisch ein Ordner mit dem Namen applet_js erstellt, der dann alles nötige (auch den Inhalt von /template_js) enthält. Der Inhalt dieses Ordners wird jetzt per FTP (z.B.: mit Filezilla) auf bplaced hochgeladen.

Nun ist es möglich die Tabellen-Spalten fbid, name und score mit den von uns über http:// übertragenen Werten zu befüllen.

Ein entsprechender Request könnte so aussehen:

http://username.bplaced.net/folder/setfb.php?fbid=88888888&name=richard%20stallman&score=89

Wobei username der Benutzername bei pblaced und folder der Ordner auf pblaced ist, in dem sich das PHP-Script befindet.

Wenn eine Probeübertragung geklappt hat, kann man nun auch Scripte schreiben, die Daten auslesen, oder die Datenbank updaten.

Daten auslesen:

Damit man überhaupt, um bei unserem Beispiel HighscoreListe zu bleiben, entschieden werden kann, ob jemand schon registriert ist, oder nicht, nehmen wir eine kleine Änderung im Code vor (nach dem Verbindungsaufbau):

//Variablen werden aus über GET entgegengenommen.
$fbid = $_GET['fbid'];

//der Eintrag zur entsprechenden fbid wird aufgerufen
$result = mysql_query("SELECT * FROM ergebnisse WHERE fbid='$fbid'", $dblink);

//kein Eintrag zur fbid
if(mysql_num_rows($result)==0){
echo"noData;";
}

//Eintrag vorhanden
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo "isthere;";
echo $row['score'];
}

Wenn jemand schon in der Datenbank registriert ist, sollte nämlich kein neuer Eintrag erstellt werden, sondern ein Update stattfinden. Andernfalls wird ein neuer Eintrag erstellt.

Getestet kann das Script so werden:

http://username.bplaced.net/folder/fbidlookup.php?fbid=88888888

Update eines Datensatzes:

Ist zu einem bestimmten User schon ein Eintrag vorhanden und er übertrifft aber seine persönliche Bestmarke, dann soll der Eintrag score ein Update erfahren. Die Umsetzung ist hier so, dass das PHP Script ein Update durchführt, aber nur aufgerufen wird, wenn dies gewünscht ist.


//Variablen werden aus über GET entgegengenommen.
$fbid = $_GET['fbid'];
$name = $_GET['name'];
$score = $_GET['score'];

//Update des Wertes für score
$result = mysql_query("UPDATE ergebnisse SET score=$score WHERE fbid=$fbid");

//Falls das nicht funktioniert hat
if(! $result )
{
die('Could not enter data: ' . mysql_error());
}

http://username.bplaced.net/folder/updatefb.php?fbid=88888888&name=richard%20stallman&score=89

Kommunikation Processing mit PHP:

Processing bringt die Funktion loadStrings() mit, die  Ergebnisse einer solchen Anfrage in ein StringArray schreibt. Dieses Array kann dann mit Hilfer der split()- Funktion weiter zerlegt werden. So werden auch komplexe Abfagen mit relativ wenig Code analysierbar.

</pre>
//Aufruf des PHP Scripts fbidlookup mit der fbid als Parameter

String [] InList=loadStrings("http://username.bplaced.net/folder/fbidlookup.php?fbid="+uid);

// Ergebnis ausplitten
String[] list = split(InList[0], ';');
<blockquote>

Ausgabe des Scripts:
InList[0] = isthere;89

list[0]=“isthere“;

list[1]=“89″;

Geschafft. Nur eine Kleinigkeit: list[1] kann natürlich nicht mit einer float oder int -Variable verglichen werden, da sie vom Typ String ist.

Mit der Anweisung

parseFloat(list[1]

kann man mit dem Inhalt aber zum Beispiel eine float Variable füllen.

Fertig!

Ergänzung:

Hat man größere Datenmengen zu übertragen, wird das den Programmablauf empfindlich stören. Die Lösung wäre dann die Abfragen in einem eigenen Thread vorzunehmen.

Advertisements

3 Kommentare

  1. Pingback: Processing – Über dieses Weblog « processing – tutorial

  2. Gute Idee, aber wenn jemand den Query http://username.bplaced.net/folder/updatefb.php?fbid=88888888&name=richard%20stallman&score=89 kennt, kann er den Highscore manipulieren indem er den Query einfach über den Browser aufruft und bei score seine Punkte eingibt. Eine alternative wäre noch die SQLibrary, da bin ich gerade am basteln.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: