[How2] Basic UCP - PDO, OOP für Anfänger

  • Jetzt auch auf Github!
    https://github.com/C3010/SA-MP-UCP


    Tutorial
    Ja ja, es gibt bereits sehr viele Tutorials, nur sind die meisten out of date. Da die Interesse an PHP momentan sehr steigt und viele daran interessiert sind langsam was eigenes anzufangen dachte ich mir, ich mache ein kleines Beispiel. Ich werde versuchen alles bestmöglich zu erklären, jedoch ist es etwas mehr Code als man es von anderen Basics gewohnt ist, deswegen sind einige PHP Grundlagen vorrausgesetzt.


    Bevor wir anfangen solltest du dir diesen Beitrag durchlesen, um zu wissen was PDO ist und wieso ich in diesem Beispiel zu PDO greife und nicht zu der veralteten mysql() Methode.


    Ich werde dir nicht erklären wie du ein richtiges UCP entwickelst, denn im endeffekt wird es nur ein Login und eine Seite um die Stats zu sehen.
    Da aber die meisten sich die veraltete Tutorials durchlesen, mache ich dennoch ein kleines Update sodass du mit deinen Codes immer auf den neusten Stand bist.


    Fangen wir an.
    Zunächst legen wir uns 2 Verzeichnisse und 1 Unterverzeichnis an


    pages
    web/css


    Und nun die nötigen Dateien


    pages web/css
    account.php style.css
    index.php


    Im Hauptverzeichnisse benötigen wir ebenfalls 4 Dateien


    Configuration.php
    Connection.php
    Page.php
    index.php


    Zu einigen Dateien benötige ich keine große Erklärung schreiben und spare mir das Tippen und dir zugleich deine Zeit.
    Also fangen wir einfach mal mit etwas Copy&Paste an.


    Folgendes fügst du in die style.css

    Das kommt in die Configuration.php und nicht vergessen die Daten anzupassen.

    Dies kommt in die Connection.php (es ist nichts weiter als eine Klasse für die MySQL Verbindung, sollte sich von selbst erklären)

    Nun sind wir mit dem Copy&Paste erstmal fertig.
    Fangen wir mit der index.php an, also die Hauptdatei welche immer als erstes aufgerufen wird.
    Wie schon erwähnt sollte man einige PHP Grundlagen beherschen.


    Zunächst öffnen wir den PHP Tag und starten eine session, falls noch keine gestartet ist.
    Im normalfall brauchen wie die Abfrage nicht, aber wir lassen es sicherheitshalber drinne:

    PHP
    if(session_status() == PHP_SESSION_NONE) session_start();

    Nun setzen wir einige Einstellungen fest, sind nicht sehr wichtig aber könnte im späteren nützlich werden.


    Erklärungen
    set_time_limit, ini_set, date_default_timezone_set, http://error_reporting,

    PHP
    @set_time_limit(0);
    @ini_set('memory_limit', -1);
    @ini_set('display_errors', true);
    @date_default_timezone_set('Europe/Berlin');
    error_reporting(E_ALL);

    Nun definieren wir eine Variable, sodass fremde außer auf die index.php auf keine andere Dateien zugreifen können.

    PHP
    define('ACCESS', true);

    Deswegen haben wir auch folgende Abfrage in einigen Dateien

    PHP
    if(!defined('ACCESS')) header('Location: index.php');

    Es leitet den User zurück auf index.php, wenn ACCESS nicht definiert ist. Da in der index.php die Variable definiert ist, können wir nur über die index.php auf die anderen Dateien zugreifen.


    So nun geht's aber weiter. Wir inkludieren nun die anderen 3 Dateien im Hauptverzeichnis.

    PHP
    require_once('Configuration.php');
    require_once('Connection.php');
    require_once('Page.php');

    Und nun stellen wir eine Verbindung zu unserer MySQL Datenbank her. Dazu benutzen wir die Connection Klasse, welche wir bereits oben erstellt haben.

    PHP
    $pdo = new Connection();
    $pdo->createConnection(array(
    	$_CFG['MYSQL']['HOST'],
    	$_CFG['MYSQL']['USER'],
    	$_CFG['MYSQL']['PASS'],
    	$_CFG['MYSQL']['DATA']
    ));

    Und kommen wir zum Ende der index.php.

    PHP
    return new Page($_REQUEST, $_CFG, $pdo->getConnection());

    Wir erstellen ein neues Objekt welche die Funktionen von der Page Klasse erbt und geben den Konstruktor zurück.
    So müsste nun unsere index.php aussehen

    So und nun kommen wir zu der Page Klasse. Wir fügen folgenden Code in der Page.php Klasse ein.
    Auch hier werde ich keine Erklärung schreiben, da sich das alles eigentlich von selbst erklären sollte.

    Für dich werden die 2 Funktionen isLoggedIn() und getData() am wichtigsten sein.
    Mit isLoggedIn() können wir abfragen, ob der User eingeloggt ist und mit getData() können wir Daten vom Spieler auslesen.
    Nehmen wir an, wir wollen das Level auslesen, dann benutzen wir

    PHP
    echo $this->getData('Level');

    Also weiter. Weiter gehts mit den pages Verzeichnis. Wir fügen in index.php und account.php den folgendem Inhalt ein.

    Es ist kein richtiges Tutorial sondern etwas für Anfänger welche bereits die Grundlagen von PHP beherschen und auch die Codes verstehen.
    Zu den HTML und CSS Teil habe ich keine Erklärung gegeben, da es nicht wirklich zum Tutorial gehört und man HTML und CSS schon beherschen sollte, bevor man mit PHP beginnt.


    In der index.php prüfen wir ob der User angemeldet ist und falls ja leiten wir ihn zu seiner Statistik. In der account.php das selbe nur umgekehrt.
    Die Abfrage mit dem Login sollte bereits selbst erklärend sein.


    Das Tutorial dient mehr oder weniger um up to date zu bleiben und die neuste PHP Version nutzen zu können.
    Sollten Fragen offen stehen kannst du die gerne stellen. :)


    04.05.2016
    Mehrsprachig
    Auf Anfrage von @Whice. erkläre ich dir heute wie du ein einfaches Sprachsystem erstellen kannst.
    Dazu habe ich bereits eine Klasse erstellt welche du du in den Hauptverzeichnis legen und anschließend ein Ordner "lang" anlegen musst.

    Die Sprachdatei inkludierst du nun in deiner index.php

    PHP
    require_once('Language.php');

    Nun erstellen wir ein neues Objekt

    PHP
    $language = new Language();
    $language->setLangauge('DE');

    Nun geben wir die $language Variable unserer Page Klasse weiter.

    PHP
    return new Page($_REQUEST, $_CFG, $pdo->getConnection(), $language);

    Den Konstruktor der Page Klasse müssen wir nun anpassen

    PHP
    public function __construct($request, $cfg, $pdo, $language, $dir = 'pages') {
        $this->language = $language;
        //...
    }

    Und folgendes in der Page Klasse definieren, nicht vergessen!

    PHP
    public	$request, $cfg, $pdo, $language;

    So nun sind wir fertig und können die Klasse benutzen. Wir erstellen uns im lang Verzeichnis eine neue Datei

    JavaScript: DE.json
    {
      "Welcome": "Willkommen!"
    }

    Hier können wir nun alle Texte in einem JSON Array reinschreiben und nutzen können wir es dann wie folgt

    PHP
    <?php echo $this->language->json()['Welcome']; ?>

    Wenn du eine weitere Sprache hinzufügen möchtest bspw. englisch erstellst du im lang Ordner die Datei EN.json welche dann zum Beispiel so aussehen kann

    JavaScript: EN.json
    {
      "Welcome": "Welcome!"
    }

    Nun kannst du eine Seite erstellen wo der Nutzer seine Sprache für sich selbst ändern kann.
    Das müsste dann ungefähr so aussehen

    PHP
    $lang = 'en';
    if($this->language->exists($lang)) {
    	$_SESSION['LANGUAGE'] = strtoupper($lang);
    	$this->language->setLanguage($lang);
    }

    Es ist auch möglich Platzerhalter zu benutzen.


    Ein kleines Beispiel

    JavaScript: DE.json
    {
      "Welcome": "Willkommen %username%!"
    }
    PHP: account.php
    <?php echo $this->language->getReplaced($this->language->json()['Welcome'], array('%username%'), array($this->getData('Username'))); ?>

    4 Mal editiert, zuletzt von C3O ()

    • Offizieller Beitrag

    hmm bekomme folgende Fehlermeldungen:


    Notice: Undefined property: stdClass::$Username in /users/whice/www/cp/pages/index.php on line 20


    Notice: Undefined property: stdClass::$Password in /users/whice/www/cp/pages/index.php on line 21


    Warning: Cannot modify header information - headers already sent by (output started at /users/whice/www/cp/pages/index.php:20) in /users/whice/www/cp/pages/index.php on line 22


    Sind die Zeilen:


    Code: index.php
    $_SESSION['USERNAME'] = $obj->Username;
    $_SESSION['PASSWORD'] = $obj->Password;
    header('Location: index.php?p=account');


    //EDIT



    Ja Notepad habe ich auch, PhpStorm werde ich mir mal anschauen :)

  • Du musst auch auf die Groß- und Kleinschreibung achten. Sind die Feldnamen in deiner Datenbankstruktur für den Spielernamen auch Username und für das Passwort Password?
    Das musst du anpassen.

  • Hey. Ich komme mit dem Sprachsystem zwar soweit klar, jedoch hab ich leider keinen Schimmer, wie ich diese als Nutzer der Seite umstellen kann.


    Im HowTo steht jetzt folgender Code:

    PHP
    $lang = 'en';
    if($this->language->exists($lang)) {
        $_SESSION['LANGUAGE'] = strtoupper($lang);
        $this->language->setLanguage($lang);
    }


    Nun meine Frage:
    Wie kann ich diese Funktion am besten in das Menü einbauen?


    HTML
    <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><img src="/img/<?php echo $this->language->getReplaced($this->language->json()['NAVI_LANG_IMG']); ?>" alt="FLAG"/> <span class="caret"></span></a>
                    <ul class="dropdown-menu">        
                        <li><a href="#"><img src="/img/<?php echo $this->language->getReplaced($this->language->json()['NAVI_C_LANG_IMG']); ?>" alt="FLAG"/> <?php echo $this->language->getReplaced($this->language->json()['NAVI_CHANGE_LANG']); ?></a></li>
                    </ul>        
                </li>

    (Funktion sollte im unterem href stecken, nur wüsste selbst nicht wie)



    Würde mich freuen, wenn mir wer bei dem Problemchen behilflich sein könnte. :)

  • Am einfachsten kannst du es dir so machen, dass du eine neue Seite erstellst bspw. language.php und dem per Parameter (language.php?lang=en) die Sprache übermittelst und es dann in eine Session speicherst.

  • Ja hab ich so ist es ja nicht nur irgendwie kommen immer fehler raus das ACCES ganze zeit schon definiert ist etc.obwohl es nicht so ist oder das die Klasse Page nicht geladen werden kann

    Poste hier die Fehler, dann helfe ich auch gerne :)

  • Beitrag von datgame ()

    Dieser Beitrag wurde von shoxinat0r gelöscht ().
  • Beitrag von MnX ()

    Dieser Beitrag wurde von shoxinat0r aus folgendem Grund gelöscht: Bezug entfernt ().