Rolf B: JSON - falsches Format

Beitrag lesen

Hallo juppix,

(Edit: Habe das hier geschrieben während Du selbst auf das meiste davon gekommen bist)

wenn ich das richtig lese, dann will diese DataTables Komponente - sofern man nichts anderes festlegt - ein Objekt mit einer einzigen Eigenschaft. Diese Eigenschaft heißt "data", und der Wert muss ein Array sein.

Die Zeilen dieses Arrays können unterschiedlich strukturiert sein. Im einfachsten Fall ist eine Zeile des data-Array wiederum ein Array mit den Werten für die Spalten. Dann brauchst Du keine columns-Definition zu machen. Aber Du musst im PHP dafür sorgen, dass dein json genau diese Struktur liefert.

Wenn Du was anderes liefern willst, musst Du die Spalten mappen - aber an einem kommst Du nicht vorbei, denke ich: an dem Objekt mit der data-Eigenschaft, dessen Inhalt ein Array ist. Das kannst Du in PHP ganz leicht herstellen, indem Du assoziative Arrays nutzt:

$ergebnis = array("data" => $zeilen);
echo json_encode($ergebnis);

$zeilen muss wiederum ein Array sein, mit numerischen Indexen fortlaufend nummeriert - also das, was du mit $zeilen[] = $zeile automatisch bekommst.

Den Inhalt von $zeile musst Du selbst erzeugen. Am einfachsten ist es wohl, wenn Du nicht fetch_assoc machst, sondern fetch_row. Und zwar NICHT mysql_fetch_row, sondern mysqli_fetch_row oder ein Zugriff über PDO. Die mysql-Erweiterung ist schon seit langem wegen schwerer Sicherheitsprobleme durch mysqli ersetzt worden.

Du musst dafür auch noch deinen SELECT * ändern. Sowas macht man in Programmen nicht, man schreibt jede Spalte explizit hin, die man will, so dass die Reihenfolge und die Anzahl der gelieferten Spalten klar definiert ist. SELECT * ist für interaktive Tools ok, bei denen das Ergebnis nur angezeigt und nicht automatisch weiterverarbeitet wird. In einem Programm ist es eine scharfe Tretmine.

An Stelle von fetch_row kannst Du natürlich auch fetch_assoc verwenden. Aber dann musst Du der DataTable definieren, unter welchem Key es welchen Spalteninhalt findet. Das machst Du mit der columns-Eigenschaft - aber da trägst Du nicht nur die Spaltennamen ein. Über columns kann man noch mehr festlegen als nur den Spaltennamen in der Datenquelle, darum sind die Einträge im columns-Array Objekte. Das Spalten-Mapping machst Du mit der data-Eigenschaft eines solchen Objekts.

Jedenfalls wird DataTables nur dann funktionieren, wenn Du Dich exakt an die Anleitung hältst. Freistil-Syntax verstehen nur Menschen, nicht die heutigen Computer.

Rolf

--
sumpsi - posui - clusi