# was ist PHP_SELF?



## Miraculixx (4. August 2005)

Ich habe schon unendlich viele Tutorials und Anleitungen durchgelesen, aber nirgends (auch nicht hier im Forum) etwas passendes gefunden. Überall wird zwar beschrieben, wie und wo man PHP_SELF verwenden kann, aber ich weiß noch immer nicht, WAS PHP_SELF ist?
Kann mir das bitte jemand erklären - ich möchte nicht dumm sterben 

Ich habe ja irgendwie den Verdacht, dass diese Variable den kompletten Pfad und Namen der aktuellen (also der eigenen) PHP-Datei wiedergibt. Falls das so sein sollte: was hat das für einen Sinn?


----------



## JohannesR (4. August 2005)

PHP_SELF ist ein Key der Superglobalen _SERVER. Der Inhalt von _SERVER['PHP_SELF'] ist der absolute Pfad zum Script plus der Dateiname. Wo der Sinn liegt? Naja, z.B. kannst du so das Ziel für ein Formular etc. schön dynamisch festlegen:

```
<form action="<?php print($_SERVER['PHP_SELF']); ?>" method="post">
```


----------



## Miraculixx (4. August 2005)

Also wenn meine Seite zum Beispiel auf C:\Web\mypage\index.php liegt, dann steht genau das in dieser PHP_SELF-Variable, habe ich das richtig verstanden?
Zum Sinn der Sache: man kann doch auch einfach nur action="index.php" rein schreiben, wo ist da dann der Unterschied?


----------



## JohannesR (4. August 2005)

Nein, das ist falsch. Wenn dein Script z.B. ein C:\Programme\Apache\htdocs\test\ liegt, und index.php heisst, enthält PHP_SELF den Pfad relativ zum Server-Root, also /test/index.php. Wenn du das Script jetzt umziehst, auf einen anderen Server, oder einfach nur in einen Unterordner verschiebst, müsstest du in allen Script rumwurschteln. Mit PHP_SELF hat's sich ausgewurschtelt.


----------



## Jörg Rißmann (4. August 2005)

Mit [phpf]phpinfo[/phpf] kannst du die gesamten Vordefinierten Variablen überprüfen.
_SERVER['PHP_SELF'] müsste z.B. im untersten Block stehen.


----------



## Miraculixx (4. August 2005)

OK, soweit ist alles klar. Aber wenn ich eine index.php habe, und in der form immer nur auf die index.php verweise, dann ist es doch einfacher, nur index.php rein zu schreiben. Da ist ja dann ein Umzug des Servers/Ändern des Verzeichnisses egal.

Und wenn ich auf andere Dateien verweise, die alle im selben Ordner liegen, dann ist das doch auch egal!? Oder verstehe ich hier etwas falsch?


----------



## Jörg Rißmann (4. August 2005)

Miraculixx hat gesagt.:
			
		

> OK, soweit ist alles klar. Aber wenn ich eine index.php habe, und in der form immer nur auf die index.php verweise, dann ist es doch einfacher, nur index.php rein zu schreiben. Da ist ja dann ein Umzug des Servers/Ändern des Verzeichnisses egal.
> 
> Und wenn ich auf andere Dateien verweise, die alle im selben Ordner liegen, dann ist das doch auch egal!? Oder verstehe ich hier etwas falsch?


Jein, Wenn du im <form>-Tag auf eine andere Datei verweist, hat ja PHP_SELF, also dieselbe aufrufende Datei, da eh nix verloren.

Wenn du bei sich selbstaufrufenden/verweisenden Dateien immer mit _SERVER['PHP_SELF'] arbeitest, kommst du nie in das "Vergnügen" mal alles nachträglich ändern zu müssen.

Ich empfehle bei selbstaufrufenden/verweisenden Datein wärmstens die _SERVER['PHP_SELF']-Variante.


----------



## Miraculixx (4. August 2005)

Ahja stimmt, das hatte ich verwechselt, mit Aufrufen von anderen Dateien hat es nichts zu tun.

Aber warum man PHP_SELF verwendet verstehe ich trotzdem noch nicht... vlt. bin ich einfach zu blöd dazu  
Wenn ich in meiner seite index.php einfach nur auf index.php verweise, dann wird immer wieder diese Seite aufgerufen. wenn ich PHP_SELF verwende, dann passiert dasselbe. 
Aber da ist es doch in beiden Fällen egal, wo diese Seite liegt oder ob ich den Pfad der Seite ändere. Also wo hab ich da den Knoten in meinem Hirn?


----------



## Jörg Rißmann (4. August 2005)

*Knotenlöse*

Pfad ist nicht egal, denk mal daran, daß das Formular auch included werden kann.
Dateiname, diese Gründe wurden mehrfach benannt.


----------



## Jörg Rißmann (4. August 2005)

Es gibt an die 10 Gründe, PHP_SELF zu verwenden und nur einen, den fixen Namen reinzuschreiben.
Und selbst da funktioniert PHP_SELF.

Machs doch einfach aus Gruppenzwang


----------



## Miraculixx (4. August 2005)

Na gut, ich werde es wegen dem Gruppenzwang verwenden 
Aber verstanden habe ich es trotzdem noch nicht. Du meinst, wenn ich meine index.php wo anders einbinden möchte? Das hat doch dann auch nix mehr mit PHP_SELF zu tun, da muss ich ja dann sowieso den Pfad zu dieser index.php eintragen, und diesen Eintrag ändern, wenn sich bei den Pfaden etwas ändert.


----------



## Jörg Rißmann (4. August 2005)

Falsch.

<form> steht in der /vote/vote.php
Verarbeitung ist ebenfalls dort.

Included wirds sie aber von der /index.php

In deinem Fall kommt man nach dem Submit-Klick auf die vote.php, die es im Root gar nicht gibt.
Gibt man den Pfad mit an, also action="vote/vote.php", kommt man zwar auf die Datei an, aber da wollte man ja nicht hin, jetzt ist der Seitenaufbau weg.

Die Lösung lautet _SERVER['PHP_SELF']


----------



## heddesheimer (4. August 2005)

Vielleicht hilft ja ein anderer Ansatz:

also ich schreibe ein Skript (z.B. mit Formular) das ich heute als index.php abspeichere. Morgen will ein Kunde von mir ein ganz ähnliches Formular haben, so dass ich meines fix auf seine Wünsche anpasse.

Leider findet der Kunde den Dateinamen nicht gut und speichert das Skript unter "formular.php" auf seinen Webserver. Jetzt bekomme ich dauernd nervige Anrufe, dass mein Skript nicht ordentlich funktioniert :-(

Seitdem verwende ich immer $_SERVER['PHP_SELF'] für meine Skripte und niemand ruft mehr an ;-)

Gruß Marian


----------



## Jörg Rißmann (4. August 2005)

Ok, jetzt haben wir Beispiele für Pfad und Beispiele für Namen.

_Ob ihr wirklich richtig steht,..._


----------



## Miraculixx (4. August 2005)

AAAAAAAAAHHHH 
*BLITZ*
Ich habs kapiert!   

Also es geht darum: ich hab die index.php, mach ein include "page.php".
In page.php steht ein form action, das logsichweise wieder auf index.php verweist. Nur index.php und page.php müssen nicht im selben Verzeichnis liegen, und wenn man dann eine Datei verschiebt, wird die andere nicht mehr gefunden! Richtig?

Aber ein Problem gibts bei der Sache ja trotzdem, wenn sich der Pfad einer Datei verschiebt: ich muss das include trotzdem händisch ändern.


----------



## Jörg Rißmann (4. August 2005)

Miraculixx hat gesagt.:
			
		

> AAAAAAAAAHHHH
> *BLITZ*
> Ich habs kapiert!


Gut, dafür sind wir ja da. 



			
				Miraculixx hat gesagt.:
			
		

> Also es geht darum: ich hab die index.php, mach ein include "page.php".
> In page.php steht ein form action, das logsichweise wieder auf index.php verweist. Nur index.php und page.php müssen nicht im selben Verzeichnis liegen, und wenn man dann eine Datei verschiebt, wird die andere nicht mehr gefunden! Richtig?


Nach dreimaligen Lesens dieses Satzes geb ich dir mal pauschal Recht 



			
				Miraculixx hat gesagt.:
			
		

> Aber ein Problem gibts bei der Sache ja trotzdem, wenn sich der Pfad einer Datei verschiebt: ich muss das include trotzdem händisch ändern.


Ja, den Includepfad. Aber nicht mehr den <form>-Tag, wenn in diesem PHP_SELF steht.


----------



## Miraculixx (4. August 2005)

OK, alles klar, vielen Dank.

Und soll man das auch bei einem link wie zum beispiel 
http://cnweb/lf/admin/index.php?view=1
verwenden? Also mit der GET-variable hinten? Dass dann da stehen würde:

```
echo "<a href=".$PHP_SELF."?view=1>link</a>";
```


----------



## Jörg Rißmann (4. August 2005)

Also wenn du von der index.php auf sich selber verlinkst und nur was mitübergibst hätte ich das so gemacht:

```
echo('<a href="?view=1">link</a>');
```
Um jetzt für völlige Verwirrung zu stiften


----------



## Miraculixx (4. August 2005)

....
Aha
Also der nimmt dann automatisch wieder dieselbe seite?


----------



## Jörg Rißmann (4. August 2005)

Ganz simpler Effekt. Getreu nach dem Motto: "Ich weiss nicht wohin, also bleib ich da!"


----------



## Dr Dau (4. August 2005)

Hallo!

Ausserdem solltest Du lieber mit Superglobalen arbeiten, also z.b. $_SERVER['PHP_SELF'] anstatt $PHP_SELF.
Andernfalls wirst Du ein Problem bekommen wenn dein Hoster register_globals auf off stellt.
Standardmässig ist es schon seit PHP 4.2.0 auf off eingestellt, jedoch wird es häufig auf on gestellt, damit veraltete Scripte der Kunden weiterhin laufen.

[edit]
Und hier findest Du die verschiedenen Superglobalen.
[/edit]

Gruss Dr Dau


----------



## Miraculixx (4. August 2005)

Ja danke, da es bei mir mit nur PHP_SELF nicht funktionierte, hab ich das schon ersetzt. Das ist nämlich auch in all den Tutorials gestanden, nur eben nicht wofür PHP_SELF benötigt wird.
Aber jetzt weiß ich alles, was ich vorerst wissen möchte.
Vielen Dank noch mal an alle, die durchgehalten haben und nicht das Handtuch geworfen haben bei dem Versuch, mir das ganze zu erklären


----------



## Dr Dau (4. August 2005)

PHP_SELF ist ja nur eine von vielen vordefinierten Variablen (siehe Link).
Ich wollte dich damit nur darauf hinweisen dass Du dir lieber gleich angewöhnen solltest mit Superglobalen zu arbeiten..... dass erspart dir ein haufen Ärger.


----------



## Miraculixx (4. August 2005)

Naja ich werde in nächster Zeit dann sowieso wieder eher weniger PHP programmieren. Das war ja nur ein einmaliges Projekt, was ich hier gemacht habe (für die Firma, bei der ich Ferialjob mache). In zwei Wochen komme ich dann wieder, da werdet ihr mich dann im Servlet-Forum etwas öfter sehen 
Aber trotzdem vielen Dank, allgemein für eure Tipps. In vier Wochen bin ich jetzt fast zum PHP-Profi mutiert *aufdieschulterklopf*


----------



## Jörg Rißmann (4. August 2005)

Johannes Röttger hat gesagt.:
			
		

> PHP_SELF ist ein Key der Superglobalen _SERVER. Der Inhalt von _SERVER['PHP_SELF'] ist der absolute Pfad zum Script plus der Dateiname. Wo der Sinn liegt? Naja, z.B. kannst du so das Ziel für ein Formular etc. schön dynamisch festlegen:
> 
> ```
> <form action="<?php print($_SERVER['PHP_SELF']); ?>" method="post">
> ```


---


			
				Jörg Rißmann hat gesagt.:
			
		

> Mit [phpf]phpinfo[/phpf] kannst du die gesamten Vordefinierten Variablen überprüfen.
> _SERVER['PHP_SELF'] müsste z.B. im untersten Block stehen.


---
Jetzt muß ich doch nochmal erwähnen, das der Hinweis eigentlich schon längst erfolgte...


----------

