Erbt von meiner DatabaseObject klasse, also app\data\app\App und von der AbstractPage.
Alles, was in der Tabelle Application steht, kann ich mit {$app->name} ausgeben, benötige aber eben einzelne Teile aus der Tabelle Phase, darum das LeftJoin
Erbt von meiner DatabaseObject klasse, also app\data\app\App und von der AbstractPage.
Alles, was in der Tabelle Application steht, kann ich mit {$app->name} ausgeben, benötige aber eben einzelne Teile aus der Tabelle Phase, darum das LeftJoin
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.
...
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.
Und welche Page Klasse ist dann hierzu zu empfehlen?
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
/**
* Gets a specific app decorated as viewable app.
*
* @param integer $appID
* @return app\data\app\AppList
*/
public static function getApp($appID) {
$list = new AppList();
$list->setObjectIDs(array($appID));
$list->sqlSelects = 'phase.phaseName, phase.personal1, phase.personal2, phase.personal3, phase.personal4, phase.field1, phase.field2, phase.field3, phase.field4' ;
$list->sqlJoins = "LEFT JOIN app".WCF_N."_phase phase ON (phase.phaseID = application.phaseID)";
$list->readObjects();
$objects = $list->getObjects();
if (isset($objects[$appID])) return $objects[$appID];
return null;
}
Display More
und so könnte dann deine AppPage.class.php aussehen.
<?php
namespace app\page;
use app\data\app\App;
use wcf\page\AbstractPage;
use wcf\system\exception\IllegalLinkException;
use wcf\system\WCF;
/**
* ListPage
*
* @author Fabian Graf
* @license Creative Commons <by-nc-nd>
* @package de.fabihome.app
*/
class AppPage extends AbstractPage {
public $templateName = 'app';
public $activeMenuItem = 'app.menu.link.application';
public $appID = 0;
public $app = null;
/**
* @see \wcf\page\IPage::readParameters()
*/
public function readParameters() {
AbstractPage::readParameters();
if (isset($_REQUEST['id'])) $this->appID = intval($_REQUEST['id']);
$this->app = App::getApp($this->appID);
if ($this->app === null) {
throw new IllegalLinkException();
}
}
public function assignVariables() {
parent::assignVariables();
WCF::getTPL()->assign([
'appID' => $this->appID,
'app' => $this->app,
]);
}
}
Display More
Da App von DatabaseObject erbt, könnte er es auch über den Konstruktor vom DatabaseObject machen:
/**
* @see \wcf\page\IPage::readParameters()
*/
public function readParameters() {
parent::readParameters();
if (isset($_REQUEST['id'])) $this->appID = intval($_REQUEST['id']);
$this->app = new App($this->appID);
if ($this->app->appID === null) {
throw new IllegalLinkException();
}
}
Display More
Danke, hat mir sehr geholfen
Hab grad folgendes Problem...
Fri, 03 Jun 2016 13:42:15 +0000
Message: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'phaseID' in where clause is ambiguous
File: /var/www/dev/wcf/lib/system/database/Database.class.php (231)
PHP version: 7.0.7-1~dotdeb+8.1
WCF version: 2.1.10 (Typhoon)
Request URI: /app-mod/?phaseID=2&state=1
Referrer:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36
Information: "<b>sql type:<\/b> wcf\\system\\database\\MySQLDatabase<br \/><b>sql error:<\/b> Column 'phaseID' in where clause is ambiguous<br \/><b>sql error number:<\/b> 23000<br \/><b>sql version:<\/b> 5.5.5-10.1.14-MariaDB-1~trusty<br \/><b>sql query:<\/b> SELECT\tphase.phaseName,\n\t\t\t\t\tapplication.*\n\t\t\t\tFROM\tapp1_application application\n\t\t\t\t\tLEFT JOIN app1_phase phase ON (phase.phaseID = application.phaseID)\n\t\t\t\t\tWHERE phaseID LIKE ? AND state LIKE ?\n\t\t\t\t\t LIMIT 15<br \/>"
Stacktrace:
#0 /var/www/dev/wcf/lib/data/DatabaseObjectList.class.php(199): wcf\system\database\Database->prepareStatement('SELECT\tphase.ph...', '15', 0)
#1 /var/www/dev/wcf/lib/page/MultipleLinkPage.class.php(159): wcf\data\DatabaseObjectList->readObjects()
#2 /var/www/dev/wcf/lib/page/MultipleLinkPage.class.php(130): wcf\page\MultipleLinkPage->readObjects()
#3 /var/www/dev/wcf/lib/page/SortablePage.class.php(54): wcf\page\MultipleLinkPage->readData()
#4 /var/www/dev/wcf/lib/page/AbstractPage.class.php(273): wcf\page\SortablePage->readData()
#5 /var/www/dev/wcf/lib/page/AbstractPage.class.php(100): wcf\page\AbstractPage->show()
#6 /var/www/dev/wcf/lib/system/request/Request.class.php(58): wcf\page\AbstractPage->__run()
#7 /var/www/dev/wcf/lib/system/request/RequestHandler.class.php(139): wcf\system\request\Request->execute()
#8 /var/www/dev/join/index.php(3): wcf\system\request\RequestHandler->handle('app')
#9 {main}
Display More
Dazu ist das mein Code:
<?php
namespace app\page;
use wcf\page\SortablePage;
use wcf\system\database\PostgreSQLDatabase;
class AppModPage extends SortablePage {
/**
* @see \wcf\page\MultipleLinkPage::$itemsPerPage
*/
public $itemsPerPage = '15';
public $activeMenuItem = 'app.menu.link.application';
public $sortOrder = 'DESC';
public $objectListClassName = 'app\data\app\AppList';
public $phaseID = '';
public $phase = null;
public $userID = '';
public $state ='';
/**
* @see \wcf\page\IPage::readParameters()
*/
public function readParameters() {
parent::readParameters();
if (isset($_REQUEST['phaseID'])){
$this->phaseID = $_REQUEST['phaseID'];
}
if (isset($_REQUEST['state'])){
$this->state = $_REQUEST['state'];
}
if (isset($_REQUEST['userID'])){
$this->userID = $_REQUEST['userID'];
}
}
/**
* @see \wcf\page\MultipleLinkPage::initObjectList()
*/
protected function initObjectList() {
parent::initObjectList();
if (!empty($this->phaseID)) {
if ($this->phaseID){
$this->objectList->getConditionBuilder()->add("phaseID LIKE ?", array($this->phaseID));
}
}
if (!empty($this->state)) {
if ($this->state){
$this->objectList->getConditionBuilder()->add("state LIKE ?", array($this->state));
}
}
if (!empty($this->userID)) {
if ($this->userID){
$this->objectList->getConditionBuilder()->add("userID LIKE ?", array($this->userID));
}
}
$this->objectList->sqlSelects = 'phase.phaseName';
$this->objectList->sqlJoins = "LEFT JOIN app".WCF_N."_phase phase ON (phase.phaseID = application.phaseID)";
}
}
Display More
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
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
$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
Fri, 03 Jun 2016 14:13:13 +0000
Message: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE phaseID LIKE ? AND state LIKE ?
LIMIT 15' at line 4
File: /var/www/dev/wcf/lib/system/database/Database.class.php (231)
PHP version: 7.0.7-1~dotdeb+8.1
WCF version: 2.1.10 (Typhoon)
Request URI: /app-mod/?phaseID=2&state=1
Referrer:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36
Information: "<b>sql type:<\/b> wcf\\system\\database\\MySQLDatabase<br \/><b>sql error:<\/b> You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE phaseID LIKE ? AND state LIKE ?\n\t\t\t\t\t LIMIT 15' at line 4<br \/><b>sql error number:<\/b> 42000<br \/><b>sql version:<\/b> 5.5.5-10.1.14-MariaDB-1~trusty<br \/><b>sql query:<\/b> SELECT\tphase.phaseName,\n\t\t\t\t\tapplication.*\n\t\t\t\tFROM\tapp1_application application\n\t\t\t\t\tLEFT JOIN app1_phase phase ON (phase.phaseID = application.phaseID) WHERE application.phaseID = '2'\n\t\t\t\t\tWHERE phaseID LIKE ? AND state LIKE ?\n\t\t\t\t\t LIMIT 15<br \/>"
Stacktrace:
#0 /var/www/dev/wcf/lib/data/DatabaseObjectList.class.php(199): wcf\system\database\Database->prepareStatement('SELECT\tphase.ph...', '15', 0)
#1 /var/www/dev/wcf/lib/page/MultipleLinkPage.class.php(159): wcf\data\DatabaseObjectList->readObjects()
#2 /var/www/dev/wcf/lib/page/MultipleLinkPage.class.php(130): wcf\page\MultipleLinkPage->readObjects()
#3 /var/www/dev/wcf/lib/page/SortablePage.class.php(54): wcf\page\MultipleLinkPage->readData()
#4 /var/www/dev/wcf/lib/page/AbstractPage.class.php(273): wcf\page\SortablePage->readData()
#5 /var/www/dev/wcf/lib/page/AbstractPage.class.php(100): wcf\page\AbstractPage->show()
#6 /var/www/dev/wcf/lib/system/request/Request.class.php(58): wcf\page\AbstractPage->__run()
#7 /var/www/dev/wcf/lib/system/request/RequestHandler.class.php(139): wcf\system\request\Request->execute()
#8 /var/www/dev/join/index.php(3): wcf\system\request\RequestHandler->handle('app')
#9 {main}
Display More
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:
$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.
Gut zu wissen.
Und zum Problem, dass nichts angezeigt wird? Kommentiere ich die Zeile aus, ist alles da... (Ohne Filter)
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;
Mit der URL /app-mod/?phaseID=2&state=1&userID=2 Steht dann eine 2 da
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;
<?php
namespace app\page;
use wcf\page\SortablePage;
use wcf\system\database\PostgreSQLDatabase;
use wcf\system\WCF;
class AppModPage extends SortablePage {
/**
* @see \wcf\page\MultipleLinkPage::$itemsPerPage
*/
public $itemsPerPage = '15';
public $activeMenuItem = 'app.menu.link.application';
public $sortOrder = 'DESC';
public $objectListClassName = 'app\data\app\AppList';
public $phaseID = '';
public $phaseName = '';
public $phase = null;
public $userID = '';
public $state = '';
/**
* @see \wcf\page\IPage::readParameters()
*/
public function readParameters() {
parent::readParameters();
if (isset($_REQUEST['phaseID'])){
$this->phaseID = $_REQUEST['phaseID'];
}
if (isset($_REQUEST['state'])){
$this->state = $_REQUEST['state'];
}
if (isset($_REQUEST['userID'])){
$this->userID = $_REQUEST['userID'];
}
}
/**
* @see \wcf\page\MultipleLinkPage::initObjectList()
*/
protected function initObjectList() {
parent::initObjectList();
$this->objectList->sqlSelects = 'phase.phaseName';
$this->objectList->sqlJoins = "LEFT JOIN app".WCF_N."_phase phase ON (phase.phaseID = application.phaseID)";
print_r($this->objectList); exit; $this->objectList->getConditionBuilder()->add("application.phaseID = ?", array($this->phaseID));
if (!empty($this->phaseID)) {
if ($this->phaseID){
$this->objectList->getConditionBuilder()->add("phaseID LIKE ?", array($this->phaseID));
}
}
if (!empty($this->state)) {
if ($this->state){
$this->objectList->getConditionBuilder()->add("state LIKE ?", array($this->state));
}
}
if (!empty($this->userID)) {
if ($this->userID){
$this->objectList->getConditionBuilder()->add("userID LIKE ?", array($this->userID));
}
}
}
}
Display More
So?
Dann kommt mit gleicher URL wie oben das:
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] => )
Don’t have an account yet? Register yourself now and be a part of our community!