Hauptmenü

Untermenü

Advanced SQL - Praxistutorial 1 - Direktangebot machen Teil 2

1. Die Abschnitte

2. Transaktionen

Mit dem Thema werde ich euch hier malträtieren. Da man in dem Formular ja beliebig viele Direktangebote machen kann, wollen wir nach dem Prinzip "alles oder nichts" vorgehen. Wenn also nur ein INSERT in die Hose geht, brechen wir alles ab. Dazu benötigen wir aber erst mal eine entsprechende Methode in der Db.class.php.


public function transact($queries) {
  $success true;
  $this -> beginTransaction();
  foreach ($queries as $key => $value) {
    if (!$this  -> change($value)) {
      $success false;
      break;
    }
  }
  if (false === $success)  {
    $this -> rollBack();
    return false;
  }
  else {
    $this -> commit();
    return true;
  }
}

Erläuterung

Zunächst mal sind wir sehr optimistisch und legen die "Kontrollvariable" $success auf true. Dann leiten wir die Transaktion mit $this -> beginTransaction(); ein. Anschließend werde alle Queries durchlaufen und mit $this -> change($value) ausgeführt. Da das in der if-Bedingung abläuft und ein exec (siehe Methode change) entweder true oder false zurückliefert, wissen wir also genau ob das Insert funktioniert hat oder nicht.

Sollte Letzteres eintreten, wird die ganze Aktion mit break abgebrochen. Anschließend muss noch der Wert der "Kontrollvariable" geprüft werden. Bei einem false wird das rollBack ausgeführt, ansonsten die Daten mit commit dauerhaft in die Datenbank geschrieben.

3. Die Methode doDirectOffer

... in der Klasse Market ist kurz und knackig.


public function doDirectOffer() {
  $querries = array();
  foreach($_POST['buy'] as $key => $value) {
    if (!empty($value)) {
      $querries[] = 'INSERT INTO 
                      angebot (von, an, fuer, preis)
                    VALUES ('.$_SESSION['login'].','.
                            $_POST['from'][$key].','.
                            $key.','.$value.')';
    }
  }
  if (!empty($querries)) {
    $this -> db -> transact($querries);
  }
}

Erläuterung

Wer hier Probleme mit den Post-Werten hat, soll sich die einfach mal mit einem print_r($_POST) ausgeben und dann auf obigen Code achten. Wer das nicht begreift, dem empfehle ich dringenst, sich erst mal die elementaren Grundlagen anzueignen, bevor er oder sie hier weiter macht. Anhand der Post-Werte bauen wir uns ein Array mit den jeweiligen Queries zusammen. Und die übergeben wir dann (falls nicht leer) an die Methode transact.

Und die Fehlerbehandlung?

Tja, wie ich schon sagte, kümmern wir uns in diesem Tutorial nicht darum. Wenn also irgendwas schief geht, so werden zwar keine Daten in die entsprechende Tabelle geschrieben, es gibt aber auch keinen Hinweis darauf. Wer Lust darauf hat, kann das selber einbauen. Ist ja nicht so schwer.

4. Der Aufruf

... erfolgt wie gehabt in der index.php.


else if ('buy' == $_POST['do']) {
  $market -> doDirectOffer();
}

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