Online-Highscore Liste mit PHP&MySQL [WiP]

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

 

FWeinb

ehemals "ich"

Betreff: Online-Highscore Liste mit PHP&MySQL [WiP]

BeitragSa, Aug 29, 2009 1:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dies ist mein erstes Tutorial, ich hoffe es gefällt euch wenn nicht dann bitte Konstruktive Kritik, damit ich es Verbessern kann.

Vorwort
Ich werden mit dem Aufbau einer Highscore-Liste anfangen, wenn weiteres Interesse besteht werde ich schauen, dass ich noch ein Tutorial zu Serverlisten bzw. Online-Userverwaltugen (Nicht-Realtime) schreibe, dies hängt aber sehr stark von der Schulischen Belastung ab.

Warum schreibe ich dieses Tutorial?
Da sich in Letzter Zeit die Nachfrage, nach Online Serverlisten, Highscores usw. stark erhöht hat, dachte ich mir, ich schreibe ein kleines Tutorial über ein solches Thema.

Welche Kenntnisse brauche ich?
Man sollte ein Grundsätzliches Verständnis von HTTP haben (Get/Post-Requests) und auch Wissen, wie man diese in BlitzMax umsetzt.
Für die Servierseitige Programmierung wird auf PHP&MySQL zurückgegriffen, daher währen PHP&MySQL Kenntnisse nicht schlecht.
Des Weiteren gehe ich davon aus, dass jeder Webspace und Zugang zu einer MySQL Datenbank hat.

Aufbaut des "Programmes"
Das "Programm" zerlegt sich in 2 Teile, die Offline Seite in der ihr mit BlitzMax Programmieren könnt und die Online Seite, in der ihr mit den Möglichkeiten von PHP&MySQL auskommen müsst (welche für Verwaltung usw. Enorm sind).

Die Kommunikation dieser Beiden Teile erfolgt über HTTP, wie das genau gemacht wird erkläre ich Später.

Erstellen der Tabelle
Zuerst muss überlegt werden, was ihr Speicher wollt, hiernach entscheidet sich der Aufbau der Tabelle in eurer MySQL-Datenbank.
Für dieses Tutorial Reicht es mir, wenn der Username, die Punktzahl und die IP gespeichert werden. Die Tabelle habe, ich "hlist" genannt.

Dieser Aufbau wird für die "hlist" benutzt:
Code: [AUSKLAPPEN]

Create TABLE If Not EXISTS `hlist` (
  `id` Int(11) Not Null auto_increment,
  `username` varchar(255) Not Null,
  `score` Int(11) Not Null,
  `ip` varchar(12) Not Null,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM Default CHARSET=latin1 AUTO_INCREMENT=1 ;


Wer mit dem Code nichts Anfangen kann, sollte sich SQL anschauen. Dies kann ich in diesem Tutorial leider nicht alles erklären.
Für alle anderen geht es jetzt mit der Einrichtung der "config.php" weiter, in dieser steht der Zugang zum MySQL Server, die "config.php" wird in jedem weiteren Script benötigt:

Code: [AUSKLAPPEN]

   <?php
      $host = "localhost";
      $dbuser = "UserName";
      $dbpass = "Passwort";
      $db = "Datenbank-Name"; // Nicht zu verwechseln mit dem Tabellen-Namen
   ?>


Dies wird mit dem Namen "config.php" auf eurem Webspace, gespeichert. Ich werde für dieses Tutorial alle PHP Scripte, in dem Ordner "highscore" Speichern.


Um zum vorläufigen Abschluss des Online Parts zu kommen, werde ich eine weiteres Script, mit dem Namen "addscore.php" erstellen:

Code: [AUSKLAPPEN]

<?php
   if ($_SERVER['HTTP_USER_AGENT']=="ScoreList"){ // Dient als "Sicherheits" abfrage

       require("config.php"); // Hier wird wie im Tutorial beschrieben die config.php "Included"
 
       mysql_connect($host,$dbuser,$dbpass) or die ('Konnte keine Verbindung zur Datenbank aufbauen.'); // Mit der DB Verbinden
       mysql_select_db($db);
 
       $IP = $_SERVER['REMOTE_ADDR']; // IP Adresse Auslesen       
       $_UserName = mysql_real_escape_string($_POST['n']); // Die Gesendeten Variablen auslesen
       $_Score = mysql_real_escape_string($_POST['s']);
 
       $result = mysql_query("INSERT INTO hlist (UserName,Score,IP) VALUES ('$_UserName','$_Score','$IP')");
       // Hier werden sie dann in die Tabelle Eingetragen
       
       if ($result!=0){
          header("Content-Length: 1"); // Als "Speed-Hack" wird die Content-Length als True bzw. False Indikator missbraucht.
                                // Was es damit aufsicht hat wird im Tutorial erklärt
       }else{
          header("Content-Length: 0");
       }
      
   }else{
      
      echo "Dies wird im Browser gesehen";
      
   }


?>


Wie versprochen geht es Heute mit dem BlitzMax Teil weiter, wenn auch Später als geplant.
Ich werde als ersts mit der Funktion zum Hinzufügen, von Highscore Einträgen beginnen:


BlitzMax: [AUSKLAPPEN]
SuperStrict

Function AddScore:Int(Name:String,Score:Int)

Local tcp:TSocketStream = TSocketStream.CreateClient("bbptut.bplaced.net",80)
Local Content:String = "n="+Name+"&s="+Score
tcp.WriteLine "POST /highscore/addscore.php HTTP/1.1"
tcp.WriteLine "Host: bbptut.bplaced.net"
tcp.WriteLine "User-Agent: ScoreList"
tcp.WriteLine "Content-Type: application/x-www-form-urlencoded"
tcp.WriteLine "Content-Length: "+Len(Content)+Chr(10)
tcp.WriteLine Content

Local Line:String
While Not tcp.Eof()
Line = tcp.ReadLine()
If Instr(Line, "Content-Length:") Then
Return Int(Trim(Mid(Line, Instr(Line, ":") + 1, Len(Line) - (Instr(Line, ":")))))
EndIf
Wend
Return 0
End Function



Ich nehme den Code mal außeinander.

BlitzMax: [AUSKLAPPEN]
Local tcp:TSocketStream = TSocketStream.CreateClient("bbptut.bplaced.net",80)


Wir erstellen einen TCP-SocketStream um uns mit dem Server zu Verbinden, in dieses Tutorial, meinen "Tutorial-Server" bbptut.bplaced.net

BlitzMax: [AUSKLAPPEN]
	Local Content:String = "n="+Name+"&s="+Score


Wir errinern uns an das "addscore.php" Script und Bauen aus den Variablen, den Content-String


BlitzMax: [AUSKLAPPEN]
	tcp.WriteLine "POST /highscore/addscore.php HTTP/1.1"
tcp.WriteLine "Host: bbptut.bplaced.net"
tcp.WriteLine "User-Agent: ScoreList"
tcp.WriteLine "Content-Type: application/x-www-form-urlencoded"
tcp.WriteLine "Content-Length: "+Len(Content)+Chr(10)
tcp.WriteLine Content


Und hier der Eigentliche HTTP-Request. Man kann sehen, das ich den User-Agent, hier genauso angegeben habe (Case-Sensitiv)
wie ich ihn Online, in der "addscore.php", überprüfe.


BlitzMax: [AUSKLAPPEN]
	Local Line:String
While Not tcp.Eof()
Line = tcp.ReadLine()
If Instr(Line, "Content-Length:") Then
Return Int(Trim(Mid(Line, Instr(Line, ":") + 1, Len(Line) - (Instr(Line, ":")))))
EndIf
Wend
Return 0


Hier wird nach der "Content-Length" im Header gesucht, wenn sie gefunden wurde, wird die Länge gelesen und
hiernach wird entschiede, ob die Funktion Erfolgreich (1) oder Nicht Erfolgreich (0) war.

Dies mache ich, da der Header vom Server im Gegensatz zum Content sehr schnell zurückkommt und ich so c.a. 10ms spare.

Ich hoffe ihr konntet es bis hier hin Nachvollziehen. Wenn nicht Fragt einfach. Morgen (vll auch noch Heute) werde ich dann noch eine Funktion einbauen welche die Highscore-Liste abfragt und dann im Client bewundert werden kann.

mfg

ich
  • Zuletzt bearbeitet von FWeinb am Sa, Aug 29, 2009 18:20, insgesamt 2-mal bearbeitet
 

#Reaper

Newsposter

Betreff: Auch wenn es jetzt nur Kritik ist...

BeitragSa, Aug 29, 2009 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
$result = mysql_query("INSERT INTO hlist (UserName,Score,IP) VALUES ('$_Name','$_Score','$_IP')");


Sorry, aber ganz ganz schlecht.. Lese am besten mal dazu den WikiPedia-Artikel SQL-Injection. (Und btw: Die Variable $_Name gibt es nicht, du meintest sicherlich $_UserName Wink )

Ansonsten ist ja die Score-Liste (noch) nicht vor Manipulationen gesichert.
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

FWeinb

ehemals "ich"

BeitragSa, Aug 29, 2009 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tipp, war Gestern doch schon etwas Spät Embarassed
Ist jetzt Verbessert.

Das die Highscore Liste noch nicht vor Manipulation geschützt ist, ist mir klar, das werde ich dann Später einbauen. Hier sollen erstmal nur die Grundlagen gezeigt werden, wenn man es verstanden hat sollte es auch kein Problem sein, sich da was eigenes Auszudenken.

mfg

ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs
 

Preakz

BeitragSo, Aug 05, 2012 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT: Funktioniert doch. Man muss nur es etwas umbasteln. Oder sagen wirs so ich glaub BMax hat gespinnt.
  • Zuletzt bearbeitet von Preakz am Sa, Aug 11, 2012 12:07, insgesamt einmal bearbeitet

ZaP

BeitragMo, Aug 06, 2012 11:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht's denn etwas genauer? Was genau geht nicht? Fehlermeldungen?
Starfare: Worklog, Website (download)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group