problem mit schreibrechten
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
code
datei
datensatz
fehler
file
funktion
instanz
mache
not
problem
punkt
schleife
server
stehen
system
test
verzeichnis
zeile
ziel
-
so, ich hab nen kleines problem mit schreibrechten, mobbelkotze, is aber so.
unzwar folgendes:
public function __destruct() { if ($this->change) { foreach ($this->configuration as $key => $value) { $c = implode(':', array($key, $value)); $r .= $c.'\n'; } echo "./include/includes/".$this->filename; if (is_writable("./include/includes/".$this->filename)) {echo 'test';} file_put_contents("./include/includes/".$this->filename, $r); } }
das ist der destructor meiner konfigurationsklasse. ich lade eine configuration namens configration.cfg . die ist simpel aufgebaut, unzwar immer mit :
einstellung:wert einstellung:wert einstellung:wert
der destructor soll jetzt eben prüfen ob eine veränderung dran vorgenommen wurde und es dann schreiben. dazu holt er aus dem configurationsarray (indem ich das file in ein array geschrieben habe) die werte, verbindet sie wieder mit dem doppelpunkt, sammelt alles in einem langen string (den zeilenumbruch mit \n zu erzeugen geht doch, oder?) und schreibt es letztendlich per file_put_contents in das file.
das echo und if sind teststrukturen um fehler zu finden.
echo gibt richtig aus: ./include/includes/configuration.cfg
würde es das nicht machen könnt ich schlecht die datei einlesen und mir die config werte ausgeben lassen, nech (das geht alles)
die if-schleife gibt nichts aus, was mir zu denken gibt, dass die datei nicht beschreibbar ist. tatsächlich kann er nichts in die datei rein schreiben, sie bleibt immer gleich (darum hab ichs ja erst getestet). ich hab die lese und schreibe rechte eingesehen und die datei ist für den "owner" lesbar und schreibbar, für "group" und "public" nur lesbar (noch ne kleine frage dazu: stell ich das "public", da das lesbar aus, kann dann von außen keiner mehr die datei einsehen? also auch per direkt auswahl nich? auch ne txt zb?)
das owner geh ich davon aus (so wars bisher immer) dass das der server ist, also ich mit meinem PHP Script.
nun die finale frage: was genau ist hier falsch? warum kann ich die datei nicht beschrieben, oder ändern? schreibrechte hat sie (angeblich) vom server, nur is_writable hats nich. und den inhalt ändern kann ich auch nicht mit file_put_contents().
weiß da jemand rat? (und vllt auch antworten auf die im text versteckten fragen?)
ich wäre echt dankbar =)
PS: nein, die configuration wird nicht in eine MySQL tabelle geschrieben, weil eben das das ziel ist: ich will die konfiguration auserhalb einer festen tabelle lassen, um variable tabellenformate (mysql, mysqli, postgre, etc) zu ermöglichen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Geb der Datei mal chmod 0666. Und sag dann mal, ob es geht.
Weiterhin, die Schleife würde ich dahingehend ändern:
foreach ($this->configuration as $key => $value) { $r .= $key.':'.$value."\n"; }
Das implode() ist hier recht sinnlos. Das \n kannst du nur innerhalb von " nutzen, nicht bei '. Weiterhin ist $r nicht initialisiert. (Sollte dir eigentlich eine E_NOTICE werfen :)
Übrigens: Ich glaube du brauchst eben genau die public Schreibrechte, die dann in 666 drinne sind. Aber da bin ich mir nicht so sicher, warum man 666 gibt ;)
Beitrag zuletzt geändert: 14.6.2010 15:33:51 von nikic -
E_NOTICE -.- tut mir leid, ich hab mich die letzten wochen sehr stark aufs abi konzentriert, da hab ich irgendwie keine übung mehr. das implode ist vollkommen zuviel, da hast du recht^^, das mit \n hab ich noch nicht gehört, ist aber logisch. danke, ich werds mir merken =)
des E_NOTICE hab ich mal eingeschaltet, also E_ALL
ich geb mal die fehler (gleich alle, ich will lernen und wissen wie ichs besser machen kann)
in den zeilen
trim($config[1]); $this->configuration[$config[0]] = $config[1];
da sagt er zu
Notice: Undefined offset: 1 in /home/webpages/lima-city/ggamee/html/test/include/includes/class/config.class.php on line 34
Notice: Undefined offset: 1 in /home/webpages/lima-city/ggamee/html/test/include/includes/class/config.class.php on line 35
was auch immer das genau heißt.
das genauere schreiproblem oder leseproblem hab ich da auch stehen:
Warning: is_writable() [function.is-writable]: open_basedir restriction in effect. File(./include/includes/configuration.cfg) is not within the allowed path(s): (/tmp:/var/tmp:/home/webpages/include/:/home/webpages/tmp:/usr/lib/php:/home/webpages/lima-city/ggamee/html) in /home/webpages/lima-city/ggamee/html/test/include/includes/class/config.class.php on line 55
Warning: file_put_contents() [function.file-put-contents]: open_basedir restriction in effect. File(./include/includes/configuration.cfg) is not within the allowed path(s): (/tmp:/var/tmp:/home/webpages/include/:/home/webpages/tmp:/usr/lib/php:/home/webpages/lima-city/ggamee/html) in /home/webpages/lima-city/ggamee/html/test/include/includes/class/config.class.php on line 57
Warning: file_put_contents(./include/includes/configuration.cfg) [function.file-put-contents]: failed to open stream: Operation not permitted in /home/webpages/lima-city/ggamee/html/test/include/includes/class/config.class.php on line 57
das sind die zeilen die ganz oben stehen. aber das verstehe ich nicht, ich habe nen relativen pfad angegeben, des ist doch normalerweise funktionabel oder nich? auslesen kann er mit GENAU DEM GLEICHEN pointer auch.
jetzt bin ich total verwirrt. man is das doof =( naja, an herausforderungen wächst man =)
Beitrag zuletzt geändert: 15.6.2010 14:21:19 von ggamee -
$config[1]
Das Drumrum wäre interessanter.
Zum safe_mode Problem...
("/home/webpages/lima-city/ggamee/html/test/include/includes/".$this->filename)
-
ah, ok. kann man vllt kurz erläutern was dieses "safe_mode" problem ist? ich hab den gegoogled und erhalte 2000 und 3 mal "ist veraltet, wird entfernt". ich mein, ist schön dass er entfernt wird, aber wirklich schlau werd ich daraus auch nicht xD
also für mich nochmal zum verständnis (tut mir leid, aber ich hab anscheinend viel vergessen =( )
der safe_mode bewirkt, dass die schnellzugriffe ./ nurnoch fürs lesen gelten, aber nicht fürs schreiben? stattdessen muss ich vom obersten verzeichnis des servers her den path erklären?
ok, werd ich versuchen zu verallgemeinern und einzubauen. krieg ich bestimmt irgendwie unter. aber der safe_mode ist ja eig veraltet :-S
und die schleife der configs ist folgende:
foreach ($this->config_content as $key => $value) { $config = explode(':',$value); trim($config[0]); trim($config[1]); $this->configuration[$config[0]] = $config[1]; }
bevor gemecker kommt "das trim kannste auch", ja, das habe ich gesehen^^ das ist aber noch die umständliche art. normalerweise heißt es (wird es heißen)
foreach ($this->config_content as $key => $value) { $config = explode(':',$value); $this->configuration[trim($config[0])] = trim($config[1]); }
ich weiß nur nicht genau warum des nen fehler ist :-S die schleife liest aus dem content (welcher datensatz für datensatz in einem array gespeichert ist, also datensatz im value), splitte ich die datensätze nun auf (die form: key:value; - das semikolon entfern ich schon vorher) und dann speicher ich das eben im haupt array ab. aus diesen lässt sich dann der datensatz der configurations datei per schlüssel kinderleicht abrufen.
ja ich mache das extra so, damit ich database-unabhängig bin. es soll eigentlich (wenn ichs hinkriege) die wahl geben zwischen mysql, mysqli und postgre. weitere können per kleinem plugin hinzugefügt werden.
ich bin wirklich ein noob geworden =(
EDIT:
ich fühle mich gerade KRASS verarscht -.-
ich habe versucht mit
define('ROOT_DIR', $_SERVER['DOCUMENT_ROOT']);
in der index datei für alle systeme diesen rootpath abzugleichen, kann ja nie schaden. baue diesen dann in die include paths ein für des file zum auslesen: kann nichmehr ausgelesen werden. (ich hab den filename so gestalltet: ROOT_DIR.$file statt nur $file - file beinhaltet die übergebene datei als path).
son mist, mach des ROOT_DIR wieder weg - punkt fehlt auch, geht nich. is ja kla, der punkt bestimmt die directory. punkt hingemacht - JETZT KANN ER SOGAR SCHREIBEN! und das ohne dass ich die ROOT_DIR davor mache. ooooookkkeeeee? verpopot fühl ich mich schon... (im moment habe ich quasi die define ziele mehr, mehr NICHT) (mit dem code den du unten/oben rein gestellt hast fabo war das leider das gleiche - auslesen nicht - schreiben schon. ich wills aber so haben dass es auf allen hostern geht, eigentlich :-S)
ok denk ich, das ist doch super =) ich freu mich, lüpt nu, aber irgendwie fehlen in der anzeige nen paar daten... geschaut:
der führt den destructor nicht aus... (ich hab des auf funktionieren getestet indem ich den destructor mit $config->__destruct(); aufgerufen habe)
der destructor sieht so aus:
public function __destruct() { $r = ''; if ($this->change) { foreach ($this->configuration as $key => $value) { $r .= $key.':'.$value.";\n"; } echo $this->filename.'<br />'; if (is_writable($this->filename)) {echo 'test<br />';} else {echo 'blah<br />';} echo $r; file_put_contents($this->filename, $r); } }
ich fühl mich son bissel verpopot um so mehr. denk ich "dann isses mein fehler, der engine macht das nich automatisch" da steht bei php.net:
Die Destruktormethode wird aufgerufen, sobald alle Referenzen auf ein bestimmtes Objekt entfernt werden oder wenn das Objekt explizit zerstört wird, oder in beliebiger Reihenfolge am Ende des Skripts.
ich check jetzt garnichtsmehr durch =( nachher mal windoof booten und da xampp fragen was mir des sagt =(
Beitrag zuletzt geändert: 18.6.2010 14:24:19 von ggamee -
Wenn safe_mode aktiv ist, sind verschiedene PHP-Funktionen privilegiert oder eingeschränkt. Zumeist gilt die safe_mode Einschränkung, dass auf eine Datei oder ein Verzeichnis nur eingewirkt werden darf, wenn die Datei oder das Verzeichnis denselben Eigentümer hat wie das Script. Im Einzelnen:
Alle Dateifunktionen einschließlich include() und require() können nur noch mit lokalen Dateien arbeiten, die denselben Eigentümer (uid) haben wie der Eigentümer des Scriptes.
Auch ftp-Pfadnamen werden so geprüft.
Auch zlib-Pfadnamen werden so geprüft.
mkdir() und posix_mkfifo() sind nur in Verzeichnissen zugelassen, die die Einschränkung erfüllen.
Das Ziel eines link() und symlink() (Parameter 1 von symlink()) muss die Einschränkung erfüllen.
Die Subjekte der Funktionen unlink(), chgrp(), chown(), chmod(), touch(), rmdir(), rename() und copy() müssen die Einschränkung erfüllen.
Lokalen, absoluten Pfadnamen wird document_root vorangestellt.
In den Funktionen popen(), system() und exec() können nur Kommandos ausgeführt werden, die im safe_mode_exec_dir stehen. Auf die ausgeführten Kommandos wird von den Funktionen popen(), system() und exec() automatisch EscapeShellCmd() angewendet.
Dynamisch ladbare Erweiterungen (dl()-Funktion) stehen in safe_mode nicht zur Verfügung ("Dynamically loaded extensions aren't allowed when running in SAFE MODE.").
Es kann kein neues CPU-Zeitlimit festgelegt werden ("Cannot set time limit in safe mode").
Wird mod_php verwendet, steht in der Funktion getallheaders() der Wert des Headers "Authorization" (Loginname und Passwort) nicht zur Verfuegung.
Die Funktion header() wird dem Header "WWW-authenticate" immer den Eigentümer des Scriptes als Bestandteil des Realms hinzufügen.
Das filepro Map-File "dir/map" (wobei dir der Parameter der filepro()-Funktionen ist) muss die Einschränkung erfüllen. Dies gilt für filepro(), filepro_rowcount() und filepro_retrieve().
Das dbase-Modul verlangt in dbase_open() und dbase_create(), dass die dbf-Datei die Einschränkung erfüllt.
Das DBM-Modul setzt voraus, dass in dbmopen() das Verzeichnis, in dem die DBM-Datenbank angelegt wird, die Einschränkung erfüllt. Dies ist bei den DBA-Funktionen nicht der Fall.
----------
Könntest du bitte mal die gesamte Klasse posten?
-
<?php # written by Steffen Wendt if (!constant('MAIN')) { die('No Access'); } class config { private static $instanz = false; private $config_content = array(); private $configuration = array(); private $change = false; private $filename = ''; static public function init($file) { if(self::$instanz === false) { self::$instanz = new self($file); } return self::$instanz; } private function __construct($file) { $this->filename = "./include/includes/".$file; $this->config_content = explode(';',file_get_contents($this->filename)); $this->convert_config(); } private function convert_config() { foreach ($this->config_content as $key => $value) { $config = explode(':',$value); $this->configuration[trim($config[0])] = trim($config[1]); } } public function get($var) { return ($this->configuration[$var]); } public function set($key, $value) { $this->configuration[$key] = $value; $this->change = true; return true; } public function __destruct() { $r = ''; if ($this->change) { foreach ($this->configuration as $key => $value) { $r .= $key.':'.$value.";\n"; } echo $this->filename.'<br />'; if (is_writable($this->filename)) {echo 'test<br />';} else {echo 'blah<br />';} echo "<br /><br />$r<br /><br />"; file_put_contents($this->filename, $r); } } } ?>
ich hab mir nich die mühe gemacht den destructor mal zu entmüllen, des "is_writable" und "echo $r" ist eig nur für mich um zu sehen was er macht.
ich befürchte dass das singleton pattern nicht mit einem destructor funktioniert, was für mich zwar unlogisch klingt, aber ich mal irgendwo gelesen habe.
Problem gelöst. problem ist das GZippen -.- fragt sich nur wieso. sobald der end_flush kam ist alles vorbei, und keine destructoren mehr oder so.
trotzdem danke =)
dies thema ist eig abgeschlossen, der rest läuft am thema vorbei. ich mache ein passendes thema auf um die ordnung zu behalten wenn was ist =)
danke für die hilfe!!!
Beitrag zuletzt geändert: 19.6.2010 15:21:51 von ggamee -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage