List, Abfragen aus 2 SQL Tabellen

  • Poste bitte den kompletten Code von der Page und gegebenenfalls auch von den Klassen, die du in der Page verwendest, beispielsweise App. Alternativ kannst du die Dateien auch als Zip anhängen, falls das schneller geht.

  • Die Funktion protected function initObjectList() gibt es in der AbstractPage nicht. Da musst du das nun selber abbilden. Ich empfehle dir auch mal wirklich die Dateien genau anzuschauen was sie können und was nicht.

  • Wenn das ganze nicht Sortierbar oder Mehrseitig ist benutzt du hier die richtige klasse. Nur musst du das ganze dann anders angehen. Wenn ich das nun richtig sehe willst ein spezielen eintrag mit ID XY anzeigen und benötigst dazu auch die daten aus der anderen Tabelle.


    Füge diesen code in deine App.class.php


    und so könnte dann deine AppPage.class.php aussehen.

  • Da App von DatabaseObject erbt, könnte er es auch über den Konstruktor vom DatabaseObject machen:


  • Hab grad folgendes Problem...



    Dazu ist das mein Code:



    Ist dazu da, um meine Einträge in der Übersicht zu filtern. Schätzungsweise liegt das mit dem LEFT JOIN zusammen, hab nur kein Plan wieso, nutze dass ja woanders genauso

    • Official Post

    Wenn phaseID in beiden Tabellen vorkommt hast du das Problem, dass MySQL nicht weiß welche der beiden Spalten du verwendest. Dementsprechend musst du dafür sorgen, dass der Alias der jeweiligen Tabellen verwendet wird. Diese Information hättest du übrigens mit einer kurzen Google-Suche nach der Fehlermeldung auch erhalten, sogar schneller als du für das Verfassen dieses Beitrages brauchst ;)

  • PHP
    $this->objectList->sqlSelects = 'phase.phaseName';
            $this->objectList->sqlJoins = "LEFT JOIN app".WCF_N."_phase phase ON (phase.phaseID = application.phaseID) WHERE application.phaseID = '$this->phaseID'";

    führt zu



    • Official Post

    Schau dir mal deine Abfrage an, da taucht 2x WHERE auf, das kommt durch Zeile 2 in dem PHP-Code in deinem Beitrag. Füge application.phaseID = … einfach via Condition-Builder hinzu.

  • Unabhängig vom Problem, dass keine Einträge angezeigt werden, schreibe bitte die obige Zeile Code so:


    PHP
    $this->objectList->getConditionBuilder()->add("application.phaseID = ?", array($this->phaseID));


    Das sorgt dafür, dass keine SQL Injection etc. möglich ist, weil der Parameter (phaseID) vorher escaped wird.

  • Hast du dir mal ausgeben lassen, was in $this->phaseID drin steht? Füge direkt vor der Zeile des Condition Builders folgendes ein:


    print_r($this->phaseID); exit;

  • Kannst du zum einen bitte den ganzen Code hier einbinden und zum anderen gib dir bitte die objectList aus und zwar genau an der Stelle, bevor du readObjects() aufrust:


    print_r($this->objectList); exit;


  • So?


    Dann kommt mit gleicher URL wie oben das:



    Code
    app\data\app\AppList Object ( [className] => app\data\app\App [decoratorClassName] => [objectClassName] => [objects] => Array ( ) [objectIDs] => [sqlOffset] => 0 [sqlLimit] => 0 [sqlOrderBy] => [sqlSelects] => phase.phaseName [sqlConditionJoins] => [sqlJoins] => LEFT JOIN app1_phase phase ON (phase.phaseID = application.phaseID) [useQualifiedShorthand] => 1 [conditionBuilder:protected] => wcf\system\database\util\PreparedStatementConditionBuilder Object ( [parameters:protected] => Array ( ) [addWhereKeyword:protected] => 1 [concat:protected] => AND [conditions:protected] => ) [index:protected] => 0 [indexToObject:protected] => )

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!