Hauptmenü

Untermenü

Advanced SQL - Praxistutorial 1 - Mitglied anbieten Teil 1

1. Die Abschnitte

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