Vetinari: config.php schreiben

Hallo,

ich möchte daten in eine config.php schreiben. leider finde ich immer nur threads zum thema besucherzähler und so etwas. bei der config datei müssen aber mehrere werte geschrieben werden und dies am besten auch noch an die richtige stelle.

im cms contenido passiert das mit hilfe einer template datei auf folgende weise:

session_start();
list($root_path, $root_http_path) = getSystemDirectories();

$tpl = new Template;
$tpl->set("s", "CONTENIDO_ROOT", $root_path);
$tpl->set("s", "CONTENIDO_WEB", $root_http_path);
$tpl->set("s", "MYSQL_HOST", $_SESSION["dbhost"]);
$tpl->set("s", "MYSQL_DB", $_SESSION["dbname"]);
$tpl->set("s", "MYSQL_USER", $_SESSION["dbuser"]);
$tpl->set("s", "MYSQL_PASS", $_SESSION["dbpass"]);
$tpl->set("s", "MYSQL_PREFIX", $_SESSION["dbprefix"]);

$tpl->set("s", "NOLOCK", $_SESSION["nolock"]);

if ($_SESSION["configmode"] == "save")
{
 @unlink($root_path."/contenido/includes/config.php");

@$handle = fopen($root_path."/contenido/includes/config.php", "wb");

@fwrite($handle, $tpl->generate("templates/config.php.tpl", true, false));
 @fclose($handle);

if (!file_exists($root_path."/contenido/includes/config.php"))
 {
  $_SESSION["configsavefailed"] = true;
 } else {
  unset($_SESSION["configsavefailed"]);
 }
}

da ich aber diese template-engine nicht nachbauen und möglichst auch ohne session arbeiten will, möchte ich die relevanten daten (z.b. mysql zugangsdaten) aus einer textdatei auslesen und an die richtige stelle in der config.php schreiben.
hat jemand einen tipp/codeschnipsel/link wie ich das am besten machen kann?

Danke und Gruss, Martin

  1. Hallo Martin,

    in eine Datei schreiben ist wie auf einen einzeiligen Papierstreifen schreiben.
    Returns, Newlines und Tabulatoren sind auch nur ein Byte von vielen.
    D.h. man kann nicht so ohne weiteres "in" eine Datei schreiben.
    Man kann immer etwas anhängen oder alles neu schreiben.

    Wenn man die existierende Datei mit file($filename); in ein Array liest,
    kann man dort problemlos Elemente verändern und/oder einfügen.
    Abschliessend schreibt ma alles zurück und hat die gewünschte Datei.

    Da ich/wir nicht wissen, was Dir davon unklar ist, bist Du jetzt wieder dran.

    m.b.G. Rolf

    1. Hallo Rolf,

      danke!
      ja, ich dachte mir schon, dass ein array die beste alternative zur der genannten template-variante ist.
      angenommen, ich schreibe alles in das array $aDaten, wird das schreiben in die datei dann mit einer einzigen zeile:
      fwrite($handle, $aDaten, true, false));
      erledigt, oder hängt da noch mehr dran?
      wird der inhalt des arrays zeilenweise geschrieben?

      Gruss, Martin

      1. Hallo Martin,

        danke!
        ja, ich dachte mir schon, dass ein array die beste alternative zur der genannten template-variante ist.
        angenommen, ich schreibe alles in das array $aDaten, wird das schreiben in die datei dann mit einer einzigen zeile:
        fwrite($handle, $aDaten, true, false));
        erledigt, oder hängt da noch mehr dran?
        wird der inhalt des arrays zeilenweise geschrieben?

        natürlich nicht!
        Ein Array ist eine Datenstruktur, die u.U. sehr kompliziert sein kann.
        Woher sollte fwrite(); wissen, was es schreiben soll, fwrite kann nur Strings.
        Mit implode(); kann man aus einfachen Arrays einen String bauen.

        m.b.G. Rolf

        1. @Rolf,

          so, habe gerade mal ein bischen mit arrays gespielt und das prinzip ist mir jetzt klar. habe mal folgendes gecodet:

          <?php

          $aData = array();
          $row = 1;
          $num = 0;
          $handle = fopen ("config.txt","r");

          while ( ($data = fgetcsv ($handle, 1000, ",")) !== FALSE )
              {
              $num = count ($data);
              $row++;

          for ($c=0; $c < $num; $c++)
              {
                  $aData[] = $data[$c];
                  print $data[$c]."<br>\n";
              }
          }

          // check
          echo $num."<br>\n";

          fclose ($handle);

          for  ($i=0; $i < $num; $i++)
              {
                  print $aData[$i]."<br>\n";
              }

          ?>

          warum zeigt er mir in dem check der letzten schleife nur den ersten wert des arrays an? in der ersten print-schleife werden natürlich alle zeilen ausgegeben, in der zweiten nicht.
          werden mit: $aData[] = $data[$c]; nicht alle werte nacheinander in das array geschrieben?

          Gruss, Martin

          1. Hallo Martin,

            so, habe gerade mal ein bischen mit arrays gespielt und das prinzip ist mir jetzt klar.

            warum glaube ich Dir das nicht wirklich ... ;-)

            Du liest erst zeilenweise ein und gibst das dann elementweise aus:
            Drei Zeilen zu je zwei Elemente - alles okay!
            Die Elemente schreibst Du hintereinander in das Array.
            Warum, so geht Dir die zeilenweise Zuordnung verloren!
            Abschliessend iterierst Du bis zum Elementzähler,
            also werden genau zwei Elemente ausgegeben.
            Merke:
            Der Computer macht genau das, was Du vorgibst und nicht das was Dir dabei durch den Kopf geht.
            Brain-USB-Anschlüsse wurden noch nicht erfunden!

            m.b.G. Rolf

    2. Hello,

      in eine Datei schreiben ist wie auf einen einzeiligen Papierstreifen schreiben.
      Returns, Newlines und Tabulatoren sind auch nur ein Byte von vielen.
      D.h. man kann nicht so ohne weiteres "in" eine Datei schreiben.
      Man kann immer etwas anhängen oder alles neu schreiben.

      Das entspricht seit ca. 28 Jahren nicht mehr ganz der Wahrheit. Seitdem gibt es nämlich haufenweise Datenträger, die den wahlfreien Zugriff gestatten. Man nennt die auch "Festplatten".
      Dadurch kann man schon ganz gezielt einzelne Stellen in einer Datei überschreiben. Man muss diese Datei nur entsprechend organisieren, damit man weiß, was wo zu stehen hat.

      Und auch bei den guten alten Bandspeichern konnte man einzelne Blöcke austauschen, das war nur nicht so effektiv, weil man immer erst spulen musste ;-)

      Für das Schreiben und Lesen von Konfigurationsdateien hat PHP sogar eigenen Funktionen:
      http://www.php.net/manual/en/function.parse-ini-file.php

      Man kann sich aber auch selber eine Datei aufbauen, die für wahlfreien Zugriff geeignet ist. Das ist immer dann wichtig, wenn man besonders schnellen Zugriff auf einzelne Datenblöcke benötigt udn diese auch verändern möchte. Es ist dann nicht notwendi, die gesamte Datei einzulesen und neu zu schreiben, sondern man greift nur auf den gewünschten Block zu. Dazu ist auch PHP in der Lage.

      Und bitte das Sperren der Datei nicht vergessen über den gesamten Zyklus "Lesen - Verändern - Schreiben"

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hallo Tom,

        Das entspricht seit ca. 28 Jahren nicht mehr ganz der Wahrheit.
        Seitdem gibt es nämlich haufenweise Datenträger, die den wahlfreien Zugriff gestatten.
        Man nennt die auch "Festplatten".

        hmm,
        dann zeige mir bitte den Code, mit dem Du an Stelle von 3 Byte 33 Byte in eine Datei
        schreiben kannst, ohne die Datei komplett neu auf die Platte zu kratzen.
        "wahlfrei" gilt nur, solange die Anzahl der neuen und der alten Bytes gleich sind.
        Aber das funktioniert schon so seit den ersten 8" Disketten von 1969.

        m.b.G. Rolf

        1. Hello,

          Das entspricht seit ca. 28 Jahren nicht mehr ganz der Wahrheit.
          Seitdem gibt es nämlich haufenweise Datenträger, die den wahlfreien Zugriff gestatten.
          Man nennt die auch "Festplatten".

          dann zeige mir bitte den Code, mit dem Du an Stelle von 3 Byte 33 Byte in eine Datei
          schreiben kannst, ohne die Datei komplett neu auf die Platte zu kratzen.

          Solange die Datei passend organisiert ist, kann ich locker 3 Bytes lesen und stattdessen 33 wieder hineinschreiben. Es muss eben nur der Platz für die 33 Bytes vorgehalten worden sein. Auch aus diesem Grunde gibt es Datentypen.

          In PHP kann man dafür entweder pack() und unpack() verwenden, wenn man wirklich binäre Größen nutzen will, oder aber eine sinnvolle Kombination der Stringfunktionen, wenn man die Daten in direkt lesbaren Zeichen ablegen will.

          str_pad()    http://www.php.net/manual/de/function.str-pad.php
            str_repeat() http://www.php.net/manual/de/function.str-repeat.php
            substr()

          usw.

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hallo Tom,

            natürlich kann man Freistellen organisieren, vorausgesetzt, man kann
            abschätzen was in einigen Wochen, Monaten oder Jahren benötigt wird.
            Erschwerend kommt dann aber noch hinzu, dass man jemanden finden muss,
            der das verständlich in eine Doku schreibt, die auch noch gelesen wird.
            Aus diesen Gründen gehe ich davon aus, dass dieser Fall nicht auftritt!
            Aber ausschliessen kann ich es natürlich nicht ... ;-)

            m.b.G. Rolf

            1. Hello,

              natürlich kann man Freistellen organisieren, vorausgesetzt, man kann
              abschätzen was in einigen Wochen, Monaten oder Jahren benötigt wird.
              Erschwerend kommt dann aber noch hinzu, dass man jemanden finden muss,
              der das verständlich in eine Doku schreibt, die auch noch gelesen wird.
              Aus diesen Gründen gehe ich davon aus, dass dieser Fall nicht auftritt!
              Aber ausschliessen kann ich es natürlich nicht ... ;-)

              Und wie baust Du eine Tabelle einer Datenbank auf?
              Irgendwie kann ich Dir nicht folgen bei Deinen Ängsten!
              Und wenn es um ein Textfeld mit variabler Länge geht, dann muss man eben eines modellieren.

              Liebe Grüße aus Syburg bei Dortmund

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
  2. Hallo,

    ich möchte daten in eine config.php schreiben.

    okay,
    dann poste bitte ein kleines Beispiel und ein paar von den einzufügenden Zeilen.
    Sonst reden wir doch nur aneinander vorbei ...

    m.b.G. Rolf

  3. Mahlzeit Vetinari,

    ich möchte daten in eine config.php schreiben.

    Du möchtest Konfigurationsdaten für Dein(e) Skript(e) in eine separate Konfigurationsdatei, die lediglich verschiedene alphanumerische Werte (z.B. Datenbankzugangsdaten, Pfade, Dateien, voreingestellte Wert usw.) enthält, auslagern?

    Das muss nicht unbedingt eine .php-Datei sein ...

    da ich aber diese template-engine nicht nachbauen und möglichst auch ohne session arbeiten will, möchte ich die relevanten daten (z.b. mysql zugangsdaten) aus einer textdatei auslesen und an die richtige stelle in der config.php schreiben.
    hat jemand einen tipp/codeschnipsel/link wie ich das am besten machen kann?

    Ich speichere Konfigurationsdaten in der letzten Zeit immer häufiger in Form von XML-Dateien. Die sind sowohl für menschliche Augen als auch für verschiedenste (Skript-)Sprachen bestens lesbar und verständlich. Auch für PHP gibt es entsprechende Funktionen ...

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|