Advanced SQL - Praxistutorial 3 - Tauschangebote anzeigen Teil 2
1. Die Abschnitte
- Vorwort
- Übersicht
- Tauschangebote anzeigen Teil 1
- Tauschangebote anzeigen Teil 2
- Überlegungen
- Tauschangebote zurückziehen oder ablehnen
- Tauschangebote annehmen Teil 1
- Tauschangebote annehmen Teil 2
- Tauschangebote annehmen Teil 3
2. Das Ergebnis
Da immer noch viele Leute keine Ahnung haben, wie man komplexere Datensätze vernünftig aufdröselt, will ich das jetzt zeigen. Zunächst mal sieht der Grundaufbau so aus.
$html = '<form action="index.php?do=swapoffers" method="post">
<table cellspacing="0" cellpadding="0">';
$result = $this -> db -> selectMultiple($query);
$html .= '<tr>
<th>Mitglied</th>
<th>Gold</th>
<th>Wesen</th>
<th>Stufe</th>
</tr>';
for ($i = 0; $i < count($result); $i++) {
// Hier kommt noch Code!
$html .= '<tr>
<td>'.$result[$i]['offer'].'</td>
<td>'.$result[$i]['gold'].'</td>
<td>'.$result[$i]['wesen'].'</td>
<td>'.$result[$i]['stufe'].'</td>
</tr>';
}
$html .= '<tr>
<td colspan="4">
<input type="hidden" name="do" value="transactswapoffers" />
<input type="submit" value="Absenden" />
</td>
</tr></table></form>';
return $html;
3. Ordnung ins Chaos bringen
Bis jetzt kann man mit der Ausgabe natürlich nichts anfangen. Man weiß nicht, von wem ein Angebot kommt, an wen es sich richtet und was weiß ich nicht noch.
Die Angebote trennen
Dazu packt ihr jetzt an den Anfang der for
-Schleife den folgenden Code.
if ($result[$i]['id'] != $result[($i - 1)]['id'] && isset($result[($i - 1)])) {
$html .= '<tr>
<td colspan="4"><hr /></td>
</tr>';
}
Erläuterung
Hier seht ihr sehr schön, dass man bei numerischen Arrays innerhalb der Schleife auch schön hin und her springen kann. Es wird also einfach nur geprüft
ob die aktuelle Angebots-ID mit der vorherigen übereinstimmt. Die Prüfung auf isset
benötigt man logischerweise, um zu prüfen, ob der
vorherige Datensatz überhaupt existiert. Denn sonst produziert ihr einen Fehler. Und ratet mal, an welcher Stelle der Schleife. Genau, ganz zu Beginn.
Danach Checkboxen setzen
if ($i == 0 || $result[$i]['id'] != $result[($i - 1)]['id']) {
if ($result[$i]['von'] == $_SESSION['login']) {
$radio = '<input type="checkbox" name="cancel[]"
value="'.$result[$i]['id'].'"> Zurückziehen';
}
else {
$radio = '<input type="checkbox" name="accept[]"
value="'.$result[$i]['id'].'"> Annehmen<br />
<input type="checkbox" name="decline[]"
value="'.$result[$i]['id'].'"> Ablehnen';
}
$html .= '<tr>
<td colspan="4">
<strong>
Von '.$result[$i]['offerfrom'].'
an '.$result[$i]['offerto'].'
</strong>
</td>
</tr>
<tr>
<td colspan="4">'.$radio.'</td>
</tr>';
}
Erläuterung
Dazu brauche ich wohl nicht viel zu sagen. Das Prinzip ist dasselbe wie oben nur wird hier statt isset
zusätzlich auf den Schleifenzähler geprüft,
denn ganz zu Beginn greift der ja immer.
Dann mögliche Goldbeträge prüfen
if ($result[$i]['preis'] && $result[$i]['preis'] != $result[($i - 1)]['preis']
&& isset($result[($i - 1)]['preis'])) {
if ($result[$i]['preis'] > 0) {
$html .= '<tr>
<td colspan="4">Goldangebot: '.$result[$i]['preis'].'</td>
</tr>';
}
else if ($result[$i]['preis'] < 0) {
$html .= '<tr>
<td colspan="4">Goldforderung: '.($result[$i]['preis'] * -1).'</td>
</tr>';
}
}
Erläuterung
Dasselbe in grün wie im ersten Codeschnipsel. Nur wird zusätzlich noch überprüft, ob für das aktuelle Angebot überhaupt ein Betrag vorliegt. Ach ja, das kann man natürlich auch anders machen. Aber wie, das probiert ihr schön selber aus.
Der Angebotstyp
if ($result[$i]['typ'] != $result[($i - 1)]['typ']) {
if ($result[$i]['typ'] == 'demand') {
$html .= '<tr>
<td colspan="4">Forderung</td>
</tr>';
}
if ($result[$i]['typ'] == 'offer') {
$html .= '<tr>
<td colspan="4">Angebot</td>
</tr>';
}
}
Erläuterung
Gibbet nich. Das solltet ihr mittlerweile wissen.
4. Zwischenfazit
Wie ihr an diesem Beispiel sehen könnt, braucht man nicht zig Querries, um sich alle Informationen zu holen. Man kann das auch später per PHP ohne große Problem aufdröseln. Vorausgesetzt, die Reihenfolge der Daten ist sauber. Und dafür ist die SQL-Abfrage verantwortlich.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt