SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Entwicklung und Softwaredesign

PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 02.06.2008, 00:53:51
Benutzerbild von Socrates
Socrates Socrates ist offline
Member
 
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 34
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.
__________________
BSc. Applied Computer Science
http://www.bornageek.com

Geändert von Socrates (02.06.2008 um 00:55:01 Uhr)
Mit Zitat antworten
  #2  
Alt 02.06.2008, 13:22:08
Opendix Opendix ist offline
Senior Member
 
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 34
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 13:25:16 Uhr)
Mit Zitat antworten
  #3  
Alt 03.06.2008, 18:10:06
Benutzerbild von Socrates
Socrates Socrates ist offline
Member
 
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 34
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
__________________
BSc. Applied Computer Science
http://www.bornageek.com
Mit Zitat antworten
  #4  
Alt 04.06.2008, 03:29:33
Opendix Opendix ist offline
Senior Member
 
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 34
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
Mit Zitat antworten
  #5  
Alt 04.06.2008, 10:31:47
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 14
Beiträge: 2.269
AW: Configuration Handling

Alternativ, die erste Zeile der IniDatei:
Code:
; <?php die('das war wohl nix!')?>
Mit Zitat antworten
  #6  
Alt 04.06.2008, 13:13:20
Benutzerbild von Socrates
Socrates Socrates ist offline
Member
 
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 34
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
__________________
BSc. Applied Computer Science
http://www.bornageek.com
Mit Zitat antworten
  #7  
Alt 24.06.2008, 02:02:07
Benutzerbild von Socrates
Socrates Socrates ist offline
Member
 
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 34
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:
  1. kommentare werden beim schreiben gelöscht
  2. blanks werden beim schreiben nicht beachtet
  3. 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.
__________________
BSc. Applied Computer Science
http://www.bornageek.com

Geändert von Socrates (30.06.2008 um 00:31:50 Uhr)
Mit Zitat antworten
  #8  
Alt 30.06.2008, 00:35:39
Benutzerbild von Socrates
Socrates Socrates ist offline
Member
 
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 34
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
__________________
BSc. Applied Computer Science
http://www.bornageek.com
Mit Zitat antworten
  #9  
Alt 30.06.2008, 01:34:58
Opendix Opendix ist offline
Senior Member
 
Registriert seit: Oct 2004
Ort: Werdenberg / Schweiz
Alter: 34
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
Mit Zitat antworten
  #10  
Alt 30.06.2008, 02:49:02
Benutzerbild von Socrates
Socrates Socrates ist offline
Member
 
Registriert seit: Jul 2006
Ort: Göttingen/Deutschland
Alter: 34
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
__________________
BSc. Applied Computer Science
http://www.bornageek.com
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Kein PHP auf virtual Hosts ToB Apache HTTP-Server 2 14.08.2007 04:33:15
error handling bei unknown function tharem PHP für Fortgeschrittene und Experten 3 16.11.2004 18:18:03
Session Handling jensn PHP für Fortgeschrittene und Experten 12 20.12.2003 17:27:10
Exception Handling ?! Phil PHP für Fortgeschrittene und Experten 3 10.12.2003 22:13:43
Link handling Loki PHP für Fortgeschrittene und Experten 3 22.10.2002 11:38:49


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:28:04 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.


© 2001-2023 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt