Verzeichnisfragen
Jürgen Seitz
- php
0 XAMPP-Konfiguration...
Felix Riesterer1 rob0 Jürgen Seitz0 rob0 Jürgen Seitz0 Jürgen Seitz0 rob
0 rob
Hallo Leute,
zwei Probleme.
Wenn ich mit XAMPP und mkdir("/html", 0777); ein Verzeichnis von D:\xampp\htdocs\homepage aus anlege findet sich das nicht wie ich das erwartet hätte unter D:\xampp\htdocs\homepage\html sondern unter D:\html. Ich dachte mkdir arbeitet relativ zum aktuellen Verzeichnis von wo aus es ausgerufen wird.
Zweites Problem ist wenn ich eine Konstante definiere für einen File-Upload und das Verzeichnis wechseln will, funktioniert das nicht richtig.
define(USER_UPLOAD, "/html/user_upload/");
chdir(USER_UPLOAD);
Es kommt eine Fehlermeldung. Der Pfad wird zu file:///D:/html/user_upload/ statt wie es sein soll /html/user_upload/.
Auch das
define("USER_UPLOAD", "/html/user_upload/");
chdir(USER_UPLOAD);
bringt nichts. Es funktioniert erst wenn ich die Konstante anders nenne.
define(USER_UPLOA, "/html/user_upload/");
chdir(USER_UPLOA);
Damit gehts dann. Ist USER_UPLOAD eine vordefinierte Konstante? Warum nimmt PHP dann aber den Teil der Definition und fügt ihn an file:///D: hinten dran?
Lieber Jürgen,
möchtest Du uns nicht etwas über die Konfiguration sowohl Deines Apachen, als auch Deiner PHP-Version verraten?
Ohne Kenntnis dieser beiden überaus wichtigen Quellen ist eine Beantwortung Deiner Fragen fast unmöglich. Und wenn Du diese Dateien gerade heraussuchst, vielleicht findest Du ja schon selbst relevante Abschnitte, die zu dem von Dir beobachteten Verhalten führen...
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hi!
findet sich das nicht wie ich das erwartet hätte unter D:\xampp\htdocs\homepage\html sondern unter D:\html. Ich dachte mkdir arbeitet relativ zum aktuellen Verzeichnis von wo aus es ausgerufen wird.
mkdir arbeitet aus dem Verzeichnis heraus aus dem es aufgerufen wird.
Außerdem ist /html keine relative Angabe.
../html oder ./html wäre eine relative Angabe.
Dein zweites Problem ist genau das Gleiche.
/html bedeutet, daß von Wurzelverzeichnis / ausgegangen wird.
Das ist eine absolute Pfadangabe.
Wenn du stattdessen aber ./html schreibst, dann bedeutet das, daß vom aktuellen Verzeichnis ausgegangen werden soll.
Oder wenn du ../html schreibst, dann würdest du damit das übergeordnete Verzeichnis ansprechen.
Das wären dann relative Angaben.
Schöner Gruß,
rob
Hallo.
Hi!
findet sich das nicht wie ich das erwartet hätte unter D:\xampp\htdocs\homepage\html sondern unter D:\html. Ich dachte mkdir arbeitet relativ zum aktuellen Verzeichnis von wo aus es ausgerufen wird.
mkdir arbeitet aus dem Verzeichnis heraus aus dem es aufgerufen wird.
Außerdem ist /html keine relative Angabe.
../html oder ./html wäre eine relative Angabe.
mkdir funktioniert jetzt mit ./html. Danke.
Dein zweites Problem ist genau das Gleiche.
Leider nicht.
define(USER_UPLOAD, "./html/user_upload/");
echo USER_UPLOAD;
ergibt wieder file:///D:/html/user_upload/
define(USER_UPLOA, "./html/user_upload/");
echo USER_UPLOA;
ergibt wie es sein soll ./html/user_upload/
Hi!
define(USER_UPLOAD, "./html/user_upload/");
echo USER_UPLOAD;ergibt wieder file:///D:/html/user_upload/
Das kann überhaupt nicht sein. Jedenfalls nicht, wenn der hier gepostete Code auch wirklich der ist, der in deinem Script verwendet wird.
Du definierst hier eine Konstante.
Diese enthält keinen Verweis, kein Handle auf ein Verzeichnis, sondern lediglich einen String mit deinem Verzeichnisnamen.
echo USER_UPLOAD;
muß in diesem Fall "./html/user_upload/" ausgeben.
Schöner Gruß,
rob
Hallo!
Hi!
define(USER_UPLOAD, "./html/user_upload/");
echo USER_UPLOAD;ergibt wieder file:///D:/html/user_upload/
Das kann überhaupt nicht sein.
Sicher ist das so sonst würde ich es nicht schreiben. Weil ich mir das überhaupt nicht erklären kann, frage ich.
define(USERUPLOAD, "./html/user_upload/");
echo USERUPLOAD;
würde ./html/user_upload/ ergeben. define(USER_UPLOAD, "./html/user_upload/"); aber nicht. Das Verhalten finde ich auch sehr seltsam.
Alles klar. Es lag an mir. In einem eingebunden Skript habe ich
define(USER_UPLOAD, "file:///D:/html/user_upload/");
gesetzt. Ich weiß nicht mehr warum, ich glaube wegen dem Problem mit chdir. Das sollte nur vorübergehend sein. Ich wollte das später wieder ändern, wenn das Problem mit chdir gelöst ist. hab ich komplett vergessen. Dann ist da natürlich gar nichts Seltsames mehr. Die Konstante war schon definiert. Somit war die zweite Definition ergebnislos. Und ich dachte schon PHP spinnt rum.
Ich glaube damit ist jetzt alles gelöst. Der Hinweis zu den falsch gesetzten Pfaden war absolut hilfreich. Den Rest kriege ich jetzt auch noch hin.
Noch mal Danke!
Schönen Gruß
Jürgen
Hi!
Alles klar. Es lag an mir. In einem eingebunden Skript habe ich
define(USER_UPLOAD, "file:///D:/html/user_upload/");
gesetzt.
Und du hast keine Meldung von PHP bekommen?
Konstanten können zur Laufzeit eines Scriptes nicht mehr geändert werden.
Eigentlich müßte PHP dir in diesem Fall dann ein Notice ausgeben.
Das ist eine Einstellung des error_reporting.
Auf dem Webserver, auf dem das Script im Endeffekt mal laufen soll, wird das error_reporting sicherlich nicht allzu streng eingestellt sein.
Auf deinem Testserver solltest du das error_reporting hingegen so einstellen, daß dir alle Error, Warnings und Notices angezeigt werden.
Wenn du einen Fehler in deinem Code hast, weil du beispielsweise auf eine Konstante zugreifst, die noch gar nicht definiert wurde oder weil du einer bereits definierten Konstante einen neuen Wert zuweisen willst, dann sollte dies gemeldet werden.
Dazu könntest du die entsprechende Einstellung direkt in deiner php.ini ändern oder du nutzt die Funktion error_reporting().
Ein error_reporting( E_ALL );
zu Beginn deines Scriptes hätte dir ein Notice gebracht, daß in etwa so ausgesehen hätte:
Notice: Constant USER_UPLOAD already defined in blabla.php on line bla
Damit hättest du deinen Fehler dann sofort entdeckt.
Ich kann dir nur dazu raten, daß du die Fehlerberichterstattung für Testzwecke auf die höchste Stufe stellst.
Schöner Gruß,
rob
Hallo.
Das steht in der php.ini
error_reporting = E_ALL & ~E_NOTICE
Dann muß ich wohl das & ~E_NOTICE löschen?
Schönen Gruß
Jürgen
Hi!
Dann muß ich wohl das & ~E_NOTICE löschen?
Ja, dann hättest du in deinem Fall eine Meldung erhalten.
Oftmals will man die Einstellung in der php.ini allerdings gar nicht ändern.
Professionelle Webhoster haben PHP meist so konfiguriert, daß nur Errors, aber keine Warnings und Notices gezeigt werden.
Das kann mitunter nämlich auch zu Problemen führen und einige Scripte versagen dann eventuell den Dienst, wenn so eine Meldung ausgegeben wird.
Beispiel:
So sollte es aussehen:
if ( isset( $_POST['eingabe'] ) ) {
header( 'Location: http://example.com/seite.php' );
exit;
}
Wenn es aber so aussieht:
if ( isset( $_POST[eingabe] ) ) {
header( 'Location: http://example.com/seite.php' );
exit;
}
Dann würde ein Notice ausgegeben werden, daß versucht wird, auf die undefinierte Konstante "eingabe" zuzugreifen. Da es die aber nicht gibt, vermutet PHP dann, daß $_POST['eingabe'] statt $_POST[eingabe] gemeint war.
Kein Problem eigentlich.
Aber wenn ein Notice ausgegeben wird, dann wurden damit auch schon HTTP-Header verschickt und die folgende Weiterleitung kann nicht mehr funktionieren...
Stellt ein Hoster das error_reporting zu streng ein, dann kann er davon ausgehen, daß er eine ganze Menge an Mails von irgendwelchen Dummie-Usern bekommen wird, die sich darüber beschweren, daß bei ihren eigenen (oder runtergeladenen und installierten) Scripten immer irgendwelche "komischen Meldungen" kommen.
Auch viele bekannte Boards, Content Management Systeme, Gästebücher, ..., die man kostenlos runterladen kann, sind so geschrieben, daß es zu Notices/Warnings kommen würde.
Naja, wie auch immer:
Wenn du die Einstellung in deiner php.ini nicht ändern möchtest, dann kannst du auch zu Beginn deines Scriptes die Funktion error_reporting( E_ALL );
aufrufen.
Das hat dann den gleichen Effekt.
Schöner Gruß,
rob
echo $begrüßung;
Wenn du die Einstellung in deiner php.ini nicht ändern möchtest, dann kannst du auch zu Beginn deines Scriptes die Funktion
error_reporting( E_ALL );
aufrufen.
Das ist eine recht einfache Möglichkeit, wenn auch keine ganz besonders hübsche. Denn man darf nicht vergessen, die Zeile vor dem Hochladen auf den Produktiv-Server zu entfernen und vor dem Weiterentwickeln wieder einzufügen. Auch ein bedingtes Ausführen, das sich am Servernamen orientiert, ist nur eine Umgehung des "Problems".
Betreibt man auf dem Testsystem PHP als Apache-Modul, kann man die Einstellungen in der Per-Verzeichnis-Konfigurationsdatei des Apachen (oft .htaccess genannt) vornehmen. Beachten sollte man aber, dass man hier nur einen Zahlenwert eintragen kann, Konstanten wie E_ALL stehen hier nicht zur Verfügung. Siehe dazu http://de.php.net/manual/en/ref.errorfunc.php#errorfunc.constants
echo "$verabschiedung $name";
Hi!
Sicher ist das so sonst würde ich es nicht schreiben.
Es ist schlichtweg unmöglich.
Weil ich mir das überhaupt nicht erklären kann, frage ich.
Dann mußt du irgendeinem Fehler in deinem Code haben.
Wenn du eine Konstante definierst, deren Inhalt ein String ist, dann kommt PHP nicht so einfach auf Idee, diesen String mal so zum Spaß zu verändern.
Poste doch mal den Code deines Scriptes.
BTW: Was mir gerade noch auffällt:
define(USERUPLOAD, "./html/user_upload/");
Das ist falsch. Es müßte eigentlich heissen:
define( "USERUPLOAD", "./html/user_upload/" );
Schöner Gruß,
rob