Advanced SQL - Praxistutorial 1 - Mitglied anbieten Teil 1
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. Die Anzeige der eigene Gildenmitglieder
... läuft über die Methode getAllPlayersForSell
der Klasse Player
. Und die ist wie (leider) vieles in diesem Tutorial lächerlich einfach.
3. Daten holen
Auch hier kommt unser Schweizer Taschenmesser gildenuebersicht
zum Einsatz. Zusätzlich gibt es einen Join auf die Tabelle markt
. Die
Details zu Letzterem kommen gleich, also keine Angst.
public function getAllPlayersForSell() {
$query = 'SELECT
g.mid,
g.mitglied,
g.gold,
g.wesen,
g.stufe,
IF (m.mitglied IS NULL,\'false\',\'true\') AS markt
FROM
gildenuebersicht g
LEFT JOIN
markt m ON(m.mitglied = g.mid)
WHERE g.gid = '.$_SESSION['gilde'].'
AND g.status = 1
ORDER BY g.mid';
$result = $this -> db -> selectMultiple($query);
}
Erläuterung
Eigentlich müsste ich zu diesem Code nichts sagen, wenn es da nicht eine Besonderheit gäbe. Und dabei handelt es sich um die IF
-Bedingung.
Wenn ein Spieler bereits auf dem Markt angeboten wurde, so steht seine ID in m.mitglied
. Wenn nicht, so ist der Wert NULL
.
Das Schema
... sieht also so aus: IF([Bedingung ist wahr], [Setze diesen Wert], [Ansonsten diesen Wert])
. In unserem Fall heißt das, wenn ein Spieler
noch nicht auf dem Marktplatz ist (m.mitglied IS NULL
), so gibt dem Alias markt
den Wert false
, ansonsten true
.
Ach ja, das AND g.status = 1
sorgt dafür, dass man als Obermufti (Gildenmeister) nicht selber aufgelistet wird, da man ja den Status 2
hat.
4. Die Ausgabe
.. ist auch sehr einfach. Zuerst Formular starten und Tabellenkopf setzen.
$html = '<form action="index.php?do=market" method="post">
<table cellspacing="0" cellpadding="0">
<tr>
<th>Preis</th>
<th>Mitglied</th>
<th>Gold</th>
<th>Wesen</th>
<th>Stufe</th>
</tr>';
Dann werden alle Gildenmitglieder in einer Schleife durchlaufen und an den bestehenden HTML-Code angehängt.
for ($i = 0; $i < count($result); $i++) {
if ('false' == $result[$i]['markt']) {
$input = '<input type="text" name="sell['.$result[$i]['mid'].']" />';
}
else {
$input = '';
}
$html .= '<tr>
<td>'.$input.'</td>
<td>'.$result[$i]['mitglied'].'</td>
<td>'.$result[$i]['gold'].'</td>
<td>'.$result[$i]['wesen'].'</td>
<td>'.$result[$i]['stufe'].'</td>
</tr>';
}
Erläuterung
Jetzt werdet ihr sicher auch verstehen, warum wir bei der Abfrage mit der IF
-Bedingung gearbeitet haben. Denn wenn der Wert von markt
ein false
ist, so erzeugen wir ein Textfeld, ansonsten nichts (if ('false' == $result[$i]['markt'])
).
Ein String?
Das werden sich jetzt sicher einige von euch fragen. Tja. leider gibt es in MySQL keine echten boolschen Werte (ich hoffe, ich rede jetzt keinen Blödsinn).
Als Spaltentyp kann man ein TINYINT(1)
nehmen, aber bei der Rückgabe von true
oder false
muss man mit Strings arbeiten.
Darum darf man in solchen Fällen auch nie mit if (false == $result[$i]['markt'])
arbeiten.
Zu guter Letzt werden das Tabellen- und Formularende erzeugt, an $html
angehängt und das ganze Gekröse zurückgegeben.
$html .= '<tr>
<td colspan="5">
<input type="hidden" name="do" value="sell" />
<input type="submit" value="Anbieten" />
</td>
</tr></table></form>';
return $html;
Wichtig
... ist hier das hidden
-Feld, denn das benötigen wir gleich für die Verarbeitung. Klickt jetzt auf "Spieler auf dem Marktplatz anbieten" und ihr bekommt
eine Übersicht eurer Gildenmitglieder, die noch nicht(!) auf dem Marktplatz angeboten wurden.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt