Superglobals und Funktionen
romy
- php
Hey,
hoffe es sind alle gut reingerutscht!?
AFAIk sind superglobals in allen selbst- und nicht selbstdefinierten Funktionen erreichbar!? GIlt dies nur für zB.$_SERVER oder auch für $HTTP_SERVER_VARS?
die php-Version meines Webservers ist php4.0.4.
Das Problem ist nämlich, dass ich auf $HTTP_POST_VARS nur zugreifen kann, wenn ich sie innerhalb der Funktion nochmals für global erkläre, dass finde ich ist nicht Sinn der Sache, oder. Was könnte da los sein?
danke
ciao
romy
Hi romy
hoffe es sind alle gut reingerutscht!?
Danke. Du auch hoffe ich ;-)
AFAIk sind superglobals in allen selbst- und nicht selbstdefinierten Funktionen erreichbar!? GIlt dies nur für zB.$_SERVER oder auch für $HTTP_SERVER_VARS?
die php-Version meines Webservers ist php4.0.4.
Das Problem ist nämlich, dass ich auf $HTTP_POST_VARS nur zugreifen kann, wenn ich sie innerhalb der Funktion nochmals für global erkläre, dass finde ich ist nicht Sinn der Sache, oder. Was könnte da los sein?
Das ist vollkommen richtig. Die $_* sind _super_global, die guten alten $HTTP_*_VARS sind nur _global_, deswegen musst du sie in Funktionen als global redeklarieren. Bei den $_* ist das eben nicht nötig - ob das gut ist oder nicht muss sich noch zeigen.
Fabian
Hi Fabian
hoffe es sind alle gut reingerutscht!?
Danke. Du auch hoffe ich ;-)
und wie *schlitter * *schlitter* ;)
Bei den $_* ist das eben nicht nötig - ob das gut ist oder nicht muss sich »» noch zeigen.
könnten daurch Sicherheitslücken auftreten?
Eigentlich ist es ja ganz praktisch, oder!?
ciao
romy
Hi
hoffe es sind alle gut reingerutscht!?
Danke. Du auch hoffe ich ;-)
und wie *schlitter * *schlitter* ;)
;)
Bei den $_* ist das eben nicht nötig - ob das gut ist oder nicht muss sich »» noch zeigen.
könnten daurch Sicherheitslücken auftreten?
Jein, nur nter extrem unglücklichen Umstäden, Stichwort: Register Globals. Aber es ist wie gesagt nicht ganz einfach den tausenden PHP-Newbies da draußen (*g*) zu erklären, warum das so ist, den sie finden es toll, wenn sie sich nicht um die VARS kümmern müssen - und schwuppssind da die Löcher...
Eigentlich ist es ja ganz praktisch, oder!?
Jein, nur wenn du auf "Alles-in-einem-Abwasch"-Scripte setzt. Wenn du PHP eher Prozedural anlegst ist es IMO sauberer mit Übergabewerten für jede Funktio zu arbeiten. Aber das ist eine Philosophie für sich. Hauptsache sicher und performant =)
Fabian
[desse Tastatr gerade die Ns und Us getötet hat, wie du beim Lesen wohl merke wirst...]
Hi,
Eigentlich ist es ja ganz praktisch, oder!?
Jein, nur wenn du auf "Alles-in-einem-Abwasch"-Scripte setzt. Wenn du PHP eher Prozedural anlegst ist es IMO sauberer mit Übergabewerten für jede Funktio zu arbeiten. Aber das ist eine Philosophie für sich. Hauptsache sicher und performant =)
theoretisch sehe ich das genauso, mein Problem sind, die verschiedenen Programmabschnitte in meinem Quellcode. Gut ich könnte diese über if-Anweisungen ansteuern, da hätte ich dass Problem nicht. Aber ist dass nicht total unperformant? (ob es das Wort gibt? ;))
Wenn ich aber die Abschnitte in Funktionen schreibe, müsste ich extrem viele Variablen übergeben (Sprachvariablen, sämtlich session-Variablen usw.), dass können bei einem Aufruf bei mir, bis zu 50 Stück sein, soll ich die alle im Funktionskopf mitübergeben? ODer doch lieber global deklarieren?
Vielleicht gibt es ja echt ne bessere (sichere) Lösung, ich lass mich gern belehren! ;)
Fabian
[desse Tastatr gerade die Ns und Us getötet hat, wie du beim Lesen wohl merke wirst...]
?
ciao
romy
Hi
Jein, nur wenn du auf "Alles-in-einem-Abwasch"-Scripte setzt. Wenn du PHP eher Prozedural anlegst ist es IMO sauberer mit Übergabewerten für jede Funktio zu arbeiten. Aber das ist eine Philosophie für sich. Hauptsache sicher und performant =)
theoretisch sehe ich das genauso, mein Problem sind, die verschiedenen Programmabschnitte in meinem Quellcode. Gut ich könnte diese über if-Anweisungen ansteuern, da hätte ich dass Problem nicht. Aber ist dass nicht total unperformant? (ob es das Wort gibt? ;))
Wenn ich aber die Abschnitte in Funktionen schreibe, müsste ich extrem viele Variablen übergeben (Sprachvariablen, sämtlich session-Variablen usw.), dass können bei einem Aufruf bei mir, bis zu 50 Stück sein, soll ich die alle im Funktionskopf mitübergeben? ODer doch lieber global deklarieren?
Vielleicht gibt es ja echt ne bessere (sichere) Lösung, ich lass mich gern belehren! ;)
Also ich schreibe alles was ich immer brauche in ein Array, das ich dann übergebe, also genau einen Parameter. Das hat auch zur Folge, dass das ganze Update-sicher ist, da ich nicht ständig bei allen Funktionen prüfen muss, ob auch die neuen Variablen alle übergeben wurden. Die alten Funktionen arbeiten so weiter und die neuen nehmen halt zusätzliche Variablen. Der IMHO große Vorteil dabei ist, dass man den Überblick behält. Aber das hängt natürlich vo de Anfordergen ab nd auch, welchen "Stil" man programmiert..
Fabian
Hi
Also ich schreibe alles was ich immer brauche in ein Array, das ich dann übergebe, also genau einen Parameter. Das hat auch zur Folge, dass das ganze Update-sicher ist, da ich nicht ständig bei allen Funktionen prüfen muss, ob auch die neuen Variablen alle übergeben wurden. Die alten Funktionen arbeiten so weiter und die neuen nehmen halt zusätzliche Variablen. Der IMHO große Vorteil dabei ist, dass man den Überblick behält. Aber das hängt natürlich vo de Anfordergen ab nd auch, welchen "Stil" man programmiert..
klingt gut, bin ich noch gar nicht drauf gekommen, war mir wahrscheinlich immer zu umständlich, aber bei näherer Betrachtung ist es wesentlich übersichtlicher, da hast Du Recht. Man lernt nie aus
ciao
romy
hi,
ab welcher Version von PHP kann ich eigentlich $_* verwenden?
ciao
Hi romy
ab welcher Version von PHP kann ich eigentlich $_* verwenden?
AFAIK ab 4.0.6, aber ich würde sie frühestens auf einem 4.1.x nehmen, da sie mir vorher etwas instabil scheinen (Ich weiß nicht, ob das begründet ist, aber mir kam es immer so vor, dass sie unter 4.0.x nicht ganz so global waren, wie sie sollten ;-)))
Fabian
Hallo Fabian,
AFAIK ab 4.0.6, aber ich würde sie frühestens auf einem 4.1.x nehmen, da sie mir vorher etwas instabil scheinen (Ich weiß nicht, ob das begründet ist, aber mir kam es immer so vor, dass sie unter 4.0.x nicht ganz so global waren, wie sie sollten ;-)))
Wo hast Du denn den Käse her?
Zitat aus http://de3.php.net/ChangeLog-4.php#4.1.0: (PHP 4.1.0)
| Introduced $_GET, $_POST, $_COOKIE, $_SERVER and $_ENV variables,
| which deprecate the old $HTTP_*_VARS arrays. In addition to be much shorter
| to type - these variables are also available regardless of the scope, and
| there's no need to import them using the 'global' statement. (Andi & Zeev)
Grüße,
Christian
Hallo Chrtistian,
Zitat aus http://de3.php.net/ChangeLog-4.php#4.1.0: (PHP 4.1.0)
| Introduced $_GET, $_POST, $_COOKIE, $_SERVER and $_ENV variables,
| which deprecate the old $HTTP_*_VARS arrays. In addition to be much shorter
| to type - these variables are also available regardless of the scope, and
| there's no need to import them using the 'global' statement. (Andi & Zeev)
soll das jetzt heissen, auch die $HTTP_*_VARS muss ich nicht übergeben bzw. global machen in Funktionen? Aber wieso funktioniert es dann nicht, erst wenn Sie übergeben werden?
ciao
romy
Hallo romy,
soll das jetzt heissen, auch die $HTTP_*_VARS muss ich nicht übergeben bzw. global machen in Funktionen?
Nein, die $HTTP_*_VARS musst Du _immer_ irgendwie in die Funktion bekommen, die sind _nicht_ superglobal. Es sind die $_*, die superglobal sind und die nicht übergeben werden müssen und das ist die Neuerung. (es gab' vorher AFAIK nichts superglobales)
Grüße,
Christian
Hallo Christian,
äh falsch verstanden sorry, Du meintest mit dem Käse die Äusserung über die Superglobalität ab 4.0.6 richtig?
Hatte es irgendwie falsch bezogen...
nun ja
ciao
romy
Hallo romy,
äh falsch verstanden sorry, Du meintest mit dem Käse die Äusserung über die Superglobalität ab 4.0.6 richtig?
Genau.
Hatte es irgendwie falsch bezogen...
Ich hatte mich schon gewundert... :-)
Grüße,
Christian
Hey,
hätte da gleich noch ne Frage.
Kann es sein, dass es bei Versionen unter 4.1.0 Probleme gibt, mit Mehrfach-includes, sprich
datei1 includiert datei2 und diese includiert datei3
Hab da nämlich auch Fehlermeldungen obwohl es lokal (4.1.0) läuft.
datei1 includiert datei2 funktioniert
aber sobald die datei2 auch ein include hat, sagt er immer
Warning: Failed opening 'test2.php' for inclusion (include_path='.:/usr/local//lib/php') in blabla/test.php on line 7
dies bedeutet doch, dass er die Datei nicht findet oder?
Desweiteren finde ich verwunderlich, das selbst wenn ich den absoluten Pfad nehme, er die Datei nicht findet.
ciao
romy
PS: gilt übrigens für require und include
PPS:Nur so zur Erklärung: versuche gerade meine Monatelange Arbeit auf den Webspace zu schieben, bislang ohne ersichtlichen Erfolg :(
Hallo romy,
hätte da gleich noch ne Frage.
Nur zu. :-)
Kann es sein, dass es bei Versionen unter 4.1.0 Probleme gibt, mit Mehrfach-includes, sprich
datei1 includiert datei2 und diese includiert datei3
Eigentlich nicht. Es gibt da generelle "Problem" mit verschiedenen Verzeichnissen, siehe http://www.dclp-faq.de/q/q-datei-einbinden.html, aber das scheint es ja nicht zu sein, nachdem es in 4.1 funktioniert.
dies bedeutet doch, dass er die Datei nicht findet oder?
Möglich. Er könnte auch an den Dateirechten scheitert - die Meldung heißt nur, dass er die Datei nicht öffnen konnte - entweder aus nicht-Existenz oder aus mangelnden Dateirechten oder sonstwas. PHP-Dateien sollten _mindestens_ die Rechtemaske 644 erhalten, damit alles klappt. (Bei korrekter Gruppe reicht 640, aber das ist )
Desweiteren finde ich verwunderlich, das selbst wenn ich den absoluten Pfad nehme, er die Datei nicht findet.
Seltsam, seltsam. Obligatorische Frage: (tut mir leid, das muss ich in dem Fall fragen) Hochgeladen hast Du sie?
Ach ja, welchen absoluten Pfad nimmst Du? Den vom Web-Stammbaum oder den vom Dateisystem?
PS: gilt übrigens für require und include
Nur in der Fehlerbehandlung. (require verursacht Fatal Error, include eine Warnung)
Grüße,
Christian
Hallo Christian,
Möglich. Er könnte auch an den Dateirechten scheitert - die Meldung heißt nur, dass er die Datei nicht öffnen konnte - entweder aus nicht-Existenz oder aus mangelnden Dateirechten oder sonstwas. PHP-Dateien sollten _mindestens_ die Rechtemaske 644 erhalten, damit alles klappt. (Bei korrekter Gruppe reicht 640, aber das ist )
-rw----r--
das ist nicht wirklich 644 ;)
dazu fehlt der Gruppe ein read richtig?
ergo: -rw-r--r-- müsste es heissen?
das wird dann wohl das Problem sein, wei kann ich jetzt alle Dateien auf einmal ändern oder muss ich jede einzeln ändern?
Seltsam, seltsam. Obligatorische Frage: (tut mir leid, das muss ich in dem Fall fragen) Hochgeladen hast Du sie?
ja, ich kann ja auf sie zugreifen und wenn ich dann den Pfad herauskopiere und diesen includiere, kommt trotzdem der Fehler. Klingt etwas utopisch, aber...
Ach ja, welchen absoluten Pfad nimmst Du? Den vom Web-Stammbaum oder den vom Dateisystem?
web-stammbaum
Hallo romy,
das ist nicht wirklich 644 ;)
dazu fehlt der Gruppe ein read richtig?
ergo: -rw-r--r-- müsste es heissen?
Ja.
das wird dann wohl das Problem sein, wei kann ich jetzt alle Dateien auf einmal ändern oder muss ich jede einzeln ändern?
Wenn Du Shell-Zugang hast über
chmod 0644 $(find . -name "*.php")
sonst müsstest Du das Handbuch Deines FTP-Programms konsultieren.
web-stammbaum
Das kann ja nicht funktionierien. Beim Includen spielt _immer_ das Dateisystem eine Rolle.
Grüße,
Christian
Hallo Christian,
An den Dateirechten lag es nicht! Auch nach der Änderung immernoch das Problem.
Vermutlich liegt es daran, dass er von einem anderen Standort ausgeht, wie beschrieben in dem link, denn DU gepostet hat.
Aber, warum läuft es lokal und sonst nicht
bzw. woher soll ich wissen wo er sich jetzt gerade befindet, Mit den Servervars bin ich nicht wirklich weit gekommen. Selbst wenn ich mir die zurechtschneide.
Also
datei1 includiert datei2 und diese enthält ein include
//die neu zu includierende Datei liegt im Gleichen Verzeichnis
// Datei1 liegt ein Verzeichnis höher
steht in datei2 :
a) include("test.php") gehts nicht
b) include("blabla/test.php") geht
c) include("/home/romy/usw/usw/blabla/test.php"); geht nicht
was kann ich da tun?
ciao
romy
Hallo Romy,
steht in datei2 :
a) include("test.php") gehts nicht
Siehe meinen Link.
b) include("blabla/test.php") geht
Gut zu wissen. :-)
c) include("/home/romy/usw/usw/blabla/test.php"); geht nicht
Dann stimmt der Pfad nicht. Andere Erklärung habe ich nicht.
include (dirname (__FILE__) . '/test.php');
müsste auch funktionieren. (Siehe meinen Link http://www.dclp-faq.de/q/q-datei-einbinden.html)
Grüße,
Christian
Hallo Christian,
c) include("/home/romy/usw/usw/blabla/test.php"); geht nicht
Dann stimmt der Pfad nicht. Andere Erklärung habe ich nicht.
ja er stimmte nicht,kleiner denkfehler
danke erstmal, ich versuche es mit der Variante aus dem link.
Mittlerweile wünschte ich mir, auf dem WebServer würde einfach nur eine neuere PHP-Version aufgespielt werden. Soviele Änderungen! Etwas nervig
ciao
romy
Hallo Romy, mein 1. Eintrag im neuem Jahr, wünsch euch allen noch ein gesundes und frohes Jahr 2003!
So dann mal zu deinem Problem...+
-rw----r--
das ist nicht wirklich 644 ;)
dazu fehlt der Gruppe ein read richtig?
ergo: -rw-r--r-- müsste es heissen?
644 heisst -rw-r--r-- also richtig ja ;-)
das wird dann wohl das Problem sein, wei kann ich jetzt alle Dateien auf einmal ändern oder muss ich jede einzeln ändern?
Was für ein FTP Tool benutzt du denn? Denn da gibts ziehmlich gute wie LeapFTP die das sehr gut beherrschen! Also alles markieren und dann chmod 644 usw...
Besten Gruß
cg