Variablen in Config.php ändern?

LittleDestroyer

Erfahrenes Mitglied
Hallo,
Ich bin gerade dabei mir eine Homepage mit PHP zu machen.

Ich habe es so gemacht das ich den Inhalt der Seiten mit "$_GET" anzeigen kann.
Also wenn ich "index.php?id=home" aufrufe komm ich auf die Seite "Home", das gleiche mit den anderen.
Der Inhalt der mir bei Home angezeigt wird habe ich in einer "config.php" stehn. Somit kann ich die einzelnen Inhalte einfach in der "config.php" ändern.

Jetzt wollte ich die Inhalte aber von einer anderen Seite aus ändern. Diese heißt dann "acp.php".

Also, ich habe 3 Seiten:
"index.php"
"config.php"
"acp.php"

Und ich will jetzt mit "acp.php" die Variable von "config.php" ändern.
Hatte es so Probiert...
Im head das hier:
Code:
<?
include "config.php";
?>
und dann im Body das hier:
Code:
<?
$home = "Test";
?>

Das Problem ist, das sich der die Variable "home nur auf der "acp.php" ändert, aber nicht in der "config.php".

Hoffe ihr versteht was ich meine,
MfG LittleDestroyer
 
Ähm. Wenn ichs richtig verstanden habe erwartest du das du irgendwo in acp.php schreibst:

PHP:
$home = "neu";

und erwartest, dass die config.php sich ändert zu:

PHP:
<?PHP
$home = "neu";
?>

Das macht PHP nicht. Die Variable $home wird nur zur Laufzeit geändert intern aber nicht in der Datei. Um Sachen in einer Datei zu ändern verwende:

fopen()
fread()
fwrite()
fclose()

und vielleicht noch:

strpos()
substr()

oder optional wenn du dich mir Regular Expressions auskennst:

file_get_contents()
preg_replace()
file_put_contents()

Funktionsbeschreibung nachzulesen unter php.net
 
Zuletzt bearbeitet:
Meines Wissens nicht, habe selbst nach einer gesucht und das "kürzeste" aber nicht sehr perfomante was ich dazu gefunden hab war die Lösung mit file_get_contents(), preg_replace() (oder str_replace) und file_put_contents().

Deine Funktion könnte also sein:
PHP:
function ChangeConfig($Filename, $Varname, $NewValue) {
  global $$Varname;  // Variable für Funktion verfügbar machen

  $s = file_get_contents($Filename);  // Dateiinhalt holen
  // Nach Variablen suchen in der Form: $var = "value";
  // und ersetzen durch: $var = "NewValue";
  $s = str_replace('$'.$Varname.' = "'.$$Varname.'";' , '$'.$Varname.' = "'.$NewValue.'";' , $s);
  // Dies wieder in die Datei schreiben...
  file_put_contents($Filename, $s);
  // ...und variable selbst "lokal" ändern
  $$Varname = $NewValue;
}

ChangeConfig("config.php", "home", "NeuerInhalt");

Bitte mache ein Backup von deiner Config bevor du das testest. Habe die Funktion ausm Stegreif geschrieben
 
Ich habe mal eine Klasse geschrieben, die die Verwaltung meiner Konfigurations-Daten übernimmt. Mit dieser Klasse kann ich die Konfigurations-Daten auslesen, ändern und neue erstellen. Leider funktioniert das ganze noch nicht so richtig. Kann sie trotzdem nachher mal posten. Vielleicht findet ja jemand den Fehler. Dann kannst du die Klasse gerne nutzen.
MfG, Andy

//EDIT: Die oben gepostete Funktion hat ein kleines Problem. In der neunten Zeile wird via file_put_contents() die Variable in die Config-Datei übertragen. Dadurch wird allerdings der Inhalt der ersten Zeile überschrieben und nicht die Zeile in der die alten Werte standen. Zudem könnte ja das neue Value für diesen Eintrag kleiner als das alte sein. Dann hätte man das Problem, dass hinter dem neuen Eintrag noch Reste des alten stünden...
 
Zuletzt bearbeitet von einem Moderator:
Du hast Recht. Entschuldige. Stimmt ja. Löscht file_put_contents() denn den alten Inhalt der Datei? Hab dazu auf die Schnelle nichts gefunden.
MfG, Andy

// Edit du könntest im übrigen auch die komplette Datei in einem Array speichern, den Inhalt des Arrays ändern, den alten Inahlt der config.php beim öffnen mit fopen() automatisch löschen und dann den neuen Inhalt in einer foreach()-Schleife in die config.php schreiben. Dass sollte deutlich schneller gehen, da str_replace() bei großen Konfigurations-Dateien zum Performance-Fresser wird. Setze mich heute Abend mal an eine solche Lösung. Interessiert mich nämlich selbst. Poste sie dann hier.
 
Zuletzt bearbeitet von einem Moderator:
php.net hat gesagt.:
This function is identical to calling fopen(), fwrite() and fclose() successively to write data to a file.

If filename does not exist, the file is created. Otherwise, the existing file is overwritten, unless the FILE_APPEND flags is set.

[phpf]file_put_contents[/phpf] bietet dir eigentlich was du brauchst.
 
Ok der zweite Teil ist sehr interessant. Die Datei wird wohl überschrieben, dass ist erstmal das wichtigste. Allerdings denke ich wirklich, dass aus Performance-Gründen noch nach einer anderen Lösung als der obigen geschaut wwerden sollte. Wie stehst du dazu, wenn man Fragen darf, Felix?
MfG, Andy
 
@Catull:

Wenn du es sehr performant haben willst dann ist zum auslesen der Datei file_get_contents() am schnellsten. readfile() wäre noch schneller aber ermöglicht kein Verarbeiten der Daten.

Zum Aufspüren und Ersetzen des Strings sollte die Länge vorab bestimmt werden und die Position im String mit strpos() ermittelt werden. Wie du schon gesagt hast ist str_replace() da zu langsam. Daher String bis zur Position + Ersatzstring + Rest vom String (um substr kommt man leider nicht rum).

Für das schreiben empfiehlt sich für große Dateien und auch in diesem Fall wieder file_put_contents(). Aber was sind schon große Dateien? Ich denke da an über 2 MB :D

Interessant wäre noch fopen(), zur Stelle springen mittels strpos() und die eine Zeile ändern, obwohl ich das auch für etwas langsamer halte.

Bin schon auf deine Klasse dazu gespannt, da ich sowas bald auch wieder brauchen werde ;)
 
Zuletzt bearbeitet:
Zurück