[Funktion] Variable von Funktion zu Funktion

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

  • [Funktion] Variable von Funktion zu Funktion

    Hallo,

    Mein Ziel
    Ich habe (fix) 3 Funktionen, in der ersten funktion wird (zbs.) "$mysql_data" mit einem MySQL->Fetch_array() belegt.

    In der 2ten Funktion wird eine Templatedatei geparst, die wiederrum erkennt, in meinem Fall {&mysql_data->spalte} und ersetzt die in einerr 3ten Funktion namens this_array();

    Das Problem
    Der Array "$mysql_data" kommt in der letzten Funktion nicht an!
    global $mysql_data; Kann ich in diesem Fall nicht anwenden, da der Variablenname dynamisch erzeugt wird.

    Habe schon überlegt mit $GLOBALS zu arbeiten, suche aber jedoch nach einer Alternativen, wenn dies möglich ist.

    Die Funktionen
    Zum ersten habe ich die Fkt. proceed_mysql, eigentlich unrelevant, da hier nur die preg_replace's sind:

    PHP-Code:
    function proceed_mysql($template)
    {
        
    $template preg_replace_callback("/\{mysql query (.*) sql=\"(.*)\"}/sUi",                    array($this,"mysql_performquery"),    $template);
        
    $template preg_replace_callback("/\{mysql fetch (.*) to (.*) (.*)\}/sUi",                    array($this,"mysql_fetch"),            $template);
        
    $template preg_replace_callback("/\{mysql foreach (.*) to (.*) (.*)}(.*)\{\/mysql\}/sUi",    array($this,"mysql_foreach"),        $template);
        return 
    $template;

    Dann die mysql_fetch, hier werden die Daten aus der MySQL-Datenbank in den dynamische Array geladen:

    PHP-Code:
    function mysql_fetch($vars)
    {    
        global ${
    $vars[1]}, ${$vars[2]};
            
        
    #print "Template::mysql_fetch -> Ressource \${$vars[1]} = " . ${$vars[1]} . " <br />";

        
    if ($vars[3]=="assoc"$type MYSQL_ASSOC;
            elseif (
    $vars[3]=="num"$type MYSQL_NUM;
            elseif (
    $vars[3]=="both"$type MYSQL_BOTH;
            else 
    $type MYSQL_ASSOC// end if
        
        
    while ($data mysql_fetch_array(${$vars[1]}, $type)) {
            ${
    $vars[2]}[$data["name"]] = $data["wert"];
        }

    hier kann ich noch globals verwenden, aber in der nächsten Funktion nicht mehr.

    Das wäre dann die Fkt. this_array();
    Diese Funktion wird von der Fkt. parse(); aufgerufen, denn hier werden die {&mysql_data->spalte} "assigned"

    PHP-Code:
    function this_array($vars)
    {    
        global ${
    $vars[1]};
        return ${
    $vars[1]}[$vars[2]];

    Da die MySQL-Daten über die Funktion parse(); rutschen, gehen sie in der Fkt. this_array(); einfach verloren.


    Lösung
    Als Ansatz habe ich, wie oben schon gesagt, mir überlegt das ganze mit $GLOBALS-Variablen zulösen.
    Ich suche aber noch eine Alternativ möglichkeit, falls vorhanden.

  • #2
    Vielleicht hilft dir http://php.net/manual/en/functions.a...iable-arg-list weiter.

    Kommentar


    • #3
      Erstmal Danke!
      Aber hilft mir leider nicht weiter.
      Hab's grad ausprobiert, bekomme aber auch nur die Variablen, die in der Funktion definiert sind!

      Also keine Funtionsübergreifende Var.

      Kommentar


      • #4
        Ich muß zugeben, dass ich aus obigem Code nicht ganz schlau werde, da fehlt mir irgendwie das Drumherum.

        Aber du versuchst doch scheinbar folgendes:
        - Funktion 1 holt Daten aus einer DB
        - Funktion 2 parst ein Template
        - Funktion 3 ersetzt die von der 2. gefundenen Platzhalter durch die Daten aus der 1.

        Würde wohl jeder intuitiv etwa so angehen:
        PHP-Code:
        function function3() {
            
        $data function1();
            
        $tpl_vars function2();
            foreach (
        $tpl_vars ...) {
                
        // ersetze Platzhalter aus $tpl_vars 
                // durch Daten aus $data
            
        }

        Bei dir scheinen die Aufrufe der 1. und 2. Funktion aber nicht in der 3. stattzufinden, wodurch sich das Problem ergibt, die von der 1. und 2. Funktion erzeugten Werte in die 3. zu übergeben. Du kannst die Daten nicht globalisieren, deshalb mußt du sie zurückgeben. Die Rückgabewerte übergibst du der 3. Funktion. Das geht erstmal ganz einfach, denn die Rückgabe der ersten beiden Funktionen kannst du nur in jeweils einer Variablen auffangen. Also wären nur zwei Vars an die dritte Funktion zu übergeben. Mein Hinweis auf variable Argumentlisten wird erst interessant, falls du zum Beispiel die 2. Funktion für jedes Datum der Rückgabe der ersten aufrufst und die Rückgaben in variablen Variablen auffängst.

        Wie gesagt, dein ganzer Ansatz erschließt sich mir nicht wirklich. Deshalb ist das hier wenig zielführendes, allgemeines Gerede. Reiche doch mal etwas (Pseudo-)Code nach, der zeigt wie die drei Funktionen bei dir zusammenhängen.

        Kommentar


        • #5
          Anbei die Funktionen:

          - habe bereits einen weiteren Test gestartet um die Variablen unterzubringen ($this->dyndata)


          PHP-Code:
          class Template
          {
              var 
          $dyndata;

          /*
              Parsen
              */
          function parse($template)
          {
              
          $template preg_replace_callback("/\{load \[(.*)\]}/sUi"
                  array(
          $this,"loadFile"), $template);
              
          $template preg_replace_callback("/\{_(.*)\.(.*)\}/sUi"
                  array(
          $this,"glob_var"), $template);
              
          $template preg_replace_callback("/\{&(.*)\->(.*)\}/sUi"
                  array(
          $this,"this_array"), $template);
              
              
          $template preg_replace_callback("/\{foreach (.*) to (.*)\}(.*)\{\/foreach\}/sUi",
                  array(
          $this,"tpl_foreach"), $template);

              
          // MySQL-Render if exists
              
          if (ereg("{mysql",$template)) {
                  
          $template $this->proceed_mysql($template);
              }
              
          $this->emptySeps == true $template preg_replace("/\{(.*)\}/sUi",    ""$template) : 0;
              return 
          $template;
          }
              
              
          /*
              MySQL Regex
              */
          function proceed_mysql($template)
          {
              
          $template preg_replace_callback("/\{mysql query (.*) sql=\"(.*)\"}/sUi",
                  array(
          $this,"mysql_performquery"),$template);
              
          $template preg_replace_callback("/\{mysql fetch (.*) to (.*) (.*)\}/sUi",
                  array(
          $this,"mysql_fetch"),$template);
              
          $template preg_replace_callback("/\{mysql foreach (.*) to (.*) (.*)}(.*)\{\/mysql\}/sUi",
                  array(
          $this,"mysql_foreach"), $template);
              return 
          $template;
          }    
              
          /*
              Parst Arrays
              */
          function this_array($vars)
          {
              return 
          $this->dynData->[$vars[1]][$vars[2]];
          }


          /*
              Verarbeitet die MySQL-Commands
              */
          function mysql_performquery($vars)
          {    
              global ${
          $vars[1]};
              ${
          $vars[1]} = $this->exec_query($vars[2]);

              
          #print "Template::mysql_performquery ->    ".
              # "Ressource \${$vars[1]} = " . ${$vars[1]} . " <br />";
          }

          /*
              Holt MySQL-Daten aus der Tabelle
              */
          function mysql_fetch($vars)
          {    
              global ${
          $vars[1]}, ${$vars[2]};
                  
              
          #print "Template::mysql_fetch -> "
              #. " Ressource \${$vars[1]} = " . ${$vars[1]} . " <br />";

              
          if ($vars[3]=="assoc"$type MYSQL_ASSOC;
                  elseif (
          $vars[3]=="num"$type MYSQL_NUM;
                  elseif (
          $vars[3]=="both"$type MYSQL_BOTH;
                  else 
          $type MYSQL_ASSOC// end if
                  
              
          while ($data mysql_fetch_array(${$vars[1]}, $type)) {
                  
          $this->setDyndata($vars[2][$data["name"]], $data["wert"]);
              }
          }
              
          /*
              Speichert Daten im Dynamischen Array
              */
          function setDyndata($key$value)
          {
              
          $this->dyndata->$key $value;
          }

          /*
              Führt ein SQL-Query aus @returned die Ressource
              */
          function exec_query($sql)
          {
              
          $mq  mysql_query($sql) or die(mysql_error());
              if (!
          $mq) {
                  print 
          "Der Query konnte nicht ausgeführt werden:<br />"$sql;
              }
              return 
          $mq;
          }

          // End Class 
          Zuletzt geändert von Skaschy; 30.04.2006, 12:56.

          Kommentar


          • #6
            Danke onemorenerd,

            Aber dein Beitrag mit der Vorgehensweise, trifft bei mir glaube ich nicht zu.

            Belehre mich eines besseren

            Hab jetzt wieder ein Problemchen mit den Codchen.

            Habe die $this->dyndata am Classheader deklariert, und in der Fkt. setDyndata(), wird sie auch richtig gefüllt, hab Debugausgaben schon gemacht, nur in der Fkt. ist sie schlicht und ergreifend LEER!

            Hab mal einwenig debugt, und gemerkt das erst der mysql_fetch_array () ausgeführt wird und danach der mysql_query().

            Das versteht ich grad nicht so ganz!

            So long und bis dahin, schönen Feiertag & Kater

            Kommentar


            • #7
              Naja, das ist auch nicht das Gelbe vom Ei. Die Idee mit der Klasse löst zwar dein Übergabeproblem, macht aber deinen Code noch schlechter.

              Zu dem neuen Problem kann ich wieder nichts sagen, weil immernoch keine Funktions- bzw. nun Methodenaufrufe zu sehen sind.

              Kommentar

              Lädt...
              X