Ankündigung

Einklappen
Keine Ankündigung bisher.

Mit PHP, PHP Code in Datei schreiben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mit PHP, PHP Code in Datei schreiben

    allo, ich möchte mit PHP die Config.php für ein kleines Script selbst erstellen. In dieser Datei sollen dann die Daten für die Datenbankverbindung erstellt werden.

    Mit fwrite ging dies leider nicht, da PHP versucht den Code auszuführen.
    Der Code, der in die Datei geschrieben werden soll, beinhaltet wie für PHP üblich Variablen, leider versucht PHP diese zu compilen anstatt diesen einfach nur in eine Datei zu schreiben.
    Kennt jemand eine Lösung für mein Problem?

    So sähe zum Beispiel der Code aus, der in die Config,php geschrieben werden soll.

    PHP-Code:
    $db_name $input_:db_name;
    $db_user $input_db_user;
    //... 
    $db_name soll nicht ausgeführt werden, wohingegen $input_db_name ausgeführt werden soll, und der Wert eingetragen werden soll, der vorher eingegeben wurde.

    Ist soetwas mit PHP möglich? Gibt es eine Funktion, die die Ausführung von Code verhindert?

    Danke
    http://bitro.de

  • #2
    Das geht so wie du dir das vorstellst nicht.
    Überlege mal warum?

    Kommentar


    • #3
      Klar geht das:
      PHP-Code:
      <?php
      $variable 
      "foobar";
      echo 
      "\$variable = '$variable';";
      Anstatt das aber so irgendwie zusammenzufrickeln würde ich dir [man]var_export[/man] empfehlen, das ist, wie der Name vermuten lässt, für den Export von Variablen gedacht.

      Kommentar


      • #4
        So wie er das hat geht es nicht. Das es anders geht ist klar auch dies ist eine Variante
        PHP-Code:
        $variable "foobar";
        echo 
        '$variable = "' $variable '";'
        aber wo ist da der Lerneffekt für ihn?


        Kommentar


        • #5
          Danke für die Hilfestellung soweit.

          Ich habe das mit var_export() probiert, jeoch konnte ich damit nicht die entsprechenden Ergebnisse erzielen, da aus \n ein \\n wurde.
          In der vorherigen Config waren die Funtkionen auch enthalten, die habe ich rausgenommen. Ich hatte zum Beispiel eine Funktion, welche <form> und <input> Felder erstellt, mit den Anführungszeichen ist das dann nichtmehr aufgegangen.

          Dadurch, dass ich die Config abgespeckt habe, konnte ich es ganz normal mit Anführungszeichen lösen. Hier meine Lösung, falls es jemanden Interressiert:
          PHP-Code:
          <?php

          require_once '../cfg/variables.php';

          /*
           * INSTALLATION ROUTINE STARTS HERE
           */

          if (isset($_POST['submitInstall'])) {
              
          $i 0;
              if (empty(
          $_POST['db_user'])) {
                  echo 
          "Enter username.<br/>";
                  
          $i++;
              }
              
          //if (empty($_POST['db_pass'])) {
                  //return; password can be empty, no problem
              //}
              
          if (empty($_POST['db_name'])) {
                  echo 
          "Enter database name, default is `root`.<br/>";
                  
          $i++;
              }
              if (empty(
          $_POST['db_host'])) {
                  echo 
          "Enter your host, by default it often is `localhost`.<br/>";
                  
          $i++;
              }

              if(
          $i) {
                  echo 
          "Stopped processing, resolve the problems above.<br/>";
                  return;
              }

              
          //going on
              
          $db_user $_POST['db_user']; //normally escaped
              
          $db_pass $_POST['db_pass']; //normally escaped
              
          $db_name $_POST['db_name']; //normally escaped
              
          $db_host $_POST['db_host']; //normally escaped
              //content of config.php

              
          $configFile "../cfg/config.php";

              
          /* CONFIG FILE START HERE */

              /*
               * THIS IS NO ACTUALLY RUNING OR EXECUTED CODE
               */
              
          $configFileContent 
                  session_start();
                  $DB_NAME = "' 
          $db_name '";
                  $DB_USER = "' 
          $db_user '";
                  $DB_PASS = "' 
          $db_pass '";
                  $DB_HOST = "' 
          $db_host '";

                  require "variables.php";
                  require "functions.php";

                  try {
                      $conn = new PDO("mysql:host=$DB_HOST;dbname=$DB_NAME", $DB_USER, $DB_PASS);
                  } catch (PDOException $e) {
                      print "Error:" . $e->getMessage();
                      die("end script");
                  }
                  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                  $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);'
          //End of Config.php


              /*
               * Createing file: config.php
               */

              
          $handle fopen($configFile"w");

              if (!
          $handle) {
                  echo 
          "Error while creating config.php file, check read/write permissions of the install.php file.<br/>";
                  return;
              }

              
          $installed fwrite($handle"<?php " $configFileContent);

              if (!
          $installed) {
                  echo 
          "Failed to create config.php, maybe create on our own by extract the source code out install.php<br/>";
                  return;
              }

              echo 
          "The file config.php was sucessfully created.<br/>";



              
          /* CONNECT AND CREATE DATABASE AND TABLES */
              
          $install_conn = new mysqli($db_host$db_user$db_pass);

              if (
          $install_conn->connect_error) {
                  echo 
          "Failed to connect to SQL.<br/>";
                  return;
              }

              echo 
          "Connected to SQL Server.<br/>";


              
          /* DATABASE QUERYS */
              
          $sql_db "CREATE DATABASE IF NOT EXISTS `$db_name`";
              
          $sql_use "USE `$db_name`";
              
          $sql_tbl1 "CREATE TABLE `$tblPageInfo` (
                        `id` int(11) NOT NULL AUTO_INCREMENT,
                        `impressum` text NOT NULL,
                        `title` varchar(255) NOT NULL,
                        `description` text NOT NULL,
                        PRIMARY KEY (`id`)
                      ) ENGINE=InnoDB DEFAULT CHARSET=latin1"
          ;

              
          $sql_tbl2 "CREATE TABLE `$tblContent` (
                        `id` int(11) NOT NULL AUTO_INCREMENT,
                        `text` text NOT NULL,
                        `headline` varchar(255) NOT NULL,
                        PRIMARY KEY (`id`)
                      ) ENGINE=InnoDB DEFAULT CHARSET=latin1"
          ;

              
          $sql_tbl3 "CREATE TABLE `$tblSidebar` (
                        `id` int(11) NOT NULL AUTO_INCREMENT,
                        `type` int(11) NOT NULL,
                        `href` varchar(255) NOT NULL,
                        `value` varchar(50) NOT NULL,
                        PRIMARY KEY (`id`)
                      ) ENGINE=InnoDB DEFAULT CHARSET=latin1"
          ;

              
          // Execute
              
          $stmt1 $install_conn->query($sql_db);
              
          $sql_use $install_conn->query($sql_use);
              
          $stmt2 $install_conn->query($sql_tbl1);
              
          $stmt3 $install_conn->query($sql_tbl2);
              
          $stmt4 $install_conn->query($sql_tbl3);

              
          //report
              
          if($install_conn->error) {
                  echo 
          "Failed to setup your tables.<br/>";
                  return;
              }

              echo 
          "Database was created, everything was successfully.<br/>";
              echo 
          "Now you have to <strong>delete</strong> the <i>install</i>-folder in <i>php</i>-folder.<br/>";
          }
          PS: wo gehen Spoiler?
          http://bitro.de

          Kommentar


          • #6
            So richtig Sinn sehe ich nicht in den Vorhaben, ein komplettes Skript komplett per PHP "zu schreiben". Es reicht doch aus, nur die applikationsabhängigen Einstellungen wie hier Username etc. in einer separaten Datei abzulegen und sich diese dann in ein fertiges Konfigurationsskript im einfachsten Fall per include zu holen.

            Eine andere ungewöhnliche Variante ist ein Templatesystem zu nutzen, welches keinen PHP-Code ausführt, wie z.B. Tinytemplate.
            Die Vorlage ist ein komlettes PHP.Skript mit Platzhaltern für die applikationsabhängigen Einstellungen:
            phptemplate.php
            PHP-Code:
            <?php
            $user 
            "{{username}}";
            $password "{{password}}";
            echo 
            "User:".$user."<br>";
            echo 
            "Password:".$password."<br>";
            Ein zweites Skript ersetzt die Platzhalter und erzeugt das Resultat
            PHP-Code:
            $tpl = new tinytemplate('phptemplate.php');
            $tpl->assign(array(
              
            'username' => "Max",
              
            'password' => "geheim"
            ));
            file_put_contents('testphptemplate.php',$tpl->renderCode()); 
            Dies hier dient nur den Grundgedanken zu zeigen. Dieses Skript könnte auch eine Formularverarbeitung u.a. enthalten.

            Das Resultat testphptemplate.php sieht dann wie folgt aus:
            PHP-Code:
            <?php
            $user 
            "Max";
            $password "geheim";
            echo 
            "User:".$user."<br>";
            echo 
            "Password:".$password."<br>";

            Kommentar


            • #7
              Zitat von jspit
              So richtig Sinn sehe ich nicht in den Vorhaben, ein komplettes Skript komplett per PHP "zu schreiben". Es reicht doch aus, nur die applikationsabhängigen Einstellungen wie hier Username etc. in einer separaten Datei abzulegen und sich diese dann in ein fertiges Konfigurationsskript im einfachsten Fall per include zu holen.
              Ich wüsste nicht, wie ich die Daten sicher in einer Datei abspeichern kann, ohne auf diese in Klartext nichtmehr zugreifen zu können. Wie hättest du das denn gelöst?

              http://bitro.de

              Kommentar


              • #8
                Ich würde es in eine .ini oder .xml Datei anlegen und dafür sorgen das es von Benutzer nicht abrufbar ist.

                Kommentar


                • #9
                  Dateien mit sensiblen Informationen sollten oberhalb/außerhalb vom Document Root abgelegt werden. So sind diese Dateien über den Webserver nicht erreichbar, mit PHP hast du jedoch weiter Zugriff auf diese Dateien. Steht oberhalb vom Document Root nichts zur Verfügung (mitunter bei Billighostern), dann können diese Dateien auch in ein extra Verzeichnis gespeichert werden und diese mit htaccess vor einem Zugriff per Webserver gesperrt werden.

                  Wie hättest du das denn gelöst?
                  Den Fall die Konfigurationsdaten über ein Formular erfassen zu müssen hatte ich noch nicht. Kannst aber mal auch hier array, Config-Datei reinschauen.

                  Kommentar


                  • #10
                    Warum willst du das unbedingt nach PHP kompilieren? Nimm doch einfach was lesbares wie YAML.
                    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                    Kommentar

                    Lädt...
                    X