php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.04.2007, 20:45  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard Verhalten von PHP_SELF auf Win/Linux

Kurze Situationsbeschreibung:

Ich benutze mod_rewrite, um Anfragen direkt an eine Bootstrap-Datei umzuleiten.
Code:
RewriteEngine On
RewriteRule .* index.php
Dann versuche ich mittels PHP_SELF den aktuellen Pfad rauszuziehn.
PHP-Code:
$dir dirname ($_SERVER['PHP_SELF']); 
Unter Windows lief es problemlos, unter Linux plötzlich aber net mehr. Der Aufruf http://domain.tld/path/to/app/index/index lieferte mir unter Windows das erwünschte /path/to/app, aber unter Linux abweichend /path/to/app/index.

Das is ja nu alles halb so wild, wobei ich ja ne grobe Ahnung habe, woran das liegt (Dateisystem-Unterschiede -.-), is aber auch eher egal. Wichtiger find ich, ob ich das Verhalten irgendwie kontrollieren kann, so das bei beiden System wirklich das gleiche rauskommt. Hab jetzt nen etwas umständliches Workaround
PHP-Code:
$dir dirname(str_ireplace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME'])); 
gebastelt,
was zwar seinen Dienst tut, ich bin mir aber unsicher, wie robust dies ist.

Ich nehm auch gerne völlig andere Vorschläge entgegen Inwiefern ist es eigentlich begründet, dass die beiden System mit der Funktion inkonsistent umgehen? Im deutschen Manual dazu jetzt nichts gefunden, werd mal das englische konsultieren.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.04.2007, 20:52  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KingCrunch,

gehe ich richtig in der Annahme, dass du damit "schöne" URLs realisieren möchtest? Falls ja, kannst du alles das, was hinter der Domain an der URL "klebt" per

PHP-Code:
<?php
   $_SERVER
['REQUEST_URI'];
?>
auslesen. Möchtest du nur den Pfad haben (bei dir war das /path/to/app/index/index), so kannst du das per

PHP-Code:
<?php
   
echo '<pre>'.print_r(parse_url($SERVER['REQUEST_URI'],true).'</pre>';

?>
ausgeben lassen. Der Rest ist dann nur noch Kosmetik.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 28.04.2007, 20:55  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Hmm ... Sieht auf jeden Fall robuster aus. Wald und Bäume sag ich da ma

So aus Interesse: Wie robust issn (/schätz ihr) meine bisherige Variante? Und wieso macht PHP_SELF bzw dirname (bzw Beides in Kombination) nicht das, was es soll?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 28.04.2007, 21:07  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ja ein paar Unterschiede gibt es tatsächlich, aber wenn du dir die verwendeten System-Variablen anschaust, wirst du das sicher selbst lösen, einfache String-Verarbeitung :P
Zergling-new ist offline  
Alt 28.04.2007, 21:21  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Hmm ... Naja, wenn mir dir Linux-Implementation da aber /path/to/app/index zurück gibt, dann ist es formal ja nen korrekter Pfad. Wüsste so aussm Bauch raus net, wie ich da banal mit String-Geschichten eindeutig finden kann, dass es sich wirklich um den Pfad zur index.php handelt. Bzw mein Ansatz ist ja genau der Gedanke: Ich nehme einfach pauschal den kanonischen Pfad zur index.php und entferne den Teil, der zum Doc-Root führt...

Wieso beschleicht mich bloss das Gefühl, dass PHP_SELF dafür zu uneindeutig, wenn man System-Weichen vermeiden will? -.-
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 28.04.2007, 21:24  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KingCrunch,

wenn der Pfad wirklich der System-Pfad zur index.php ist, kannst du dir die RewriteRule fast sparen...

Für mich ist jedoch immer noch nicht ganz klar, was du bezwecken willst? Ist das einfach nur den URL-Pfad auslesen oder das aktuelle Arbeitsverzeichnis einer index.php? Ersteres habe ich bereits beschrieben, für letzteres gibt es die Funktion getcwd().
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 28.04.2007, 22:01  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Hmm ... getcwd sieht ähnlich aus meiner Variante mit SCRIPT_FILENAME, bloss dass da scho der Dateiname selbst fehlt ^^ Also auch denkbar. Die erste Variante is ja genau das Problem ^^ Muss da ja das Ende (zB "/index/login" oder was auch immer) los werden ^^

Die RewriteRule is für die MVC-Implementierung vom Framework, welches ich verwende (http://domain.tld/%controller%/%action%). Es ist zwar auch möglich dies weiterhin über GET-Parameter zu lösen, find ich selbst aber doof ^^ Und bitte keine weitere Diskussion übers MVC-Pattern (zumindest nicht hier, das kommt noch früh genug wieder ).
Naja, zumindest brauch ich den Pfad ausgehend vom Doc-Root zur index.php, damit der Front-Controller öhm ... damit irgendwas machen kann ^^ Zumindest funktionierts net, wenn der Pfad falsch is Details sind ja erstmal wurscht.

Seh auch grad...: Angeblich kann es das Framework seit 2 Versionen (oder mehr?) auch selbst ermitteln ^^ Werd das mal testen

Aber ausgehend zur Ursprungsfrage: Es gibt keine Möglichkeit das Verhalten von PHP_SELF irgendwie so zu kontrollieren, dass es sich gleich (auf welche der Varianten auch immer) verhält?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 28.04.2007, 23:12  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KingCrunch,

Zitat:
Aber ausgehend zur Ursprungsfrage: Es gibt keine Möglichkeit das Verhalten von PHP_SELF irgendwie so zu kontrollieren, dass es sich gleich (auf welche der Varianten auch immer) verhält?
Einzige Möglichkeit, die ich sehe, ist, den C-Code von PHP zu reviewen. Ich hatte mit diesem Angaben aber noch keine Probleme. Vielleicht ist der Haken auch wo anders zu suchen...

[quote]Die erste Variante is ja genau das Problem ^^ Muss da ja das Ende (zB "/index/login" oder was auch immer) los werden ^^ [/qoute]
Dann hat dir aber Zergling bereits die Lösung präsentiert: str_replace(),

Irgendwie stehe ich entweder mächtig auf dem Schlauch, oder du beschreibst dein Problem nicht wirklich gut...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 28.04.2007, 23:23  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von dr.e
Irgendwie stehe ich entweder mächtig auf dem Schlauch, oder du beschreibst dein Problem nicht wirklich gut...
Möglich ist beides. Wir haben scheinbar eh ein kleines Kommunikations-Problem

Also ganz banal: Will einfach nur eine möglichst robuste und einfach Variante, um ausgehend vom Doc-Root den Pfad zur index.php ohne index.php selbst unabhängig von der Request-Uri. In dem Sinne gibt es ja schon Lösungen, aber das "robust" macht mir Kopfzerbrechen. Ich will ja net, dass ich es auf einen dritten Server kopiere und da wieder die Server-Variable ihr Ding macht und mir alles versaut

Zitat:
Zitat von dr.e
Dann hat dir aber Zergling bereits die Lösung präsentiert: str_replace(),
Hat er zwar nicht ausdrücklich, aber eine ähnliche Lösung hab ich ja scho selbst gepostet. Mochte bloss net glauben, dass das der Weisheit letzter Schluss sein mag -.-

PHP-Code:
$dir dirname(str_ireplace($_SERVER['DOCUMENT_ROOT'], ''$_SERVER['SCRIPT_FILENAME'])); 
Vllt noch optimierbar Aber haltet ihr das Konstrukt für sinnvoll, oder steh ich direkt vor ner Wand?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 29.04.2007, 10:15  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KingCrunch,

ok. Ich rezitiere: Du möchtest den Pfad zur index.php ausgehend vom DocumentRoot ohne den Dateinamen selbst und unabhängig der URL generieren. Das geht IMHO - und falls ich nicht wieder falsch liege - so:

PHP-Code:
<?php
   
echo '
CWD: '
.$cwd dirname($_SERVER['SCRIPT_FILENAME']);
   echo 
'
DOCROOT:'
.$docroot $_SERVER['DOCUMENT_ROOT'];
   echo 
'
FILENAME:'
.$filename basename($_SERVER['PATH_TRANSLATED']);
   echo 
'
ONLYPATH:'
.$pathonly str_replace($docroot,'',$cwd);
?>
Ich hab die echo's drin gelassen, damit du das sauber testen kannst. Das Ganze ergibt bei mir lokal:

Zitat:
CWD: E:/Apache2/htdocs/www/test.de
DOCROOT:E:/Apache2/htdocs/www
FILENAME:index.php
ONLYPATH:/test.de
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
date-Funktion zeigt Verhalten, das ich nicht verstehe Crypi PHP Tipps 2008 11 09.10.2007 22:58
Komisches Verhalten bei schreiben in/von Datei PsychoEagle PHP Tipps 2008 4 08.10.2007 18:07
Kurioses Verhalten von WhiteSpace "\r\n" LordSword PHP Tipps 2006 2 20.09.2006 14:18
verhalten wie bei include PHP Tipps 2006 2 21.02.2006 19:10
komisches Verhalten bei foreach ?! PHP Tipps 2006 5 21.01.2006 19:36
Merkwürdiges Verhalten von Objekten in einem Array PHP-Fortgeschrittene 6 20.10.2005 00:18
seltsames Verhalten von MYSQL Nixwisser Datenbanken 2 06.09.2005 13:14
[Erledigt] Word über COM-Schnittstelle, Verhalten? PHP-Fortgeschrittene 2 09.08.2005 07:53
Kalemder - Sonderbares verhalten dethlef14 PHP Tipps 2005-2 5 05.08.2005 17:40
Unterschiedliches Verhalten von "=" bei vars,objek PHP Tipps 2005-2 5 17.06.2005 16:35
Div mit position:fixed verhalten wie ohne? TheIfrit HTML, Usability und Barrierefreiheit 2 17.06.2005 07:57
Verhaltung von Include/require unter Win/Linux anders?? PHP-Fortgeschrittene 2 02.03.2005 18:57
Merkwürdiges Verhalten der phpsessions um Mitternacht herum PHP-Fortgeschrittene 17 15.02.2005 14:20
[Erledigt] Verhalten einiger erfahrener Foren-User Off-Topic Diskussionen 20 12.01.2005 15:10
Komisches Verhalten PHP/MySQL Skript PHP Tipps 2004 9 01.07.2004 12:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php_self, php_self windows, php rewriteengine test, $php_self windows, getcwd php_self, str_replace( $_server[\'request_uri\']) front controller, php_self mamp, str_replace mvc php, $_server[\'request_uri\'] \nur den pfad\

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:27 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.