Hauptmenü

Untermenü

Advanced SQL - Praxistutorial 1 - Mitglied anbieten Teil 2

1. Die Abschnitte

2. Prepared Statements

Mit denen wollen wir uns hier ein wenig näher beschäftigen. Allerdings zeige ich euch nur eine(!) Möglichkeit, wie man damit arbeiten kann. Die anderen kommen in den nächsten Tutorials. Dazu müssen wir die Db-Klasse aber um eine Methode ergänzen.


public function preparedStatement($query$params) {
  $stmt $this -> prepare($query);      
  for ($i 0$i count($params); $i++) {
    $stmt -> execute($params[$i]);
  }
}

Erläuterung

Wie ihr an obigem Code erkennen könnt, muss es sich bei $params um ein numerisches Array handeln. Gut, bei einem sauberen Code prüft man zusätzlich noch mit is_array, aber das habe ich mir erspart. Außerdem wird es sich Dank des weiteren Codes immer um eine Array handeln.

Das Procedere

Zuerst wird das Ganze mit $stmt = $this -> prepare($query); vorbereitet. Aber warum das $stmt? Wer sich diese Frage stellt, sollte noch mal die Theorie durcharbeiten. Denn prepare gehört zur PDOStatement-Klasse und muss deshalb über eine Variable referenziert werden. Anschließend werden alle Einträge des Arrays $params per execute in die Datenbank geschrieben.

HÄ!

Ja, mea culpa. Diese Möglichkeit habe ich in der Theorie völlig unterschlagen. Und darum reiche ich sie hier nach. Wenn man ein Array in der unten beschriebenen Art und Weise aufbereitet, so ist möglich, die Daten direkt zu verarbeiten, ohne den Weg über ein bindIrgendwas-Methode zu gehen. Probiert das einfach mal anhand eigener Beispiele aus.

3. Die Methode putOnMarket

... gehört zur Market-Klasse. Aufgerufen wird sie in der index.php über die Bedingung if ('sell' == $_POST['do']). Denn dabei handelt es sich um das hidden-Feld, das wir im vorherigen Abschnitt in das Formular eingebaut haben.

4. Aufbau des SQL-Statements

Hier wird in diesem Fall für die Platzhalter der Doppelpunkt als "Kennung" benutzt.


public function putOnMarket() {
  $query 'INSERT INTO 
              markt (besitzer, mitglied, preis)
            VALUES 
              (:besitzer, :mitglied, :preis)';    
}

5. Die Aufbereitung


foreach ($_POST['sell'] as $key => $value) {
  if (!empty($value)) {          
    $settings[] = array (
                          ':besitzer' => $_SESSION['login'],
                          ':mitglied' => $key,
                          ':preis'    => $value
                         );
  }
}

Erläuterung

Im vorherigen Abschnitt wurden die Namen der einzelnen Textfelder als Array angelegt ($input = '<input type="text" name="sell['.$result[$i]['mid'].']" />';). Und das bedeutet, dass alle(!) Felder übertragen werden, auch wenn sie keine Werte haben. Darum sollte man tunlichst eine Prüfung darauf vornehmen, hier mit if (!empty($value)).

Dann bauen wir ein numerisches Array auf, das wiederum ein assoziatives Array beinhaltet. Die Indizes sind identisch mit den Platzhaltern aus dem SQL-Statement. Ach ja, den Doppelpunkt kann man bei den Indizes auch weglassen und es funktioniert trotzdem. Warum weiß ich im Moment auch noch nicht genau.

6. Daten an Methode übergeben

Der Rest ist ein Mäusefurz. Query und Array an die Methode preparedStatement übergeben und fertig.


$this -> db -> preparedStatement($query$settings);

7. Der Aufruf

... läuft bekanntlich in der index.php ab.


if ('sell' == $_POST['do']) {
  $market -> putOnMarket();
}

Bietet jetzt einfach mal einen oder mehrere Mitspieler an und schaut dann in der Datenbank(!) nach, ob die Daten vorhanden sind.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt