Hauptmenü

Untermenü

Advanced SQL - Praxistutorial 3 - Tauschangebote anzeigen Teil 2

1. Die Abschnitte

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 == || $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