Anfängerfragen: Tabellenfelder explizit nicht parsen

Guten Morgen Community,

ich bin ganz frisch auf yii gestoßen, habe schonmal ein wenig herumexperimentiert und mal eine Testanwendung mit Oracle-DB Zugriff erstellt.

Ein paar Verständnissfragen habe ich dennoch:

Bei meiner Testapplikation habe ich ein MVC-Pattern mittels gii gemäß offiziellem Tutorial erstellt.

Das ganze hat auch funktioniert - bis auf die Tatsache dass in einem Tabellenfeld ein zu großer Wert steht.

Dies verursacht auf der manage-Übersicht die Fehlermeldung im Popup: "Error 500 … data was too large for buffer …".

Wie kann ich dies denn umgehen? Validator beziehen sich - soweit ich verstanden habe - ja nur direkt auf Benutzereingaben, die Daten sind in der Tabelle aber schon so vorhanden.

Gibt es eine Möglichkeit aus einer Tabelle nur bestimmte Spalten zu parsen oder wird über gii / generell immer die ganze Tabelle geparst und entsprechend der templates nur entsprechende ausgegeben?

Meine try and error Versuche waren bisher leider nicht erfolgreich - selbst wenn ich die relevanten Spalten im template ausblende erscheint immernoch die Fehlermeldung (verständlicherweise ;)).

Das Problem liegt hier eher irgendwo im Oracle-Treiber für PDO. Die Fehlermeldung klingt für mich so, dass zu viele Daten von Oracle zurückgelieftert werden, so dass PHP sie nicht mehr Zwischenspeichern kann. Leider hab ich aber keine Oracle-Erfahrungen, kann dir also auch nicht sagen woran es liegt. Evtl. mal Google bemühen? Es gibt einige Treffer zu der Fehlermeldung.

Danke für das erste Feedback.

Genau, das Problem liegt darin, dass der Wert eines Feldes (Freitextfeld) zu groß ist.

Alle anderen Datensätze werden fehlerfrei dargestellt (4 Seiten - auf Seite 3 erscheint der Fehler).

Die Google-Treffer bringen mich ad hoc nicht weiter - nur Treffer 1 spiegelt dieselbe Fehlermeldung wieder, der Lösungsweg klingt aber für meine Problem nicht sehr vielversprechend.

Naja ich such mal weiter … was soll ich sonst auch machen ;-).

Da das ganze aber ja grundsätzlich ein Problem sein wird (es kann ja immer wieder vorkommen, dass ‘größere’ Werte in einem varchar feld stehen -das feld das hier betroffen ist müsste ein varchar2(2000 Byte) sein) muss es hierfür doch eigentlich schon eine Lösung geben?!

Mal ungeachtet des Eingangsproblems:

Ich bin gerade etwas lost und komme mit den verfügbaren Tutorials auch nicht weiter.

Wofür ich yii eigentlich nutzen will:

Ich habe eine Vielzahl von bereits existierenden Tabellen, die alle readonly sind.

Als nächstes möchte ich mir z.B. dynamisch Daten aus unterschiedlichen Tabellen (über ein Eingabeformular) anzeigen lassen (quasi über joins).

Wie ist denn dafür der grobe Ablauf? Muss ich mir mit gii für jede Tabelle ein eigenes MVC-Pattern erstellen und diese dann irgendwie kombinieren? Muss ich ein einzelnes MVC Pattern pro join definieren?

Gibt es außer diesem Forum sonst noch Geheimtipps ;-)?

LG

Folgendes vorab: Ich habe noch nicht mit gii gearbeitet und die Files immer manuell geschrieben, daher weiß ich nicht in wie fern du das folgende mit Gii umsetzen kannst:

Für jede Tabelle brauchst du ein Model welches von CActiveRecord erbt, so wie im Guide beschrieben.

Da du von Joins redest gehe ich davon aus dass die Tabellen in Relation zueinander stehen. Diese Relationen kannst du über die Methode CActiveRecord::relations() abbilden - Auch hier ist der Guide wieder sehr hilfreich.

Anschließend musst du im Controller "nur noch" die Eingabedaten des Benutzers (sprich: Die Tabellen/Spalten die er ausgewählt hat) verarbeiten und entsprechende Datensätze zum Beispiel mit CActiveRecord::findAllByAttributes() von der Datenbank beziehen. Durch die vorher definierten Relations kannst du nun auch verknüpfte Datensätze beziehen, so wie im Guide unter Relational Active Record beschrieben.

Zur Ausgabe kannst du dann zum Beispiel CGridView verwenden. Oder dir manuell eine Tabelle basteln.

Geheimtips kann ich dir leider keine sagen. Außer: Für neue Fragen am besten einen neuen Thread eröffnen. Mike ist hier sehr aktiv und kennt sich mit dem Framework auch bestens aus. Von ihm bekommst du in den allermeisten Fällen eine schnelle kompetente Antwort. (Oder natürlich von anderen :))

Vielen Dank für diesen sehr ausführlichen und gut strukturierten post!

Ich bin gerade noch am herumexperimentieren, was bei der Fülle an Funktionen von yii doch recht zeitintensiv ist ;-).

Die Ausgabe mittels CGridView funktioniert wenn ich direkt eine Tabelle(Klasse) übergebe problemlos.

Auch die Relationen habe ich erfolgreich soweit getestet.

Aber wie kann ich das Ergebnisarray, welches ich mit findAll() erhalte an CGridView übergeben (oder irgendwie sonst ausgeben)?

Nach der Ausgabe mit var_dump vermute ich, dass das Array bereits ein "object" sein müsste - oder ist dem nicht so?

Der Versuch CGridView das erhaltene Array als > ‘dataProvider’=>$dummy, < zu übergeben schlägt leider fehl.

Du musst einen "Datenanbieter" (DataProvider) an das GridView übergeben. Dieses Objekt dient dazu, Daten für das GridView zeilenweise bereitzustellen. Davon gibt es verschiedene, je nachdem wo die Daten herkommen. Am einfachsten geht es wohl mit einem CActiveDataProvider. Man kann ein solches Objekt erstellen, indem man ihm einfach die gewünschten Abfragekriterien in einem CDbCriteria übergibt. Schau dir einfach mal die search() Methode in einem CActiveRecord-Model an, falls du schon mal ein CRUD erstellt hast. Dort siehst du exemplarisch, wie das ablaufen kann.

Allgemein solltest du den von Gii generierten Code eher als Anregung verstehen, den du selber anpassen wirst. Und bei all diesen Objekten gilt: Ihr Sinn erschließt sich meistens recht gut aus dem Namen (DataProvider, DbCritieria, ListView,…). Wenn man das mal etwas verinnerlicht hat, kommt einem alles eigentlich recht natürlich vor.