Ich kann Index nicht Definieren?

Shorty1968

Erfahrenes Mitglied
Hallo ich bekomme Folgende Fehlermeldung.
Code:
Fatal error: PHP notice in file /var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/cache/CacheBuilderDefinitions.class.php (19): Undefined index: synonym
Information:error message: PHP notice in file /var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/cache/CacheBuilderDefinitions.class.php (19): Undefined index: synonymerror code: 0file: /var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/WCF.class.php (281)php version: 5.3.3-7+squeeze17wcf version: 1.1.10 pl 1 (Tempest)date: Thu, 29 May 2014 04:24:15 +0000request: /index.php?page=TutorialSystemTutorial&tutorialID=23referer: http://wbb-support.eu/index.php?page=TutorialSystemOverview
Stacktrace:#0 /var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/cache/CacheBuilderDefinitions.class.php(19): WCF::handleError(8, 'Undefined index...', '/var/www/vhosts...', 19, Array)
 /var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/cache/CacheHandler.class.php(173): CacheBuilderDefinitions->getData(Array)
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/cache/CacheHandler.class.php(126): CacheHandler->rebuild(Array)
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/data/definition/DefinitionEditor.class.php(66): CacheHandler->get('cacheBuilderDef...')
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/data/message/bbcode/DefinitionBBCode.class.php(13): DefinitionEditor::getCache()
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/data/message/bbcode/BBCodeParser.class.php(351): DefinitionBBCode->getParsedTag(Array, 'Plugin', Array, Object(MessageParser))
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/data/message/bbcode/BBCodeParser.class.php(66): BBCodeParser->buildParsedString()
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/data/message/bbcode/MessageParser.class.php(87): BBCodeParser->parse('[color=#ff0000]...')
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/data/tutorialsystem/ViewableTutorialSystemTutorial.class.php(41): MessageParser->parse('[color=#ff0000]...', '1', '0', '1')
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/templates/compiled/282_0_1_tutorialSystemTutorial.php(154): ViewableTutorialSystemTutorial->getFormattedMessage()
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/template/Template.class.php(267): include('/var/www/vhosts...')
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/page/AbstractPage.class.php(100): Template->display('tutorialSystemT...')
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/page/TutorialSystemTutorialPage.class.php(335): AbstractPage->show()
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/page/AbstractPage.class.php(46): TutorialSystemTutorialPage->show()
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/util/RequestHandler.class.php(64): AbstractPage->__construct()
/var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/util/RequestHandler.class.php(92): RequestHandler->__construct('TutorialSystemT...', Array, 'page')
/var/www/vhosts/wbb-support.eu/httpdocs/index.php(8): RequestHandler::handle(Array)
{main}
Der Orginal Code sieht so aus.
PHP:
<?php
// wcf imports
require_once(WCF_DIR.'lib/system/cache/CacheBuilder.class.php');
require_once(WCF_DIR.'lib/data/definition/Definition.class.php');

class CacheBuilderDefinitions implements CacheBuilder {
    /**
    * @see CacheBuilder::getData()
    */
    public function getData($cacheResource) {
        $data = array();
     
        // definition
        $sql = "SELECT    *
                FROM     wcf".WCF_N."_definition
                ORDER BY word DESC";
        $result = WCF::getDB()->sendQuery($sql);
        while ($row = WCF::getDB()->fetchArray($result)) {
            $row['synonym'] = ArrayUtil::trim(explode(',', $row['synonym']));
            $data[$row['definitionID']] = new Definition(null, $row);
        }
     
        return $data;
    }
}
?>
Ich habe es wie Folgt Versucht,ich habe das
Code:
$data = array();
durch
Code:
if (!isset($data = array())
ersetz da bekomme ich.
Code:
Parse error: syntax error, unexpected '=', expecting ',' or ')' in /var/www/vhosts/wbb-support.eu/httpdocs/wcf/lib/system/cache/CacheBuilderDefinitions.class.php on line 11
Was habe ich Falsch gemacht und wie müsste es richtig sein?
 
Hi

zu deinem Änderungsversuch:
a) Du hast drei ( und nur zwei ) also Syntaxfehler
b) Es macht überhaupt keinen Sinn, so eine Codezeile zu schreiben.
Was soll die machen?
c) Das Problem ist laut Fehlermeldung nicht data.
Sondern row.

Erste Maßnahme:
Existiert die DB-Tabelle wcfblabla_definition und hat sie eine Spalte synonym?
Wenn nein: WBB falsch installiert.
 
Hallo Tatsächlich ist es so das die Tabele vorhanden ist aber die Spalte synonym text NOT NULL, wurde nicht übernommen obwohl diese in der install.sql vorhanden ist.
Seltsamer weisse wird in der install.sql das synonym Blau dargsetellt im Notpade++ Editor was bedeutet das und wie kann ich diese Spalte nun nachträglich installieren?

Wäre dazu Folgende Abfrage richtig?
SQL:
ALTER TABLE wcf1_definition ADD synonym text NOT NULL DEFAULT;
 
Dass sie Notepad++ blau darstellt, muss erstmal nichts bedeuten. Das Wort "SYNONYM" mag ja in anderen RDBMS ein reserviertes welches sein, aber MySQL unterstützt Synonyme nicht (http://www.informit.com/library/content.aspx?b=STY_Sql_24hours&seqNum=165). Folglich ist es kein reserviertes Schlüsselwort in MySQL. Um sicher zu gehen, kannst du jedoch

- den Query mal mit phpMyAdmin ausprobieren
- den Spaltennamen in sog. Backticks (`) setzen, das sind die schrägen Hochkommas von Links oben nach Rechts unten (ggf. zwei mal auf die Taste drücken, da es eine Akzent-Taste ist).

Das ist aber keine Erklärung für deine Syntax-Fehler in PHP!
 
Danke ich konnte den Fehler erst einmal mit Folgender Abfrage beheben.
Code:
ALTER TABLE `wcf1_definition` ADD `synonym` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `link`;
De noch würde ich die Syntax-Fehler auch noch gerne beheben,aber da weiß ich nicht wo und wie ich ansetzen muss.
 
Hast du den Original-Code noch mal versucht? Deine Änderungen haben die Syntax-Fehler anscheinend erst reingebracht. Was wolltest du mit dieser Code-Zeile denn bezwecken?

PHP:
if (!isset($data = array())

Die ergibt alleinstehen erstens keinen Sinn und ist zweitens sowohl syntaktisch als auch semantisch falsch. $data kann zu diesem Zeitpunkt im Code noch gar nicht mit Werten gefüllt sein, also ist eine isset()-Prüfung nicht erforderlich, da sie immer false zurückgeben würde.
 
Das war ein Fehler von mir ich bin davon ausgegangen das es in der betrefenden .php Datei definiert werden muss,das es ein Fehlender Tabelenspalten eintrag war darauf wäre ich durch diese Meldung nie gekommen.
 
Ja, das ist das Problem von "SELECT * FROM", denn der Query liefert keinen Fehler, aber die fehlende Spalte ist dann halt nicht im assoziativen Array $row enthalten. Wenn man statt "SELECT *" die Spalten angibt, die selektiert werden sollen, stellt man eher fest, dass in der Tabelle was nicht passen kann, da der SQL-Query dann in die Hose geht und man es sofort sieht. "SELECT *" holt halt alle Spalten aus der Tabelle, die da sind und wenn man dann im Array versucht, eine Spalte zu bekommen, die durch "*" nicht abgeholt werden kann, weil nicht existent, bekommt man dann halt einen "Undefined index".
 
Nachtrag: Ich muss meine Aussage bez. isset() relativieren:

PHP:
<?php
$data = array();

if(isset($data))
{
   echo "gesetzt";
}
else
{
   echo "nicht gesetzt";
}

Ausgabe:

Code:
gesetzt

Begründung:

Prüft, ob eine Variable existiert und ob sie nicht NULL ist

Da hab ich auch wieder was gelernt ;-)

Im Übrigen kannst du dir die Klasse "Definition" anschauen, um zu sehen, was mit $row dort angestellt wird und dann ggf. den SQL-Query so aufbauen, dass nur die Spalten selektiert werden, die

- in der Funktion public function getData($cacheResource)
- und in der Klasse Definition verwendet werden.

Das ist erstens nicht so fehleranfällig, und zweitens performanter. Es sollte die Regel sein, es so zu machen.
 
Zurück