Ankündigung

Einklappen
Keine Ankündigung bisher.

function mit include bereinigen

Einklappen

Neue Werbung 2019

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

  • function mit include bereinigen

    Hallo,

    an mehreren Stellen in dem von mir verwendeten System werden Konstrukte in dieser Art verwendet.
    Eine Funktion inkludiert eine Datei aus dem conf-Ordner und bezieht sich auf darin definierte Variablen.

    Meine benutzte Entwicklungsumgebung PHPStorm meckert jetzt, das die Variable $get_signatur (beim count($get_signatur) ) undefiniert ist.

    Wie kann ich die Variable besser einbinden, als über einen include?
    Ich würde sie aber gern weiterhin an einer separaten Stelle außerhalb der Funktion pflegen?

    Der Projektcode ist nicht objektorientiert.

    Gruß Bornstecker

    PHP-Code:
      /**  * Überprüft alle GET-Werte  */
    function check_attack_get() {
    // Signaturen laden    
    include("/conf/getwerte.php");    
    if (
    count($get_signatur) == 0) {         return 0;     }      
    // Alles einmal durchlaufen und mitzählen    
       
    $counter = 0;    
       foreach (
    $get_signatur as $begriff => $werte) {        
           if (isset(
    $_GET[$begriff])) {            
                if (empty(
    $werte[0])) {                
                   
    $counter = $counter + $werte[1];             }
                else {                
                   if (
    stristr($_GET[$begriff], $werte[0])) {                    
                      
    $counter = $counter + $werte[1];                
                   }            
              }        
           }    
    }
    } 
    Die includierte Datei getwerte.php enthält z.B. ein Array
    PHP-Code:
    $get_signatur = array (
                           
    "user" => array ("", 1),
                           
    "cmd" => array ("", 3), ); 

  • #2
    Dann definiere die Variable doch vor dem include einfach, damit sie bekannt ist. Du kannst sie ja auf null setzen.

    Kommentar


    • #3
      werte.php:
      PHP-Code:
      <?php
      return [
          
      'user' => ['', 1],
          
      'cmd' => ['',  3]
      ];
      auswertung.php:
      PHP-Code:
      <?php
      $signature 
      = include('werte.php');
      print_r($signature);

      Kommentar


      • #4
        1. Die bessere Lösung wäre, Code der zusammenhängt nicht durch include zu trennen wenn darin Variablen sind.
        2. Sollten Konfigurationen nicht in PHP stehen. Eine leichte Lösung wäre z.B: eine JSON-Datei. Die kann überall fix eingebunden und in ein Array gewandelt werden.
        3. mephisto111 include wird nicht in Klammern geschrieben. Ich verstehe nicht, warum man seit Jahren diesen Unsinn so schreibt, aber muss jeder selber wissen.
        4. Deine IDE meckert nicht weil die Variable fehlt, sondern weil Du includierst und die Variable nicht erkannt wird. Zudem hast Du include falsch verlinkt. Der Pfad muss absolut angegeben werden z.B. mit

        PHP-Code:
        include __DIR__ . '/../conf/getwerte.php'; 
        Verwende einfach zudem statt der Variable eine Funktion die die Werte zurückgibt.
        z.B.:
        PHP-Code:
        <?php
        function get_signatur(){
            return [
                
        'user' => ['', 1],
                
        'cmd' => ['', 3]
            ];
        }
        Wenn Du das nämlich korrekt schreibst, schlägt Dir deine IDE das Verzeichnis bei der Eingabe sogar selber vor.
        Durch STRG + [linke Maus] auf den korrekten Pfad, springt sogar Dein PHPStorm an die richtige Stelle.

        Du solltest, wenn Du schon umständlich prozedural programmieren willst, wenigstens Funktion(en) in der zentralen conf.php deklarieren, die z.B. eine conf.json oder sowas auslesen und Dir den Inhalt in einem Array zurück geben.

        Was wolltest Du mit Deiner Funktion erreichen? Im Grunde macht Deine Funktion ja nichts, oder fehlt da noch was?

        Kommentar


        • #5
          Danke schon mal für die verschiedenen Antworten. Das hilft schon mal weiter.
          Zum Hintergrund möchte ich folgendes sagen. Das eingesetzte System ist schon sehr betagt und fast komplett in prozeduralem Code geschrieben. Mittlerweile habe ich es soweit hinbekommen, dass es auch unter PHP 7.4 seinen Dienst verrichtet. Allerdings ist der Code immer aufwendiger zu pflegen, was die neueren PHP-Versionen betrifft.
          Am liebsten würde ich das ganze System komplett neu entwickeln, allerdings traue ich mir das aktuell nicht zu.

          Alpha Ich habe deinen Vorschlag jetzt mal zum Anlass genommen und die erste Funktion umgebaut. Die Funktion macht natürlich schon ein bischen mehr. Am Ende wird $counter benutzt, um festzustellen, ob ein bestimmter Schwellenwert bei den übergebenen Werten erreicht wurde. Der Schwellenwert wird berechnet aus der "Gewichtigkeit" der übergebenen Parameter. Ist die Schwelle überschritten, reagiert das System mit einer entsprechenden Meldung.

          Das spielt aber für den aktuellen Versuch noch keine allzu große Rolle. Hier geht es für mich vorrangig um den Code und das Lernen, den Code richtig umzubauen.
          Die nächste Stufe wäre dann, das ganze sauber in eine objektorientierte Version umzubauen. Allerdings wollte ich das erst im nächsten Schritt angehen, wenn ich die Warnings und deprecated-Dinge erledigt habe. Ich verwende aktuell in PHPStorm PHP8 als "Configured PHP-Level". Prüfe also, ob das ganze unter PHP8 auch noch laufen würde.

          Das Ergebnis des erfolgreichen Umbaus in Kurzform. Danke nochmal für die Tipps.

          Die includierte Datei getwerte.php aus dem Verzeichnis conf/
          PHP-Code:
          <?php  function get_getwerte(){    
              return [
                   
          'user' => ["", 1],
                   
          'admin' => ["", 3],
               ];
          wird in der Funktion jetzt so verwendet
          PHP-Code:
          function check_attack_get(){
            include 
          __DIR__ . '/conf/getwerte.php';
            
          $get_signatur = get_getwerte();
            foreach (
          $get_signatur as $begriff => $werte) { 
              ... 
            } 

          Kommentar


          • #6
            Die Funktion check_attack_get wird beim zweiten Aufruf einen Fehler werfen, da du versuchst die Funktion get_getwerte (übrigens ein sehr komischer und unverständlicher Funktionsname) mehrmals zu erstellen, was aber in PHP nicht geht. Es kann nur eine Funktion mit dem Namen geben.

            Außerdem sollten Funktionen keine hardcodierten Werte enthalten. Was bedeutet 1 und was bedeutet 3? Sollen das IDs sein? Warum steht das nicht dabei und man muss das raten? Aber wie gesagt, haben hardcodierte IDs in Funktionen sowieso nichts verloren.

            Kommentar


            • #7
              Zitat von bornstecker Beitrag anzeigen

              Alpha
              PHP-Code:
              <?php function get_getwerte(){
              return [
              'user' => ["", 1],
              'admin' => ["", 3],
              ];
              wird in der Funktion jetzt so verwendet
              PHP-Code:
              function check_attack_get(){
              include 
              __DIR__ . '/conf/getwerte.php';
              $get_signatur = get_getwerte();
              foreach (
              $get_signatur as $begriff => $werte) {
              ...
              } 
              Das klappt aber nur 1 Mal. Wenn du die Datei ein 2tes Mal benötigst wirst du ein Fehler bekommen, dass die Funktion get_getwerte bereits existiert. Wenn es sich hier wirklich nur um statische Werte handelt, ist die Lösung von mephisto111 besser geeignet.
              PHP-Code:
              <?php
              // conf/getwerte.php
              return [
                  
              'user' => ['', 1],
                  
              'cmd' => ['',  3]
              ];
              Und dann:
              PHP-Code:
              function check_attack_get(){
                
              $get_signatur = require __DIR__ . '/conf/getwerte.php';
                foreach (
              $get_signatur as $begriff => $werte) {
                  ...
                } 

              Kommentar


              • #8
                Sorry. Das verstehe ich gerade nicht. Meinst Du, wenn bei einem Request die Funktion check_attack_get() zweimal aufgerufen würde?

                [Edit:]
                Doch verstanden. Ich baue es nochmal um. Bisher bin ich nur von einem Aufruf der Funktion pro Request ausgegangen.

                Kommentar


                • #9
                  Zitat von bornstecker Beitrag anzeigen
                  Meinst Du, wenn bei einem Request die Funktion check_attack_get() zweimal aufgerufen würde?
                  Ja. Oder wenn in deinem Code 2 Mal include __DIR__ . '/conf/getwerte.php'; aufgerufen wird.

                  Kommentar

                  Lädt...
                  X