CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden |
01.06.2008, 23:53:51
|
|
Member
|
|
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 36
Beiträge: 586
|
|
Configuration Handling
Abend!
Ich bin gerade dabei eine Klasse zu schreiben, die mit Konfigurations-Dateien arbeiten soll. Kurz gesagt sie soll sie lesen und schreiben. Die Ausgabe funktioniert hervorragend, das Problem liegt also beim Schreiben. Da die Klasse natürlich nicht weiß, welche Felder in der Konfigurations-Datei existieren, muss vor jedem Eintrag geprüft werden, ob das Feld existiert. Ist das der Fall soll das Value für dieses Feld geändert werden. Meine Frage ist jetzt, ob es noch unsicher ist, einen Aufruf der Klasse so zu gestalten, oder ob genug Sicherheit durch die Verarbeitung der Daten inerhalb der Methode setConfig gegeben ist.
Wäre euch echt dankbar, wenn ihr da mal euren Senf zu geben würdet. :-)
MfG, Andy
Der Aufruf
PHP-Code:
<?php // call Config-Class require_once('includes/Config.php'); // set reply to an array $config = $_GET[]; // set new configuration $ih = new Config(); $ih->setConfig($config, 'config/config.ini'); unset($config);
// print out config $config = getConfig('config/config.ini'); print_r($config); ?>
Config.php
PHP-Code:
<pre> <?php error_reporting(E_ALL);
/*** * The Config class allows reading the configuration and editting it * * @package Config * @version 1.0 * @author Andreas Wilhelm <Andreas2209@web.de> * @copyright Andreas Wilhelm **/ class Config { /** * getConfig() - Gets the config-file and stores it in an array * * @access: public * @param Str $path * @return Array */ public function getConfig($path) { // array that contains theconfig $config = array(); // check if file exists and create an absolute path if (file_exists($path)) { $path = realpath($path); } else { throw new Exception('Path not found!'); } // save each line of data to an array-element $lines = file($path); foreach($lines as $line => $value) { // save information to array if( preg_match('/([^:]+)=(.+)/m', $value, $match) ) { $config[$this->getName($match[1])] = trim($match[2]); } } return $config; } /** * getName() - Returns the name of a received field * * @access: private * @param Str $str * @return String */ private function getName($str) { return preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtolower("\0")', strtolower(trim($str))); } /** * setConfig() - Writes the data from config-array into the configurtaion-file * * @access: private * @param Arr $config * @param Str $path * @return String */ private function setConfig($config, $path) { // read configuration file $file = file_get_contents($path); // find the config-field and insert new value foreach( $config as $name => $value) { // clean strings from php- and html-code $name = trim(strip_tags($name)); $value = trim(strip_tags($value)); // search if data set entry exists and assign new value preg_replace("/($name)=(.+)/m", "$name = $value", $file); } // write the new configuration to config-file $fp = fopen($path, 'w'); fwrite($fp, $file); fclose($fp); return true; } } ?> </pre>
config.ini
Code:
# database values
dbhost = your_database_host
db = your_db
dbuser = testuser
dbpwd = testpwd
# meta tags
title = title of your website
author = the author of the website
copyright = copyright by
discription = this is a great website
keywords = website, your, nice
favicon = favicon.ico
# error pages
error400 = Error 400 - Bad request.
error404 = Error 404 - Page could not be found.
error500 = Error 500 - Error occured.
Geändert von Socrates (01.06.2008 um 23:55:01 Uhr)
|
02.06.2008, 12:22:08
|
Senior Member
|
|
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 36
Beiträge: 1.476
|
|
AW: Configuration Handling
Warum sollte das unsicher sein? Ich denke auf das Konfigurationsscript hast nur du Zugriff und sonst niemand! Sprich du steuerst mit deinen Scripts den Zugriff auf diese Config-Klasse... von daher wirst du dir wohl nicht selbst irgendewelche hacks einbauen :P
Das einzige was du noch beachten musst ist, dass eine ini-Datei im Browser als normaler Text angezeigt wird! Diese musst du also noch irgendwie schützen!
Zur Klasse selbst:
Einlesen einer Konfigurationg eht viel einfacher mit parse_ini_file()!!
Die Funktion setConfig ist private.. also wirst du von aussen relativ wenig Zugriff auf diese haben :P
Ich persönlich mache das so, dass ich beim Instanzieren mit parse_ini_file die ganze Konfiguration einlese (sooo gross werden ja wohl diese Config-Dateien nicht sein) und diese in der Klasse zwischenspeichere... über die __get-Funktion kann ich dann auf die einzelnen Konfigurationen Zugreiffen.. und zwar so:
PHP-Code:
//Meine Config-Datei
name1=wert1
name2=wert2
usw.
//Meine Config-Klasse
class Configuration
{
private $config = array();
private $path = '';
public function __construct($path)
{
//Erst hier den Pfad überprüfen...
//..
//Dann die Config einlesen
$this -> path = $path;
$this -> config = parse_ini_file($path);
}
public function __get($name)
{
if(isset($this -> config[$name]))
{
throw new Exception('Dieser Konfigurationseintrag existiert nicht!');
}
return $this -> config[$name];
}
public function __set($name, $value)
{
if(!isset($this -> config[$name]))
{
//Entweder fügst du die Config hier hinzu oder du wirfst ne Exception
}
$this -> config[$name] = $value;
}
public function SaveConfig($path = '')
{
//Optional kann ein anderer Speicherort für die Konfigurationsdatei
//angegeben werden!
//Für diese Funktion gugscht du in den Kommentaren von:
//http://ch2.php.net/parse_ini_file
//Da ist diese schon vorprogrammiert, musst also nichts mehr machen :)
}
}
//Gebrauch der Klasse
$config = new Config();
$parameter1 = $config -> name1;
$parameter2 = $config -> name2;
$config -> name1 = 'neuerWert1';
$config -> name2 = 'neuerWert2';
$config -> SaveConfig();
Öhm jo.. so in etwa habe ich es gelöst, hab das hier aber einfach mal im "Direkt Antworten" geproggt, also ich habs nicht getestet :P
Btw:
PHP-Code:
// set reply to an array
$config = $_GET[];
Was in aller Welt machst du hier? :S
__________________
Opendix lehnt jegliche Haftung für evtl. vorhandene Fehler in der Grammatik sowie der Satzstellung ab! Bitte wenden Sie sich an die Tastatur!
Betatester gesucht:
Skiclub Gams / CEVI Grabs
Geändert von Opendix (02.06.2008 um 12:25:16 Uhr)
|
03.06.2008, 17:10:06
|
|
Member
|
|
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 36
Beiträge: 586
|
|
AW: Configuration Handling
Hallo!
Entschuldige, dass ich jetzt erst antworte, aber leider kam ich nicht früher dazu. Dein Hinweis auf die Funktion parse_ini_file() hat mir sehr geholfen und deine kleine Klasse hat mich auch etwas weiter gebracht. Deine Klasse enthält übrigens noch einen kleinen Fehler in der __get()-Methode. Der Term der if-Abfrage müsste so heißen:
PHP-Code:
if( !isset($this -> config[$name]) ) {}
Die Klasse werde ich allerdings noch etwas dokumentieren und, wie schon erwähnt, mit einer Methode saveConfig() erweitern. Im übrigen werde ich noch eine Methode getConfig() hinzufügen, die das komplette Array mit der Konfiguration zurückgibt. Damit kann ich dann relativ einfach eine Ausgabe mit print_f() in einer foreach()-Schleife erzeugen, die mir das Editieren der Konfiguration erlaubt.
PHP-Code:
// set reply to an array
$config = $_GET[];
Du hast mich gefragt, was ich da mache. Ich habe zuvor wie oben beschrieben die Konfiguration mit Hilfe einer Schleife in einem Formular ausgegeben und dann das ganze abgeschickt. Das heißt, dass die Daten, je nach Methode, nun in einem Array $_POST[] oder $_GET[] liegen. Im nächsten Schritt würde ich dieses "neue" Arrray in einer foreach()-Schleife durchlaufen und seine Elemente überprüfen. Danach kann ich das komplette Array, das die neue Konfiguration enthält, mit Hilfe der saveConfig()-Methode in die config.ini schreiben.
Du hast angesprochen, dass man die *.ini-Dateien noch irgendwie schützen sollte. Wie sollte ich das am besten machen? Über htaccess? Sie einfach *.ini.php zu nennen reicht ja nicht, da es dann trotzdem eine Ausgabe gäbe.
MfG, Andy
|
04.06.2008, 02:29:33
|
Senior Member
|
|
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 36
Beiträge: 1.476
|
|
AW: Configuration Handling
Zitat:
Deine Klasse enthält übrigens noch einen kleinen Fehler in der __get()-Methode. Der Term der if-Abfrage müsste so heißen:
|
Na wens nur dieser eine ist würd ich sagen ists für das "Direkt Antworten"-Feld keine schlechte Ausbeute ;)
Ich würde die INI-Datei einfach eine ebene unter der öffentlichen ebene speichern. Sprich in diesem Bereich der nicht öffenltich zugänglich ist. Ansonsten wohl irgendwie mit htaccess....
__________________
Opendix lehnt jegliche Haftung für evtl. vorhandene Fehler in der Grammatik sowie der Satzstellung ab! Bitte wenden Sie sich an die Tastatur!
Betatester gesucht:
Skiclub Gams / CEVI Grabs
|
04.06.2008, 09:31:47
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 16
Beiträge: 2.269
|
|
AW: Configuration Handling
Alternativ, die erste Zeile der IniDatei:
Code:
; <?php die('das war wohl nix!')?>
|
04.06.2008, 12:13:20
|
|
Member
|
|
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 36
Beiträge: 586
|
|
AW: Configuration Handling
Eigentlich ne super Idee muss ich halt aus der config.ini eine config.ini.php machen, da sonst der Code ja nicht5 geparst wird.
MfG, Andy
|
24.06.2008, 01:02:07
|
|
Member
|
|
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 36
Beiträge: 586
|
|
AW: Configuration Handling
Guten Morgen!
Ich hatte heute mal wieder etwas Zeit an diesem Problem zu arbeiten und ich habe mich gegen die Verwendung von parse_ini_file() aus mehreren Gründen entschieden: - kommentare werden beim schreiben gelöscht
- blanks werden beim schreiben nicht beachtet
- es gibt oftmals probleme mit html-code
Deshalb habe ich jetzt einen ganz anderen Ansatz verfolgt (config.ini sieht aus wie oben). Dabei bin ich zwar auf einige Schwierigkeiten gestoßen, die ich bis auf eine alle beheben konnte. Und zwar habe ich folgenden Aufruf der Klasse, indem geprüft wird, ob Formular-Daten zur Verfügung stehen und wenn dies der Fall ist, diese, wenn möglich, in die config.ini schreiben soll. Soweit so gut, allerdings gibt es dabei ein Fehler. dem Item-Name wird noch ein "_" am Ende hinzugefügt. So wird nicht, wie es eigentlich sein sollte nach dem Key "dbname" sondern nach "dbname_" gesucht. Wie dieser Fehler zustande kommt weiß ich leider nicht.
Aufruf von Config.php
PHP-Code:
$cp = new Configuration('config/config.ini'); // handle request-data if( isset($_REQUEST) ) { $new = $_REQUEST; foreach( $new as $key => $value) { if( ($key != 'reset') && ($key != 'submit') && ($key != 'path') ) { $cp->$key = $value; } } $cp->save(); } // get changed configuration $config = $cp->getConfig();
Config.php
PHP-Code:
<?php error_reporting(E_ALL);
/*** * The Config class allows reading the configuration and editting it * * @package Config * @version 1.0 * @author Andreas Wilhelm <Andreas2209@web.de> * @copyright Andreas Wilhelm **/ class Configuration { private $file; private $config = array();
/** * Cunstructor - Loads configuration from path * * @access public * @param Str $file * @return boolean */ public function __construct($file) { // set path to config-file $this->file = $file; // save configuration to an array $this->parse(); }
/** * __get() - Gets the value of an config-item * * @access: public * @param Str $name * @return String */ public function __get($key) { if( !isset($this->config[$key]) ) { throw new Exception('Cannot get item '.$key.'.'); } return $this->config[$key]; } /** * __set() - Assigns a new value to an entry of the config * * @access: public * @param Str $key * @param Str $value * @return NONE */ public function __set($key, $value) { if( !isset($this->config[$key]) ) { throw new Exception('Cannot set item '.$key.'.'); } $this->config[$key] = $value; } /** * getConfig() - Returns the whole configuration in an array * * @access: public * @return Array */ public function getConfig() { return $this->config; }
/** * parse() - Reads configuration into an array * * @access: public * @return NONE */ public function parse() { // save each line of data to an array-element $lines = file($this->file); foreach($lines as $line => $value) { // save information to array if( preg_match('/([^:]+)=(.+)/m', $value, $match) ) { $key = trim($match[1]); $content = trim($match[2]); $this->config[$key] = $content; } } } /** * save() - Save Configuration to file * * @access: public * @return Boolean */ public function save() { $nf = ''; $fp = fopen( $this->file, 'r' ); while( $line = fgets($fp) ) { if ( preg_match('/([^:]+)=(.+)/m', $line, $match) ) { $key = trim($match[1]); $nf .= $key." = ".$this->config[$key]."\n"; } else { $nf .= $line; } } fclose( $fp ); $fp = fopen( $this->file, 'w' ); fwrite( $fp, $nf ); fclose( $fp ); } } ?>
config.ini
Code:
# database values
dbhost = your_database_host
db = your_db
dbuser = testuser
dbpwd = testpwd
# meta tags
title = title of your website
author = the author of the website
copyright = copyright by
discription = this is a great website
keywords = website, your, nice
favicon = favicon.ico
# error pages
error400 = Error 400 - Bad request.
error404 = Error 404 - Page could not be found.
error500 = Error 500 - Internal Server Error.
Geändert von Socrates (29.06.2008 um 23:31:50 Uhr)
|
29.06.2008, 23:35:39
|
|
Member
|
|
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 36
Beiträge: 586
|
|
AW: Configuration Handling
Guten Abend!
Ich brauche leider nochmal eure Hilfe. das Eintragen funktioniert nun sehr gut, allerdings gibt es ein Problem, wenn ich, als Beispiel, für den Fehler 404 eine Nachricht inklusive Link eintrage. Ich habe stundenlang rumprobiert, aber habe leider keine anständige Lösung gefunden. Eine alternative zu meiner klasse wären natürlich die json-Funktionen gewesen, aber die Funktionieren auf meinem Space leider nicht richtig. Wäre euch sehr dankbar für Hilfe.
MfG, Andy
|
30.06.2008, 00:34:58
|
Senior Member
|
|
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 36
Beiträge: 1.476
|
|
AW: Configuration Handling
Beschreib einmal das Problem ein bisschen besser...
__________________
Opendix lehnt jegliche Haftung für evtl. vorhandene Fehler in der Grammatik sowie der Satzstellung ab! Bitte wenden Sie sich an die Tastatur!
Betatester gesucht:
Skiclub Gams / CEVI Grabs
|
30.06.2008, 01:49:02
|
|
Member
|
|
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 36
Beiträge: 586
|
|
AW: Configuration Handling
Naja das Problem ist eigentlich relativ simpel. Ich habe, wie schon gesagt, die obige Klasse geschrieben, um einige Konfigurations-Daten zu verwalten. Das Problem liegt nun darin, dass ich über die Klasse in der config.ini den error-keys HTML-Code als Inhalt zuzuweisen möchte. Das funktioniert auch so lange, wie der HTML-Code keine Attribute enthält. Wenn ich allerdings einen Link einfüge oder ein Bild wird dem Key alles bis zum"=" zugewiesen. Ich habe daraufhin statt dem "=" ein "~" als Trennzeichen zwischen Key und Value ausprobiert, allerdings bleibt der Fehler. Ich weiß nicht wieso. ich wäre dir sehr dankbar, wenn du mir an dieser Stelle helfen könntest.
MfG, Andy
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Hybrid-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 00:18:30 Uhr.
|