Function nur einmal aufrufen

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

  • Function nur einmal aufrufen

    Hallo,

    ich hatte vor einiger Zeit mal ein Problem gepostet. Leider konnte mir dort keiner so richtig helfen. Nun bin ich dem Problem sowas von dicht auf der Spur. Ich will es mal versuchen zu erklären:

    Ich habe eine Datei, in welcher Werte in Feldern geändert werden können.
    Einen Button, auf den man klicken kann und dieser löst eine action=update aus. Dieses Action, verweist dann auf eine function. Nun ist aber so, das die Seite (normal) wieder neu geladen wird und die Function, noch ein 2tes mal aufgerufen wird. Wie kann ich die Funktion nur einmal aufrufen?
    mit z.B. $i++ geht es nicht, da die Seite ja neu geladen wird und $i wieder auf dem default Wert steht. Ich hoffe, ihr Versteht mein Problem und könnt mir helfen?!


    Liebe Grüße aus Berlin

  • #2
    Entweder ein cookie setzen beim ersten Aufruf, und beim zweiten Seitenaufbau abfragen (und löschen). Oder denselben Effekt mit einer Serverseitigen Session-Variabeln. Oder nach dem updaten action=noupdate setzen (für den Fall er nochmals klickt). Oder nach dem Updaten das Form ohne button ausgeben.

    Deine Problembeschreibung ist aber nicht ganz klar, deswegen das Multipack an Vorschlägen. Unklar ist, warum die Seite zweimal ausgegeben wird und der Button zweimal geklickt wird.

    Kommentar


    • #3
      Hallo,

      ich werde noch einmal versuchen das Problem zu erklären.

      Ich habe eine Seite, auf welcher ich eine Ausgabe, von Werten habe. Diese Werte, werden in der Datei function.php in ein array geschrieben.
      Nun kann der User auf dieser Seite Werte ändern. Ist er damit fertig, klickt er auf den button aktualisieren. Nun erfolgt eine Übergabe eines <form> mit action=update. Die action wird definiert in der general.php.
      Die geänderten Werte, sollen in das erstellte array auf der Seite function.php geschrieben werden. Wenn ich innerhalb dieser Funktion vor return ein print_r schreibe, wird mir das neue array richtig angezeigt. Wird die Seite wo der User die Daten ändern konnte wieder geöffnet, habe ich wieder die ungeänderten Werte in diesem array. Denn wenn ich es so wie vorgeschlagen mit einer Session oder einem cookie nutze, dann bleibt das array aus dieser function von anfang an leer. Ich hoffe, nun kann man es bissel besser verstehen.

      Vielen Dank, und Grüße aus Berlin

      Kommentar


      • #4
        Du willst sagen, dass die geänderten Werte nicht angezeigt werden?

        Zeig mal etwas Code!

        Kommentar


        • #5
          Hallo onemorenerd,

          wir hatten ja schon einmal das vergnügen. Ist noch immer das gleich Problem nur konnte ich es eben immer weiter eingrenzen auch wenn lange gedauert hat. Im nachfolgenden der Code.

          PHP-Code:
          function size() {
          global 
          $languages_id$cart_quantity_photo$cart;

                
          $size = array();
                
          $photo_array = array();
                
          reset($this->contents);
                while (list(
          $products_id) = each($this->contents)) {

                  
          $photo_query tep_db_query("select p.price_group, 
          ph.photo_size, ph.quantity, ph.photo_id, ph.photo_id, ph.photo_price, 
          ph.tax_class_id from " 
          TABLE_PHOTO_INFO " ph, " 
          TABLE_PRODUCTS " p where p.products_id = '" . (int)$products_id "' 
          and  ph.price_group = p.price_group and ph.language_id  = '" 
          . (int)
          $languages_id "'");

                  while(
          $photo tep_db_fetch_array($photo_query)) {

                  
          $products_key = (int)$products_id $photo['photo_id'];

                   if( (
          $cart_quantity_photo[$products_key] == '') || 
          $cart_quantity_photo[$products_key] == $photo['quantity']) {
                   
          $menge $photo['quantity'];
                   } else {
                   
          $menge $cart_quantity_photo[$products_key];
                  }         

                       
          $size[] = array('id' => (int)$products_id,
                                        
          'photo_size' => $photo['photo_size'],
                                       
          'photo_price' => $photo['photo_price'],
                                       
          'photo_tax' => $photo['tax_class_id'],
                                       
          'id_photo' => $prid,
                                       
          'photo_id' => $photo['photo_id'],
                                       
          $products_key => $menge);
                                       
                  }
                      
          $photo_array[] = array('photo' => $size);
              unset(
          $size);
              }
              return 
          $photo_array;

          Setze ich vor das return $photo_array ein print_r($photo_array) werden mir die geänderten Werte in diesem array angezeigt. Ich denke das es eben daran liegt, das die function beim öffnen Seite noch einmal ausgeführt wird und das array $cart_quantity_photo dann leer ist. Und dann nimmt er als $menge natürlich die DB Werte.

          So sieht der aufruf der function aus, wenn ich auf den Button Aktualisieren klicke:

          PHP-Code:

              
          switch ($HTTP_GET_VARS['action']) {

                
          // customer wants to update the product quantity in their shopping cart
                
          case 'update_product' : for ($i=0$n=sizeof($HTTP_POST_VARS['products_id']); $i<$n$i++) {
                                          if (
          in_array($HTTP_POST_VARS['products_id'][$i], 
          (
          is_array($HTTP_POST_VARS['cart_delete']) ? $HTTP_POST_VARS['cart_delete'] : array()))) {
                                            
          $cart->remove($HTTP_POST_VARS['products_id'][$i]);
                                          } else {
                                            if (
          PHP_VERSION 4) {
                                              
          // if PHP3, make correction for lack of multidimensional array.
                                              
          reset($HTTP_POST_VARS);
                                              while (list(
          $key$value) = each($HTTP_POST_VARS)) {
                                                if (
          is_array($value)) {
                                                  while (list(
          $key2$value2) = each($value)) {
                                                    if (
          ereg ("(.*)\]\[(.*)"$key2$var)) {
                                                      
          $id2[$var[1]][$var[2]] = $value2;
                                                    }
                                                  }
                                                }
                                              }
                                              
          $attributes = ($id2[$HTTP_POST_VARS['products_id']
          [
          $i]]) ? $id2[$HTTP_POST_VARS['products_id'][$i]] : '';
                                            } else {
                                              
          $attributes = ($HTTP_POST_VARS['id']
          [
          $HTTP_POST_VARS['products_id'][$i]]) ? $HTTP_POST_VARS['id']
          [
          $HTTP_POST_VARS['products_id'][$i]] : '';
                                            }
                                          
          $cart->add_cart($HTTP_POST_VARS['products_id'][$i], 
          $HTTP_POST_VARS['cart_quantity'][$i], $attributesfalse);
                                            
          $cart->size($_POST['cart_quantity_photo']);
                                          }
                                        }
                                        
          tep_redirect(tep_href_link($gototep_get_all_get_params($parameters)));
                                        break;

          aufruf, ist dieser hier

          PHP-Code:
          $cart->size($_POST['cart_quantity_photo']); 
          Vielen Dank, für die Hilfe...

          Kommentar


          • #6
            Sorry, ich verstehe es immernoch nicht. Du zeigst eine Seite an, darauf ändert der User irgendwelche Werte und schickt ab.

            Du verarbeitest du Änderungen. Wird der neue Zustand des Carts dauerhaft gespeichert?

            Nun gibst du die selbe Seite wieder aus. Dabei sollen die neuen Werte angezeigt werden. Das klappt nicht, stattdessen stehen wieder die alten da.

            Sofern das Speichern der Änderungen klappt, ist es ein reines Ausgabeproblem und sollte sich mit etwas Debugging selbst lösen lassen. Wenn schon das Speichern nicht funktioniert, dann zeig bitte den entsprechenden Code.

            Kommentar


            • #7
              Hallo,

              ich versuche es noch einmal zu erklären. Denn ein Ausgabe Problem, ist es auf keinen Fall!

              Die Seite, die die Function für das erstellen des array beinhaltet, wird includet, da dort auch andere Functionen drin sind, die beim Seiten Aufbau genutzt werden. Das Ändern, der Werte, funktioniert auch.

              Das aufrufen, der function, zum ändern der werte, innerhalb des arrays, funktioniert ja auch. Ich denke, das durch das include, der Datei, welche diese Function enthält die Function beim öffnen der Seite ein 2tes mal ausgeführt wird, wobei dann das array mit den geänderten Werten schon nicht mehr vorhanden ist. So werden an dieser Stelle natürlich wieder die Standardwerte der DB in das array geschrieben!

              So besser?

              Grüße und Dank

              P.S. es gibt keinen anderen Code!

              Kommentar


              • #8
                Kann wirklich keiner mehr dazu sagen?
                Ich vezweifel damit bald...

                Gruß

                Kommentar


                • #9
                  PHP-Code:
                  for ($i=0$n=sizeof($HTTP_POST_VARS['products_id']); $i<$n$i++) 
                  Diese Syntax kenn ich nicht bzw nur in C

                  Kommentar


                  • #10
                    Hallo, miximaxi

                    das funktioniert doch alles. Ich denke auch nicht, das der Fehler daran liegt. Denn bisher hat alles so funktioniert, wie es soll. Nur diese eine Funktion macht mir eben Probleme.

                    Vielen Dank, für deine Hilfe...

                    Kommentar


                    • #11
                      Original geschrieben von miximaxi
                      PHP-Code:
                      for ($i=0$n=sizeof($HTTP_POST_VARS['products_id']); $i<$n$i++) 
                      Diese Syntax kenn ich nicht bzw nur in C
                      Ist in php auch legaler code.

                      @OP
                      Ich versteh das problem ehrlich gesagt auch nicht. Könntest du mal pseudocode
                      schreiben der den ablauf den du willst veranschaulichst. Oder vll eine einfache statemachine ? Aber wirklich nur das wichtigste. Der ganze code dort oben ist extrem schlecht zu lesen und ohne die funktionen zu kennen die du verwendest, vermutet man immer dass die problem irgendwo anders liegen.

                      Hast du schon mal probiert, das problem minimal in einem separaten projekt zu lösen ?


                      greets
                      (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                      Kommentar


                      • #12
                        Die For-Schleife ist syntaktisch okay. In PHP geht da ähnlich oder sogar genauso viel wie in C.

                        Original geschrieben von SLSB02
                        Die Seite, die die Function für das erstellen des array beinhaltet, wird includet, da dort auch andere Functionen drin sind, die beim Seiten Aufbau genutzt werden. ... Ich denke, das durch das include, der Datei, welche diese Function enthält die Function beim öffnen der Seite ein 2tes mal ausgeführt wird ...
                        Beim Includen wird eine Funktion nicht automatisch ausgeführt, dazu muß sie schon explizit aufgerufen werden! Durchsuche deinen Code einfach mal nach dem Namen der Funktion, um alle Stellen zu finden, wo sie aufgerufen wird und überlege dir bei jeder Fundstelle, ob dieser Aufruf der eine "zuviel" sein kann.

                        Allerdings habe ich die Vermutung, dass es gar nicht daran liegt. Die Werte werden bestimmt anderswo "vernichtet", aber dein Code ist so komplex, dass du nicht mehr durchsteigst - merkwürdig, wenn es doch eigentlich nur ein Warenkorb ist.

                        Kommentar


                        • #13
                          Ich habe mit dem Komma-Operator Mühe, bzw. trotz Nachschauen nichts gefunden. Aber daran liegt es nicht, es geht tatsächlich im for, dh.
                          $a=1, $b=2; //geht nicht.
                          for ($a=3, $b=4;false;false); // geht.

                          muss wohl am übersichtlichen Chaos liegen.
                          Zuletzt geändert von miximaxi; 27.03.2006, 20:31.

                          Kommentar


                          • #14
                            Hallo, ich glaube der vorletzte Hinweis war der beste...
                            Ich werde das gleich mal prüfen und mich noch mal melden...

                            Gruß

                            Kommentar


                            • #15
                              Hallo,

                              also ein doppelter Aufruf der Function, kommt auch nicht in Frage...
                              Was könnte es denn noch sein? Also das array, aus der Funktion, wird nicht einmal mit neuen neuen Werten an eine andere Function übergeben.
                              Also so langsam, bin ich mit meinem Latein am Ende...

                              Aber woran kann es denn noch liegen... es sind doch im Grunde nur 3 Dateien, mit denen ich arbeite... Und diese Function, gibt es mit dieser Bezeichnung definitiv nicht nocheinmal... Ich habe nun einen vermutlich 2ten Aufrauf abgeändert und das array, bleibt immer noch mit den alten Daten vorhanden...

                              Gruß

                              Kommentar

                              Lädt...
                              X