Advanced SQL - Praxistutorial 1 - Direktangebot machen Teil 2
1. Die Abschnitte
- Vorwort
- Die Datenbank-Klasse
- Verbindungsaufbau
- Login
- Die grundsätzliche Vorgehensweise
- Die Übersichtsliste
- Mitglied auf dem Marktplatz anzeigen
- Mitglied anbieten Teil 1
- Mitglied anbieten Teil 2
- Direktangebot machen Teil 1
- Direktangebot machen Teil 2
- Tauschangebot machen Teil 1
- Tauschangebot machen Teil 2
- Tauschangebot machen Teil 3
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