Felix Riesterer: PHP: Session array erweitern -> Sortierfunktion im Index

Beitrag lesen

Lieber PHP-Neuling,

ich habe diesen Thread gelesen und mir fällt auf, dass Du drei Dinge miteinander zusammenwirfst:

  1. DB-Daten sortiert ausgeben (nach $kriterien)
  2. Sortierwünsche des Users in einer Session speichern und berücksichtigen
  3. clientseitige Sortierung mittels JavaScript im Browser

Vielleicht sehe ich das falsch, aber der dritte Punkt macht die anderen beiden völlig überflüssig. Lassen wir ihn lieber einmal beiseite.

Kümmern wir uns rein um diese Frage: "Was will der User als Sortierkriterien?"

Dazu braucht es sowohl eine Liste an möglichen Sortierkriterien (in aller Regel die Spalten Deiner DB-Daten) und eine Richtung (auf- oder absteigend), die mit passenden Eingabefeldern für den User wählbar sein soll.

Frei erfundenes Beispiel mit allen (hier nur drei) möglichen Kategorien:

  1. Kundennummer (aufsteigend, kleinste zuerst)
  2. Datum (absteigend, neueste zuerst)
  3. Preis (aufsteigend)

Wir haben also zuerst das Problem, dass wir die Reihenfolge der möglichen Kategorien auswählbar machen müssen. Danach kommt noch dazu, dass man für jede Kategorie entscheiden können soll, in welcher Richtung diese sortiert wird.

Ein direkter Lösungsweg ist das Anbieten dieser Kategorien als Dropdown-Menüs:

<ol>
  <li>
    <label>
      Kriterium
      <select name="sort_by[1][cat]">
        <option value="">-- nichts --</option>
        <option value="date">Datum</option>
        <option value="customer_id">Kundennummer</option>
        <option value="price">Preis</option>
      </select>
    </label>:
    <label>
      aufsteigend
      <input type="radio" selected="selected" name="sort_by[1][dir]" value="asc">
    </label>
    /
    <label>
      aufsteigend
      <input type="radio" name="sort_by[1][dir]" value="asc">
    </label>
  </li>
...
</ol>

Wir sehen eine sortierte Liste mit in Beschriftungen eingebetteten Eingabefeldern. Das erste ist eine Auswahlbox, die als erste Option einen leeren Wert hat. Für PHP kann man als Feldnamen etwas mit eckigen Klammern verwenden, damit das auf Serverseite später ein Array wird. Lässt sich dann besser in einer Schleife abarbeiten. Es geht prinzipiell aber auch anders.

Die Liste sollte noch zwei weitere <li> mit (bis auf die name-Werte) identischen Inhalten haben, damit wir drei mögliche Kriterien angeben können.

Unschön: Man kann dreimal das gleiche Kriterium mit unterschiedlichen Richtungen angeben. Das ist nicht gut. Eine Lösung wäre mit verketteten Auswahllisten zu arbeiten, deren Verkettung eben dafür sorgt, dass bereits ausgewählte Werte in den Dropdown-Boxen in allen folgenden nicht mehr anwählbar sind. Das erfordert JavaScript.

Auf der Serverseite kommt dann in unserem gewählten Beispiel das hier an:

$_POST = array(
  'sort_by' => array(
    1 => array(
      'cat' => 'customer_id',
      'dir' => 'asc'
    ),
    2 => array(
      'cat' => 'date',
      'dir' => 'desc'
    ),
    3 => array(
      'cat' => 'price',
      'dir' => 'asc'
    )
  )
);

Dieses Array (also der gesamte Inhalt von $_POST['sort_by']) kann dann nach erfolgreicher Filterung (Plausibilitätsprüfung) in Deine Session übernommen werden. Danach kannst Du dann die Sortierung für Deine SQL-Statements entsprechend bauen.

Die Plausibilitätsprüfung ignoriert alle Array-Einträge, die einen ungültigen Wert für 'cat' aufweisen und verwendet asc als Standardwert für 'dir', falls da nichts oder nichts Erlaubtes darin steht. Damit kann dann das Formular auf der nächsten Seite mit den in der Session gespeicherten Werten vorbelegt werden. Das JavaScript verkettet die Auswahllisten wieder und sorgt dafür, dass die Verfügbarkeit der Kategorien in den Boxen entsprechend begrenzt wird.

Liebe Grüße

Felix Riesterer

0 47

PHP: Session array erweitern -> Sortierfunktion im Index

PHP-Neuling
  • datenbank
  • html
  • php
  1. 1
    localhorst
    • datenbank
    • javascript
    • php
    1. 0
      PHP-Neuling
    2. 0
      dedlfix
      1. 0
        localhorst
        1. 0
          1unitedpower
          1. 0
            localhorst
            • php
            • speicher
            1. 0
              1unitedpower
  2. 0
    dedlfix
    1. 0
      PHP-Neuling
      1. 0
        dedlfix
      2. 1

        Wichtig: Zuerst den Plan!

        Raketendiagnistiker
      3. 2
        TS
        • datenbank
        • https
        • php
  3. 0
    Rakketendiagnostiker
    1. 0
      dedlfix
      1. 0
        Raketendiagnostiker
    2. 0
      PHP-Neuling
      1. 0
        PHP-Neuling
      2. 1
        dedlfix
        1. 0
          PHP-Neuling
          1. 0
            dedlfix
            1. 0
              PHP-Neuling
              1. 0
                dedlfix
              2. 1
                localhorst
                • html
                • kontextwechsel
                • php
          2. 0
            Rolf B
            1. -1
              dedlfix
              1. 0
                Rolf B
              2. 1
                localhorst
                • datenbank
                • https
                • php
  4. 0
    vapita
    1. 0
      Matthias Apsel
  5. 0
    PHP-Neuling
  6. 0
    Felix Riesterer
    1. 0
      Raketenwilli
  7. 0
    Raketenheini
    1. 0
      PHP-Neuling
      1. 0
        localhorst
      2. -1
        Raketenheini
        1. 0
          localhorst
          • datenbank
          • https
          • php
        2. 0
          PHP-Neuling
          1. 0
            Felix Riesterer
            1. 0
              PHP-Neuling
              1. 0
                Felix Riesterer
                1. 0
                  PHP-Neuling
          2. 0
            vapita
            1. 0
              PHP-Neuling
      3. 0
        dedlfix
        1. 0
          Rolf B