Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
10.11.2008, 21:57
luckerking



Die Methode readXML liefert mir keinen Rückgabewert, obwohl mir das echo in der Methode den Content ausgibt...
Warscheinlich seh ich den Wald vor lauter Bäumen nicht.

Quellcode:[...]
echo self::readXMl("dbName"); //gibt nix aus
[...]


private static function readXMl($name){
        if (file_exists("../core/config.xml")) {
            $xml = simplexml_load_file("../core/config.xml");
            $path = "/vars/var[@name='".$name."']";
            if (!$res = $xml->xpath($path)){
                return null;
            }
               else{
                   echo $res[0]->content; //content 100%tig vorhanden
                   return $res[0]->content;
               }
        }
        else
        {
            return null;
        }
    }

--

zum Seitenanfang zum Seitenende Profil || Suche
001
10.11.2008, 22:42
Bluthund



Woher nimmst du bitte content?! SimpleXMLElement hat kein Member, dass content heißt. Deine Indents sind auch Katastropha.
Auch wärs praktisch gewesen wenn du auch das XML-Dokument mitgepostet hättest, was du versuchst zu durchlaufen.
Da SimpleXMLElement __toString implementiert, kannst du direkt über $res[0] auf den Inhalt des ersten passenden Elements zugreifen.
Quellcode:<?php
function readXMl($name)
{
    if (file_exists("../core/config.xml"))
    {
        $xml = simplexml_load_file("../core/config.xml");
        $path = "/vars/var[@name='".$name."']";

        if (!$res = $xml->xpath($path))
        {
            return null;
        }
        else
        {
            return $res[0];
        }
    }
    else
    {
        return null;
    }
}

echo readXMl("dbName");
?>
funzt bei mir mit
Quellcode:<?xml version="1.0" ?><vars><var name="dbName">foobar</var></vars> einwandfrei.
Output:

Zitat:
$ php < test.php
foobar

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 10.11.2008 um 22:52 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
10.11.2008, 22:55
gerk



Zitat:
Bluthund postete
Woher nimmst du bitte content?! SimpleXMLElement hat kein Member, dass content heißt.
SimpleXML legt bei xpath() für alle Elemente des aktuellen Knotens Membervariablen mit den jeweiligen Tag-Namen an. Insofern funktioniert zB »content« schon. (Natürlich nur, wenn dein aktuelles Element noch ein Kind-Element hat, das content heißt.)

Ansonsten stimme ich Bluthund zu; Das XML-Dokument hättes du ruhig posten können, denn bei mir funktioniert das ebenfalls. Ich kann mir aber vorstellen, dass du irgendwo anders bereits den Wert ausgibst.

Lass dir via print_r($res[0]) mal das ganze Objekt anzeigen.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“


Dieser Beitrag wurde am 10.11.2008 um 22:59 von gerk bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
10.11.2008, 23:07
Bluthund



Stimmt, wenn da noch nen content-Element drunter ist funzt es natürlich. Nicht bedacht.
Allerdings find ichs auch ein wenig abwegig unter nem Element mit Namen var noch nen Element content unterzubringen (value vielleicht aber sicher nicht content ^^). Aber ProductionCode spricht da ja teilweise ne ganz andere Sprache :/

*etwas von 61 Joins murmelt*

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 10.11.2008 um 23:10 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
11.11.2008, 09:54
luckerking



Das xml Dokument sieht in etwa so aus
Quellcode:<?xml version="1.0" encoding="ISO-8859-1" ?>
<vars><var name="dbName">
<content>foobar<content>
</var>
</vars>
Leider habe ich den Code gerade nicht hier.
Gestern abend ist mir noch etwas seltsames aufgefallen.
Folgender Code(aus dem Kopf und warscheinlich nicht der wirkliche Fehler):
Quellcode:public static function loadConfig(){

self::$dbName = self::readXMl("dbName");
self::$dbName = self::readXMl("dbName");

}


private static function readXMl($name){
        if (file_exists("../core/config.xml")) {
            $xml = simplexml_load_file("../core/config.xml");
            $path = "/vars/var[@name='".$name."']";
            if (!$res = $xml->xpath($path)){
                return null;
            }
               else{
                   echo $res[0]->content; //content 100%tig vorhanden
                   return $res[0]->content;
               }
        }
        else
        {
            return null;
        }
    }

Die Ausgabe beim Aufruf der Funktion loadConfig
Quellcode:foobar
Warum zum Teufel gibt er mir nur einmal foobar aus, obwohl ich 2 mal hintereinander die selbe Methode aufrufe...

Heut abend werde ich mal den ganzen Code posten, da ich mir nicht mehr vorstellen kann, dass es nur an diesem Codeausschnitt liegt.

Zitat:
Allerdings find ichs auch ein wenig abwegig unter nem Element mit Namen var noch nen Element content unterzubringen (value vielleicht aber sicher nicht content ^^).
Da sieht man mal, wie verwirrt ich gestern schon war (natürlich hast du recht :))

--

zum Seitenanfang zum Seitenende Profil || Suche
005
11.11.2008, 10:09
Bluthund



Ist nen Wunder, dass überhaupt was rauskommt.
Das XML-Dokument ist nicht wohlgeformt.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
006
11.11.2008, 10:12
luckerking



Das passiert, wenn man etwas aus dem Kopf schreibt.
So siehts natürlich aus:
Quellcode:<?xml version="1.0" encoding="ISO-8859-1" ?>
<vars>
<var name="dbName">
<content>foobar</content>
</var>
</vars>

--


Dieser Beitrag wurde am 11.11.2008 um 10:12 von luckerking bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
11.11.2008, 10:19
Bluthund



Streu doch einfach mal paar DEBUG-Ausgaben ein. Namentlich an die Stellen vor den returns und ersetz die jetzige echo-Ausgabe, wie schon von gerk vorgeschlagen, durch print_r($res). Oder geh stepwise durch den Code und schau dir an was passiert (falls das bei PHP geht, hab damit Gott sei Dank nix mehr am Hut). Es gibt doch so viele schöne Möglichkeiten :)
Davon abgesehen is XML grottig verbose für ne simple Konfigurationsdatei.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
008
11.11.2008, 10:27
luckerking



Zitat:
Davon abgesehen is XML grottig verbose für ne simple Konfigurationsdatei.
Ich weiß zwar nicht was "grottig verbose" heißt, aber ich kann es mir vorstellen.
Was wäre den deiner Meinung nach eine bessere (moderne) Konfigurationsdatei?
Mir kommt es darauf an, dass die Konfigurationsdatei zukunftssicher ist und das sollte xml nach meiner Erfahrung sein.

--

zum Seitenanfang zum Seitenende Profil || Suche
009
11.11.2008, 10:34
Bluthund



http://www.dict.cc/?s=verbose

Plaintext àlá Quellcode:key = value geparsed durch zeilenweises einlesen, falls das für deine Zwecke ausreicht (keine Mehrzeiler ohne Delimiter möglich, flache Struktur). Für internationalen Einsatz UTF-8, was du btw auch für dein XML nutzen solltest, da laut Standard ISO-8859 nicht unterstützt werden muss. Aber selbst ASCII sollte noch lange genug am Leben sein um "zukunftssicher" (zukunftssichere Software, der war gut) zu sein.
Solltest du Baumstrukturen oder auch Netze haben oder das Dokument auch über die Grenzen deiner Software hinweg nutzen, ist XML natürlich gut geeignet. Aber für simple Wertzuweisungen auf Konfigurationsvariablen ist XML absoluter Overkill.

“Perfection is achieved not when there is nothing left to add, but when there is nothing left to take away” - Antoine de Saint

edit: Ansonsten könntest du auch simpel und einfach auf das altgediente Schwert "include('config.inc.php')" zurückgreifen (am besten ne simple Konfigurationsklasse da rein).

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 11.11.2008 um 10:52 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
11.11.2008, 20:42
luckerking



Ich werde warscheinlich wirklich ein einfaches Array benutzen.
Irgendwie fällt mir aber gerade nicht ein, wie ich das bewerkstelligen soll.
Die Daten sollen später nur über die statische Config Klasse abrufbar sein.
Die Werte muss beim installieren des Systems in die Config schreiben.

Wenn ich also eine php Datei mit folgendem Inhalt schreibe, wie schütze ich dieses Array vor externen zugriff außer über die config Klasse?

Zitat:
config_vars["dbname"] = "foobar";
config_vars["files"][] = "file1";
config_vars["files"][] = "file2";
Warscheinlich ist die Lösung ganz einfach und ich steh einfach auf dem Schlauch.

--

zum Seitenanfang zum Seitenende Profil || Suche
011
11.11.2008, 20:58
funner
Founder/Admin


wie wäre es mit YAML?

wikipedia beschreibung: http://de.wikipedia.org/wiki/YAML
PHP Implementierung: http://spyc.sourceforge.net/

--

zum Seitenanfang zum Seitenende Profil || Suche
012
11.11.2008, 21:09
luckerking



Ungetestest, aber sollte es nicht so funktionieren?

Quellcode:vars.php

self::$dbname= "foobar";
self::$files[] = "file1";
self::$files[] = "file2";
Quellcode:config.php
private static $dbname;
private static $files;
public static function loadConfig(){

require_once("vars.php");

}
Ich werd mir mal YAML anschauen.
Wie gebräuchlich ist es den?

Edit:

Ich war einfach zu blöd und habe nicht gemerkt, dass ich genau die Variable, die ich bei dem Test abgefragt habe, bei der Installation durch einen fehlerhaften Namen nicht ind die XMl Datei hineingeschrieben habe und er mir somit immer ein leer String zurück gegeben hat.

Ich werde vorerst die Xml Datei als Config behalten.

--


Dieser Beitrag wurde am 11.11.2008 um 21:54 von luckerking bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
013
12.11.2008, 12:26
gerk



Wobei dein zu Grunde liegendes Format ja keinen Einfluss auf die Art des Zugriffs hat. Ich persönlich halte es ebenfalls für völlig breit, XML für Konfigurationsdateien zu benutzen.

Zitat:
Wenn ich also eine php Datei mit folgendem Inhalt schreibe, wie schütze ich dieses Array vor externen zugriff außer über die config Klasse?
Datenkapselung?

Und in deinem speziellen Fall wohl Methoden.

Genau das ist der Grund, warum "Kenntnisse in den meisten Programmiersprachen" ziemlich nutzlos sind.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
014
12.11.2008, 14:47
luckerking



Ich weiß sehr wohl, was Datenkapselung ist und was Methoden sind!
(Könnte man ja daran erkennen, das mein erster Beispiel Code genau diese bestimmten Modifizier(private) benutzt)

Ich wusste nur nicht, dass ein includierter php Code nicht zwingend von überall zugreifbar ist, wenn man ihn an der richtigen Stelle includiert.
Das ich dann die Member von meiner Klasse Private mache und getter Methoden erstellen war mit schon bewusst.

Zitat:
Genau das ist der Grund, warum "Kenntnisse in den meisten Programmiersprachen" ziemlich nutzlos sind.
Aha, ich würde mal sagen, der Grund bezieht sich nur auf die Annahme, dass du mich für jemanden hälst, der mit ein paar "hello world" Programmen in ein paar Programmiersprache angeben muss.
Da muss ich dich leider entäuschen und sagen, dass ich sehr wohl die grundlegenden Dinge weiß und sie auch fleißig anwende. Trotzdem habe ich noch nicht die Erfahrung wie manch anderer Programmierer hier und deshalb frage ich gerne mal nach.

Zitat:
Ich werde vorerst die Xml Datei als Config behalten.
D.h. nicht, dass ich mir andere Herangehensweisen anschauen werde.

Mit der einfachen Array Methode würde ich das warscheinlich so lösen:

Die vars.php würde bei mir so aussehen, {dbName} usw. sind nur Platzhalter, die ich beim Installieren mit den entsprechenden Werten überschreibe.
Außerdem kann die Konfigruations Datei keine Arrays mehr aufnehmen, wie ich bei einem anderen Beispiel noch gezeigt hatte(wird sowieso nicht benötigt).

Quellcode:self::$dbName= "{dbName}";
self::$dbServer= "{dbServer}";
self::$dbUser= "{dbUser}";
Die statische Klasse config würde die statische Methode LoadConfig haben, in der ich einfach die vars.php includiere.
Quellcode:public static function loadConfig(){

//überschreibt die statischen Variablen der config Klasse
require_once("vars.php");

}

--


Dieser Beitrag wurde am 12.11.2008 um 14:49 von luckerking bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
14.11.2008, 21:51
K-Putt



Warum überhaupt Variablen?

Ich gehe mal davon aus, dass sich deine Zugangsdaten während der Laufzeit nicht ändern, von daher wäre die Verwendung von Konstanten innerhalb der Klasse angebracht. Eine Config Klasse könnte man somit als eine Art Namespace sehen, um dann mit Config::DB_NAME darauf zugreifen zu können.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche
016
15.11.2008, 21:58
luckerking



Stimmt.

(Was soll ich mehr sagen :))

--

zum Seitenanfang zum Seitenende Profil || Suche