Mysql Datenbankzugriff mit Gml

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Mysql Datenbankzugriff mit Gml

      Ich habe mal wieder zu viel Zeit gehabt...

      Heut morgen kam ich zu einer kleinen Diskusion mit mir selber:
      Ich-> Wie es wohl wäre, wenn man eine art Gästebuch im Spiel hätte?
      Ich-> Ein Gäsebuch in einem Spiel? Strange...
      Ich-> Kann man ja auch für andere Sachen benutzen, wie zum beispiel für Accounts. Dann kann jeder User deine Fortschritte sehen.
      Ich-> Klingt gut, wollen wir sowas machen?
      Ich-> Ja, ich hätte Zeit..

      So, das war dann auch schon der spaßige Teil.

      Um das zu realisiern, brauchen wir die Http.dll vom guten alten Bl@cksp@rk, einen Webspace mit einer Database und Php (da gibt es viele kostenlose möglichkeiten), ein paar kenntnisse in PHP und GML. Das sollte es schon gewesen sein. Als erstes muss man sich immer im klaren sein, was man alles Speichern will. Ich habe mich für Name, E-mail, Homepage und Kommentar entschieden. Es gibt da 2. möglichkeiten diese in die Database zu schreiben:
      1. Ein formular von einer Homepage aus.
      2. Die Informationen vom Game aus an die PHP datei senden.
      Ich wurde nicht schlüssig mit mir selber, und deshalb habe ich beide möglichkeiten realisiert.
      Der eigentliche unterschied zwischen den beiden PHP dateien ist eigentlich nur das die die für die Homepage gedacht ist, ein formular hat. Diese gibt einen Text wieder, wenn ein z.B. ein feld leer gelassen wurde. Die andere Version (die fürs Game) bekommt die Werte von der Http.dll übermittelt, und gibt eine Zahl wieder. Wenn man z.B nicht die E-mail angibt, gibt diese Version keinen Text wieder, wäre ja auch schwachsinnig, sondern ein Zahl. In diesem fall die 3 (glaub ich).
      Das auslesen der Database ist wohl der einfachste Akt. Diw Php datei ließt die Database aus, "genneriert" einen text, und übergibt ihn dann an unser Programm.
      So, schluß mit Theorie..

      Schauen wir uns doch erst mal den SQL script an, der die Tabelle in unser Mysql Database anlegt:
      Spoiler anzeigen

      SQL-Abfrage

      1. CREATE TABLE IF NOT EXISTS `users` (
      2. `name` char(255) NOT NULL,
      3. `email` char(255) NOT NULL,
      4. `homepage` char(255) NOT NULL,
      5. `komment` char(255) NOT NULL
      6. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
      Da ich jetzt nicht damit rechne, das die meisten sich damit auskennen, sage ich nur soviel. Unter phpmyadmin.domain.de kann man diesen SQL code ausführen, dann wird alles so eingerichtet, wie wir es in unserem Example brauchen. Die SQL datei liegt außerdem auch bei.

      Als nächsets knüpfen wir uns die Php dateien auf vor. Diese sollten auf dem webspace liegen.
      Wie wir schon im theoretischen Teil fesstgestellt haben, gibt es 3 dateien. Die die sich mit Php auskennen, werden sofort verstehen was ich das gemacht habe. Für den rest habe ich alles gut durchkommentiert. Diese dateien liegen (wie alle) bei.
      Spoiler anzeigen
      Diese code ist für die Homepage. Wie sie aussieht kann man hier sehen

      PHP-Quellcode

      1. New User
      2. ".$meldung.""; // dem benutzer bescheid geben, das alles geklappt hat
      3. }
      4. // jetzt kommt das formular drann, das hingegen ist nur simples html
      5. if(!$_POST['flag'])
      6. {
      7. ?>
      8. Nick (Name) E-Mail
      9. Homepage (optinal) Kommentar
      10. <!--?php
      11. }
      12. ?>
      Alles anzeigen
      Spoiler anzeigen
      Diese Datei schreibt ebenfalls die Database. Nur ist diese nicht zum betrachten im browser gedacht

      PHP-Quellcode

      1. <!--?php
      2. // diese datei ist NUR für die benutzung im zusammenhang mit dem Programm zu nutzen. Wenn man diese im browser öffnet, bringts rein gar nichts
      3. // wir "säubern" die eingaben mit trim()
      4. $_POST['name']=trim($_POST['name']);
      5. $_POST['email']=trim($_POST['email']);
      6. $_POST['homepage']=trim($_POST['homepage']);
      7. $_POST['komment']=trim($_POST['komment']);
      8. // wenn einer der eingaben leer ist, wird ein fehler gemeldet
      9. if(!$_POST['email']){$fehler=1;}
      10. if(!$_POST['komment']){$fehler=2;}
      11. if(!$_POST['name']){$fehler=3;}
      12. // wir können jetzt eine verbindung zu einer database erstellen
      13. mysql_connect("localhost","database","Pass") or die("Database fehler: ".mysql_error());
      14. mysql_select_db("database");
      15. // wir holen uns alle werte der spalte "name" und "email" raus...
      16. $user="SELECT name, email FROM users";
      17. $users=mysql_query($user);
      18. // ...schreiben diese in einen array..
      19. for($i=0;$i<mysql_num_rows($users);$i++) {
      20. $ergebnis[$i]=mysql_fetch_array($users);
      21. }
      22. // ...und können jetzt cheken ob es bereits einen User gibt, der die gleiche email bzw nick hat..
      23. for($i=0;$i<count($ergebnis);$i++){
      24. if ($ergebnis[$i]['name']==$_POST['name']) {
      25. $fehler=4; // wenn ja, dann gibt es einen fehler
      26. break;
      27. }
      28. if ($ergebnis[$i]['email']==$_POST['email']) {
      29. $fehler=5;
      30. break;
      31. }
      32. }
      33. if($fehler){ //wenn es einen fehler gegeben hat wir nicht weiter gemacht, und stat dessen der fehler wiedergegeben
      34. $meldung=$fehler;
      35. } else { // wenn kein fehler stat fand, erstellen wir einen sql kommando
      36. $sql="INSERT INTO users (`name` ,`email`, `homepage` ,`komment` ) VALUES (
      37. '".mysql_real_escape_string($_POST['name'])."',
      38. '".mysql_real_escape_string($_POST['email'])."',
      39. '".mysql_real_escape_string($_POST['homepage'])."',
      40. '".mysql_real_escape_string($_POST['komment'])."'
      41. );";
      42. mysql_query($sql); // und führen dieses aus, jetzt sind die werte in der database gespeichert
      43. $meldung=0;
      44. }
      45. echo $meldung; // jetzt wird die meldung wiedegegeben, dies ist zwischen 0 und 5. 0=geglückt, 1=E-mail fehlt, usw..
      46. ?>
      Alles anzeigen
      Spoiler anzeigen
      Diese letzte Datei ist zu aulesen der Database. Ebenfalls nicht zum betrachten im Browser

      PHP-Quellcode

      1. <!--?php
      2. // diese datei ist NUR für die benutzung im zusammenhang mit dem Programm zu nutzen. Wenn man diese im browser öffnet, bringts rein gar nichts
      3. // wir verbinden mit der database..
      4. mysql_connect("localhost","database","pass") or die("Database fehler: ".mysql_error());
      5. mysql_select_db("database");
      6. //..wählen die werte aus..
      7. $user="SELECT name, email, homepage, komment FROM users";
      8. $users=mysql_query($user);
      9. //..schreiben die mittels einer for schleife in einen array...
      10. for($i=0;$i<mysql_num_rows($users);$i++) {
      11. $ergebnis[$i]=mysql_fetch_array($users);
      12. }
      13. //..und geben einen alles wieder
      14. for($i=0;$i<count($ergebnis);$i++){
      15. echo $ergebnis[$i]['name']."#";
      16. echo $ergebnis[$i]['email']."#";
      17. if ($ergebnis[$i]['homepage']){
      18. echo $ergebnis[$i]['homepage']."#";
      19. } else { echo "-#"; }
      20. echo $ergebnis[$i]['komment']."#";
      21. echo "#";
      22. }
      23. ?>
      Alles anzeigen

      Ihr habt nur Bahnhof verstanden? Hätte ich vor 2. monaten auch nur :P

      Als letztes gehts weiter mit dem GM. Da ich mal davon augehe, das die meisten hier damit mehr oder weniger arbeiten können, gehe ich nur die Theorie durch.

      Wir tratschen erst mal alle brav rüber ins Erweiterungen & Tools Forum, und finden die Http.dll > Dll HTTP DLL <

      Laden uns die scripts in den GM, und fertg is. Ne scherz.

      Wenn man das Programm starten, wird man als erstes gefragt was man machen will. Wenn man aus dem Game herraus einen Eintrag machen möchte, haben wir die funktion http_add_post(). Richtig benutzt sieht das dann so aus:

      GML-Quellcode

      1. http_add_post('name',get_string('Dein name','')); // die angaben werden gesammelt
      2. http_add_post('email',get_string('Deine E-mail',''));
      3. http_add_post('homepage',get_string('Deine Hp#optinal',''));
      4. http_add_post('komment',get_string('Das Kommentar',''));
      5. status=http_request(host,path+'add_user.php'); // und an den PHP script gesendet. Dieser gibt dann den status wieder
      Die letzte funktion, http_request() sendet die angaben die wir mit http_add_post() gemacht haben, und gibt das wieder, was mein Php script wiedergibt. Wer jetzt aufmerksam war, weiß das dies eine zahl ist. 0 wenn alles gut gin, 1. wenn dies fehlt, 2. wenn das fehlt, usw.
      Durch ein switch statement, wird das dann behandelt.

      Wenn man beim Starten des Programmes auf den 2. button drückt, ließt das Programm die PHP datei get_users.php, welche wiederum die Database ließt.

      Uff, doch viel geworden..

      Natürlich wird für all dies eine Pro version des GM benötigt.

      EDIT: einen winzige verbesserung.. (Wenn man keine HP angibt, wird stat einer leeren Zeile ein '"-" angezeigt. Datei akuallisiert.

      EDIT2: Noch einen kleinen denkfehlergefunden: Durch htmlentities() werden sonderzeichen umgewandelt. Das brauchen wir aber nicht, weil wir die eingaben ja im Programm anschauen, und nicht in einem Browser.

      EDIT 3: Mit gm6.

      Hier die versprochenden Dateien:
      1. Executable.rar (enthält eine exe für jene, die nur Lite haben, sich das troz dem mal angucken wollen. Läuft mit einer meiner Databases)
      2. Editable.rar ( enthält die gmk. die http.dll, die php dateien und die angesprochende sql datei. Man muss erst mal hand anlegen, bevor man da war vorzeigbares hat.)
      3. gm6.rar (enthält NUR die gm6 datei)

      Die HTTP-dll in den Archiven ist nicht mehr up to date. Sorgt dafür, dass es immer die neueste ist.

      MfG SDX

      Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von SDX ()

    • Das ist ne ganz nette Sache. Und vermutlich bekomm ich es auch mit der Zeit ohne nachgebaut, aber ist es dir evtl. möglich eine gm6 davon hochzuladen? Wenn es nicht zu viele Umstände macht. - Danke
    • Ubs, den Primary Key habe ich natrülich vergessen..

      Und J[at]kob: genau aus dem grund habe ich mich mit dem Thema beschäftgit. Als erstes dachte ich mal an ein Gäsebuch, welches irgendwie ... ja, strange ... wäre. Aber für ein komplexes System, mit Accounts, verschiedenen Score-Tabellen, usw. ist dies Ideal..

      MfG SDX
    • Wenn man dann mit Accounts anfängt, sollte man sich vielleicht anfangen zu überlegen, ob man die Passwörter mit md5 sichert etc..
      Wenn man eine Highscore über HTTP macht, ist es halt das Problem, das jeder Nutzer einfach irgendeine Punktzahl eintragen kann - Sogar mit dem Browser.

      Ansonsten ist das ganz nett, aber dann wird man wahrscheinlich eher nicht drumrum kommen sich mit PHP und MYSQL außeinanderzusetzen.


      Als Kommentar hast du aber noch:
      // wir "säubern" die eingaben mit trim() und htmlentities()
      Obwohl du es ja geändert hast ('
      EDIT2: Noch einen kleinen denkfehlergefunden: Durch htmlentities() werden sonderzeichen umgewandelt. Das brauchen wir aber nicht, weil wir die eingaben ja im Programm anschauen, und nicht in einem Browser[b].[/b]').

      htmlentities() braucht man aber vielleicht doch => Du hast keine Ausgabe für den Browser gemacht.
      Viele Grüße, maxda
    • maxda schrieb:

      htmlentities() braucht man aber vielleicht doch => Du hast keine Ausgabe für den Browser gemacht.
      Hatte ich eigentlich nicht vor. Das htmlentities() ist soagar hinderlich, wenn man es im programm benutz. Wie man sich schon denken kann, werden sonderzeichen ins format für html geändert. Das sieht im programm wiederum hässlich aus. Wenn man wirklich noch eine Browserausgabe machen will, muss man htmlentites() nach dem lesen aufrufen.
      Danke für den Hinweiß, wird sofort geändert!

      Natürlich wird man nicht um das thema PHP rumkommen. Aber für die jenigen die es beherschen, ist es eine wirklich geniale Sache.

      MfG SDX
    • mir viel da noch mal was ein..
      Wenn man eine Highscore über HTTP macht, ist es halt das Problem, das jeder Nutzer einfach irgendeine Punktzahl eintragen kann - Sogar mit dem Browser.
      Nicht ganz, die daten werden mit Post übertragen, wie willst du es dann schaffen, das mit dem browser zu machen? Wenn man es mit new_user.php?name='Ich'&email='... macht, ist dies Get. Klar, wo ein wille ist, ist auch ein weg. Man sollte es, wenn es sich um wichtige oder sogar vertrauliche sachen handelt, zumindest durch ein Art key schützten. Der würde jedes mal vor dem absenden der Daten vom programm genneriert, und muss genau passen. Zb. muss diese zahl durch 13. teilbar sein, und danach eine ganze Zahl ergeben. Ich weiß, ein relativ einfaches beispiel, aber man kann sich da bestimmt was richtig Fieses ausdenken. Erst wenn diese Zahl genau passt, akzeptiert die php die Daten, und schreibt diese in die Datenbank. Außerdem, wenn der benutzer nicht gerade die exe decompilet oder dein ftp passwort knackt, ist dies völlig ausreichend. (Ich lasse mich auch gerne eines anderen beleren)
    • Hallo =)



      Gerade das ist das was ich bruche im Moment!

      Super.

      Ich hätte aber eine klitzekleine Frage: Könntest du eventuell bitte die HTTP DLL hochladen?

      Die von Bl@cksp@rks Homepage kann ich nicht runterladen, da der Downloadlink nichtmehr gültig ist.

      Wäre echt nett.

      Und super Thread! Besser hätte mans nicht machen können ! :D *Auf bedanken klick*



      Mit freundlichem Gruß

      icqgamer
    • icqgamer schrieb:

      Die von Bl@cksp@rks Homepage kann ich nicht runterladen, da der Downloadlink nichtmehr gültig ist.
      Er hat da schon seit längerem probleme.. Doch mal findet alle seine Sachen auch hier. Muss man nur halt wissen :P Die http dll liegt außerdem auch bei

      icqgamer schrieb:

      *Auf bedanken klick*
      Danke;)


      MfG SDX
    • sag mal, ist es auch möglich, das so einzurichten, das man das spiel zuerst auf einer webseite kaufen muss, und dan kann man sich im spiel drinne einloggen? also, so ähndlich wie bei dem berühmten spiel Minecraft?
      würde mich mal interessieren...

      MFG Zweischtein
      Kopiere dies in deine Signatur um es in deiner Signatur zu haben.
    • Fügst halt noch ne Zeile ein:

      SQL-Abfrage

      1. CREATE TABLE IF NOT EXISTS `users` (
      2. `name` char(255) NOT NULL,
      3. `email` char(255) NOT NULL,
      4. `homepage` char(255) NOT NULL,
      5. `komment` char(255) NOT NULL,
      6. `purchased` bool NOT NULL
      7. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

      Einfach ein boolean, "true" für gekauft, "false" für nicht gekauft.
      Oder sowas in der Richtung, hab grade kein plan wie der Syntax von mysql funktioniert.
      :saint:
    • ist es auch möglich, das man in der mitte eine seite anzeigen lassen kann? also, mit den neusten updates, und dan wen man sich einloggt, das es dan automatisch das erstellte game ändert und die game.exe (so heisst es bei mir ;) )ersetzt wird?
      Kopiere dies in deine Signatur um es in deiner Signatur zu haben.
    • Versteh ich nicht?!?

      Du kannst ja nen login raum machen wo du dann abfragst ob der account den man einibt das spiel gekauft hat und nur dann kommt man in den nächsten room.Oder wie bei minecraft:

      Alle dateien sind extern und beim einloggen werden die dateien erst runtergeladen(sehr einfach zu cracken)