define-Konstanten sind "plötzlich" leer !!!
Andreas G
- php
hallo,
ich bin noch recht neu in der PHP-welt aber folgendes problem verstehe ich komplett nicht mehr :( :
in dem script constants.php sind mit define Konstanten deklariert.
in dem script meinscript.php werden diese Konstanten benutzt (mit require also inkludiert). der witz an der sache ist nun, rufe ich meinscript.php aus z.b. xyzScript1.php auf, ist alles gut. rufe ich nun aber meinscript.php aus z.b. xyzScript2.php auf, sind die konstanten plötzlich leer! haben also keinen inhalt! der einzige unterschied zwischen xyzScript1.php und xyzScript2.php ist, daß in xyzScript2.php vorher noch eine DB abfrage stattfindet und diverse arrays erzeugt werden. ich mache jedoch an keiner stelle sowas wie unset_session oder sowas. und die scripte liegen auch alle im gleichen verzeichnis sodaß es auch keine probleme mit pfaden gibt o.ä. hat da jemand eine idee woran das liegen könnte? ich verzweifle langsam an dieser x-akte :(
gruß
Andi
echo $begrüßung;
[...] rufe ich meinscript.php aus z.b. xyzScript1.php auf [...]
Was genau bedeutet aufrufen in dem Fall?
ich mache jedoch an keiner stelle sowas wie unset_session oder sowas.
Konstanten leben vom define() bis zum Request-Ende. Mit Sessions haben sie nichts zu tun.
und die scripte liegen auch alle im gleichen verzeichnis sodaß es auch keine probleme mit pfaden gibt o.ä.
Dann hättest du ja ein include-Problem und dies sähest du durch Fehlermeldungen, wenn du sie nicht unterdrückt hast. Außerdem kannst du das Inkludieren auch durch eine Kontrollausgabe in der zu inkludierenden Datei verifizieren.
echo "$verabschiedung $name";
echo $begrüßung;
»» [...] rufe ich meinscript.php aus z.b. xyzScript1.php auf [...]
Was genau bedeutet aufrufen in dem Fall?
ich rufe in xyzScript1.php eine funktion auf die in meinscript.php definiert ist. wie gesagt, innerhalb von meinscript.php/dieser funktion werden nun diese konstanten verwendet, sind aber leer!?!?
hier nochmal als "abstrakte darstellung" :
1.)
constants.php {
define('KONSTANTE_1','K1');
define('KONSTANTE_2','K2');
}
2.)
meinscript.php {
require 'constants.php';
// Array mit o.g. Konstanten erzeugen !!!
return array;
}
3.)
xyzScript1.php {
$meinArray= require 'meinscript.php'; // Hier ist alles gut (bzw. $meinArray bleibt jetzt NICHT leer) !!!
}
4.)
xyzScript2.php {
// DB lesen !!!
// Sonstige Arrays basteln !!!
$meinArray= require 'meinscript.php'; // Hier ist jetzt alles schlecht (bzw. $meinArray bleibt jetzt leer, weil bei diesem Aufruf die Konstanten in meinscript.php '' waren) !!!
}
versteht das einer? ziemlich absurd, oder?
gruß
A
echo $begrüßung;
versteht das einer?
Nein, ich jedenfalls nicht. Beschreibe doch bitte nachvollziehbar mit echtem Code. Stell das Problem am besten mit dem geringst möglichen Code in neuen Dateien nach. Wenn es dann immer noch auftritt, kopier den Code hier ins Forum. Wenn nicht, suche die Unterschiede zwischen dem nachgestellten Code und dem Original. Alternativ kannst du auch eine Kopie des bisherigen Zustands erzeugen, dort alles rauswerfen, was für das Problem nicht nötig ist und das dann hier präsentieren.
echo "$verabschiedung $name";
Moin!
hier nochmal als "abstrakte darstellung" :
Wozu definierst du Konstanten, wenn du in Wirklichkein ein Array benötigst? Diese Vorgehensweise ist unsinnig.
Zweitens erscheint es mir nicht sehr schlau, die doch eher ungewöhnliche Methode anzuwenden, in der zu includierenden Datei ein Array mittels return zurückzugeben. Vernünftiger erscheint mir die Methode, einfach die zentrale Konfigurationsinformation im Array (oder eben auch in Konstanten) abzulegen, und dann direkt darauf zuzugreifen.
- Sven Rautenberg
Moin!
»» hier nochmal als "abstrakte darstellung" :
Wozu definierst du Konstanten, wenn du in Wirklichkein ein Array benötigst? Diese Vorgehensweise ist unsinnig.
was soll ich dazu noch sagen? :
hier geht es nicht darum ob das vorgehen designtechnisch "john carmack"-like ist, sondern um eine GANZ OFFENSICHTLICHE php spezifische "problematik", die ich u.U. ja übersehen haben könnte. da der aufruf aus script1 ja funktioniert, aber aus script2 eben nicht. warum auch immer! und ob es sinnig ist oder nicht, ist in diesem kontext völlig egal !!!
übrigens, da ich beruflich seit '95 in der c++/java software entwicklung unterwegs bin, könnte ich mir schon vorstellen daß ich ne ungefähre ahnung davon habe ob was sinn macht oder nicht, oder? ;)
wie auch immer der o.g. pseudocode stimmt schon wirklich mit dem tatsächlichen code überein. es werden in xyzScript2.php wirklich nur diverse key/value arrays - deren keys o.g. konstanten sind - erstellt, mehr nicht. daher macht das posten von mittlerweile 1500 zeilen code m.E. hier keinen sinn, weil da tatsächlich nicht mehr passiert.
das muss irgendwas mit dem php spezifischen gängigen require/include vorgehen zu tun haben, da ich in xyzScript2.php noch diverse andere scripte und konstanten inkludiere. aber mehr passiert da wirklich nicht!
Hi!
» »» hier nochmal als "abstrakte darstellung" :
»
» Wozu definierst du Konstanten, wenn du in Wirklichkein ein Array benötigst? Diese Vorgehensweise ist unsinnig.
was soll ich dazu noch sagen? :
hier geht es nicht darum ob das vorgehen designtechnisch "john carmack"-like ist, sondern um eine GANZ OFFENSICHTLICHE php spezifische "problematik", die ich u.U. ja übersehen haben könnte. da der aufruf aus script1 ja funktioniert, aber aus script2 eben nicht. warum auch immer! und ob es sinnig ist oder nicht, ist in diesem kontext völlig egal !!!
Warum reagierst Du so schroff, wenn man versucht Dir zu helfen?
übrigens, da ich beruflich seit '95 in der c++/java software entwicklung unterwegs bin, könnte ich mir schon vorstellen daß ich ne ungefähre ahnung davon habe ob was sinn macht oder nicht, oder? ;)
Der sinnvolle Einsatz der Shift-Taste ist Dir seitdem nicht eingefallen?
das muss irgendwas mit dem php spezifischen gängigen require/include vorgehen zu tun haben, da ich in xyzScript2.php noch diverse andere scripte und konstanten inkludiere. aber mehr passiert da wirklich nicht!
Inkludierst du in beiden Skripten Deine constants.php?
off:PP
Hi!
»» » »» hier nochmal als "abstrakte darstellung" :
»» »
»» » Wozu definierst du Konstanten, wenn du in Wirklichkein ein Array benötigst? Diese Vorgehensweise ist unsinnig.
»» was soll ich dazu noch sagen? :
»» hier geht es nicht darum ob das vorgehen designtechnisch "john carmack"-like ist, sondern um eine GANZ OFFENSICHTLICHE php spezifische "problematik", die ich u.U. ja übersehen haben könnte. da der aufruf aus script1 ja funktioniert, aber aus script2 eben nicht. warum auch immer! und ob es sinnig ist oder nicht, ist in diesem kontext völlig egal !!!Warum reagierst Du so schroff, wenn man versucht Dir zu helfen?
ist ja nicht persönlich gemeint, aber in foren erlebe ich sowas leider all zu oft daß auf das eigentliche problem oft nicht eingegangen wird, sondern meist erst sowas wie "dein code ist aber an der anderen stelle nicht so toll. aber zu deinem problem fällt mir grad nix ein." gepostet wird. warum auch immer! ist in hilfe-foren aber leider nicht sehr hilfreich. musst ich jetzt leider mal loswerden. nix für ungut, nicht böse gemeint!
Der sinnvolle Einsatz der Shift-Taste ist Dir seitdem nicht eingefallen?
benutz ich nur um was hervor zu heben (s.o.!). ist wohl so ein foren-ding und sicher eine alte programmierer macke! denn zwei variablen wie folgt zu benennen :
int meineIntvariable = 1;
int meineintvariable = 2;
geht zwar und benötigt auch die shift taste, kann einem aber echt 'ne freigabe und damit ein ganzes wochenende versauen :)) ... also bleiben wir unix-like immer schön klein ;)
»» das muss irgendwas mit dem php spezifischen gängigen require/include vorgehen zu tun haben, da ich in xyzScript2.php noch diverse andere scripte und konstanten inkludiere. aber mehr passiert da wirklich nicht!
Inkludierst du in beiden Skripten Deine constants.php?
NOCH nicht! bisher werden die konstanten WIRKLICH NUR in meinscript.php zum erzeugen des arrays inkludiert. ich wollte erstmal nur eine echo-ausgabe der arrays testen. dazu benötige ich in den aufrufenden scripten die konstanten ja NOCH nicht. wie gesagt, bei dem einen aufruf klappt die ausgabe, bei dem anderen nicht.
offensichtlich ist das wohl kein gängiges problem, oder? jedenfalls hab ich in keinem manual von ähnlichen problemen gelesen o.ä.! ich kann mir das wirklich auch nicht erklären. ich kann aber nur sagen daß ich schreibfehler in den scripten u.ä. wirklich ausschließen kann, da die scripte wirklich komplett durchlaufen, nur die konstanten sind in dem einen fall nicht da/leer. daher dachte ich daß das vllt eine eigenart oder eine "einsteiger-stolperfalle" von php ist, die ich als php neuling übersehen haben könnte. hmmm ...
ich glaube ich werde das jetzt komplett umbauen bzw. feiner modularisieren. ich gehe davon aus daß der fehler dann nicht mehr auftritt.
falls noch jemand eine idee hat, wär ich sehr dankbar.
wenn ich irgendwann mal rausfinden sollte woran es gelegen hat, werd ichs für die nachwelt natürlich hier mal posten :)
gruß
A
echo $begrüßung;
offensichtlich ist das wohl kein gängiges problem, oder?
Mir sind keine Probleme bekannt, bei denen Konstanten oder deren Inhalt verschwindet oder nicht abrufbar sind, obwohl sie definiert sind. Mir ist aber sehr wohl bekannt, dass es immer wieder gelingt die tollsten Fehler auch in scheinbar einfachste Sachverhalte einzubauen.
Es bringt jedenfalls für einen konkreten Fehler wenig, wenn immer nur umschrieben wird, wie etwas gemacht wird, darin kein grundlegendes Problem feststellbar ist oder es nicht heraustritt und dann immer wieder nur in anderen Worten _darüber_ zu reden, anstatt einmal konkreten nachvollziehbaren Code vorzuzeigen. Der soll sich keinesfalls auf die von dir erwähnten 1500 Zeilen erstrecken sondern soweit reduziert werden, dass das Problem grade noch vorhanden ist. Manchmal verschwindet es bereits dabei und es stellt sich vielleicht heraus, dass irgend ein Nebeneffekt eines anderen Programmteils die Ursache ist. Denn wenn du schon schreibst, dass du keine Riesenmenge Code posten möchtest, zeigt das, dass das Problem nicht nur in dem betrachteten kleinen Ausschnitt stecken muss sondern auch ganz woanders in dieser Menge angesiedelt sein kann.
ich kann aber nur sagen daß ich schreibfehler in den scripten u.ä. wirklich ausschließen kann, da die scripte wirklich komplett durchlaufen, nur die konstanten sind in dem einen fall nicht da/leer.
Bei Zugriffsversuchen auf nicht vorhandene Konstanten gibt es eine Notice-Meldung von PHP. Notice-Meldungen werden aber nur dann ausgegeben, wenn das error_reporting E_NOTICE beinhaltet. Normalerweise ist dies nicht so. Sorge bitte dafür, dass das error_reporting auf E_ALL steht (und display_errors auf on). Dann ist die Chance, keine Schreibfehler zu haben, aufgrund ausbleibender Notice-Meldungen deutlich höher als bei augenscheinlicher Kontrolle des Codes. Zudem kann man auch Konstanten in einer Kontrollausgabe abfragen. var_dump() eignet sich dafür. Und außerdem gibt es die Funktion get_defined_constants() mit der man sich ebenfalls vom (Nicht-)Vorhandensein von Konstanten überzeugen kann.
daher dachte ich daß das vllt eine eigenart oder eine "einsteiger-stolperfalle" von php ist, die ich als php neuling übersehen haben könnte. hmmm ...
define('FOO', 'bar');
echo FOO;
Daran ist nicht viel falsch zu machen. Und mittels Kontrollausgaben rund um die Definition und beim Anwenden der Variablen lässt sich nachprüfen, ob man mit seinen Vermutungen richtig liegt. Selbst dann, wenn die Teile an unterschiedlichen Stellen des Script-Konglomerats liegen.
falls noch jemand eine idee hat, wär ich sehr dankbar.
Ideen gib es viele. Nur hat vermutlich kaum einer Lust, den Aufwand zu treiben, alle Ideen auszubreiten, nur um festzustellen, dass viele oder alle davon umsonst waren, und es an etwas ganz anderem lag, das ein geübtes Auge sofort beim Anblick des Codes erkannt hätte.
Wenn du konkretere Antworten haben möchtest, solltest du auch etwas liefern, was man konkret anschauen kann. Ansonsten kann ich nur allgemeine Tipps zur Fehlersuche geben.
echo "$verabschiedung $name";
Guten Tag,
ist ja nicht persönlich gemeint, aber in foren erlebe ich sowas leider all zu
oft daß auf das eigentliche problem oft nicht eingegangen wird, sondern meist
erst sowas wie "dein code ist aber an der anderen stelle nicht so toll. aber
zu deinem problem fällt mir grad nix ein." gepostet wird. warum auch immer!
ist in hilfe-foren aber leider nicht sehr hilfreich. musst ich jetzt leider
mal loswerden. nix für ungut, nicht böse gemeint!
Nenn man (im Usenet) Kathinka's Law: Man bekommt nicht immer die Antwort, die man sich wünscht. Poste endlich deinen vollständigen Code, wenn du Hilfe willst.
geht zwar und benötigt auch die shift taste, kann einem aber echt 'ne
freigabe und damit ein ganzes wochenende versauen :)) ... also bleiben wir
unix-like immer schön klein ;)
Sprache ist aber nicht unix-like. Sie ist gut zu vögeln vs. Sie ist gut zu Vögeln. Verstanden?
offensichtlich ist das wohl kein gängiges problem, oder?
Keine Ahnung. Du postest ja keinen Code.
jedenfalls hab ich in keinem manual von ähnlichen problemen gelesen o.ä.! ich
kann mir das wirklich auch nicht erklären. ich kann aber nur sagen daß ich
schreibfehler in den scripten u.ä. wirklich ausschließen kann, da die scripte
wirklich komplett durchlaufen, nur die konstanten sind in dem einen fall
nicht da/leer.
Hättest du auch 15 Jahre Erfahrung in PHP, wüsstest du, dass das nichts bedeuten muss. PHP wird alles tun, um ein Skript irgendwie zum Laufen zu bringen. PHP beschwert sich, je nach Einstellung von error_reporting, aber auch umfangreich über Probleme. Poste deinen Code.
falls noch jemand eine idee hat, wär ich sehr dankbar.
Ja. Poste deinen Code.
Gruß
Christoph Jeschke
Moin!
»» »» hier nochmal als "abstrakte darstellung" :
»»
»» Wozu definierst du Konstanten, wenn du in Wirklichkein ein Array benötigst? Diese Vorgehensweise ist unsinnig.
was soll ich dazu noch sagen? :
"Ja, stimmt."
hier geht es nicht darum ob das vorgehen designtechnisch "john carmack"-like ist, sondern um eine GANZ OFFENSICHTLICHE php spezifische "problematik", die ich u.U. ja übersehen haben könnte. da der aufruf aus script1 ja funktioniert, aber aus script2 eben nicht. warum auch immer!
Das zu untersuchen liegt an dir. Mit Pseudocode wird dir nicht geholfen werden können, wenn der Pseudocode das Verhalten nicht zeigt.
Hast du das also nachgeprüft?
und ob es sinnig ist oder nicht, ist in diesem kontext völlig egal !!!
Finde ich nicht. Die spannende Frage ist beispielsweise, auf welche Weise aus den Konstanten ein Array wird.
Und wie du dann später auf das Array zugreifst.
übrigens, da ich beruflich seit '95 in der c++/java software entwicklung unterwegs bin, könnte ich mir schon vorstellen daß ich ne ungefähre ahnung davon habe ob was sinn macht oder nicht, oder? ;)
Wenn du seit 15 Jahren C++ und Java programmierst, dann hast du eventuell Ahnung davon, was in C++ und Java Sinn macht. Was in PHP Sinn macht, darüber kannst du dir nur ein Urteil erlauben, wenn du auch in PHP entsprechend lange Erfahrungen hast.
Im übrigen ist es unerheblich, wie lange du schon irgendetwas programmierst. Es ist grundsätzlich möglich, sich gerade als langjähriger Programmierer in die unsinnigsten Dinge verrennen zu können, und entsprechende Hinweise jüngerer Codeleser mit der Bemerkung wegzuwischen, dass die ja nicht die Erfahrung haben, um den Sinn zu erkennen.
Nun ja: Ich erkenne den Sinn nicht, und ich bilde mir ein, in PHP durchaus Erfahrungen vorweisen zu können. Also vielleicht erklärst du mir dann einfach mal, was du da machst, welchen Sinn das für dich hat, und warum es nicht anders geht. Ich lerne gerne dazu.
wie auch immer der o.g. pseudocode stimmt schon wirklich mit dem tatsächlichen code überein. es werden in xyzScript2.php wirklich nur diverse key/value arrays - deren keys o.g. konstanten sind - erstellt, mehr nicht. daher macht das posten von mittlerweile 1500 zeilen code m.E. hier keinen sinn, weil da tatsächlich nicht mehr passiert.
Man hat schon Skripte gesehen, die irgendwo einen unerwarteten Tippfehler hatten oder ähnliches.
Deshalb mal dumm gefragt: Hast du alle Notices an? Hast du auf eventuelle PHP-(Fehler)Meldungen geprüft? Gibts da irgendwas berichtenswertes?
das muss irgendwas mit dem php spezifischen gängigen require/include vorgehen zu tun haben, da ich in xyzScript2.php noch diverse andere scripte und konstanten inkludiere. aber mehr passiert da wirklich nicht!
Aha, also schon wieder Abweichungen von Realität und Pseudocode.
Du kannst ja wirklich gern abstrahieren und reduzieren, um eine Problemlösung im Forum zu erhalten. Aber Grundbedingung solcher Abstraktion ist, dass diese das originale Problem auch zeigt. Das kann ich hier nicht erkennen.
- Sven Rautenberg
Ahoi,
was du beschreibst, kann nicht sein, deshalb vermute ich mal, die E_NOTICE E_ALL könnten vielleicht sowas wie "konnte datei nicht finden" ausspucken.
zudem findest du hier sehr gepflegte fachkenntnis. was du in sonstigen foren erlebst gleicht mit sicherheit nicht immer dem, was du hier erlebst. mit sauberem fragen und eingrenzen des problems kommst du hier in der regel sehr schnell zu einer lösung. dazu gehört natürlich auch die bereitschaft, die ratschläge mal auszuprobieren.
Dank und Gruß,