Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Teil nur einmal ausführen?

Einklappen

Neue Werbung 2019

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

  • PHP Teil nur einmal ausführen?

    Ich habe eine Klasse zur Suche auf meiner Sete geschrieben und die Suche etc. funktioniert auch soweit aber ich will, das die Suche nur einmal, also beim ersten Aufruf der Seite ausgeführt wird und dann erst wieder, wenn die Seite verlassen und dann wieder betreten wurde. Soweit ich weiß, könnte man das doch mit Singleton machen oder nicht?

    Das ist der GUI Teil:

    PHP-Code:
        $search Search::Instance($db);
        
        if(!
    Search::$isLoaded)
        {
            
    $entries $search->default($start);                   
        }  
        
        if(isset(
    $_POST["BtnSearch"]))
        {
            
    $entries $search->start($year$_POST["Search"], $_POST["Criteria"], $_POST["sorting"], $start);   
        } 
    Die Search Klasse:
    PHP-Code:
        final class Search
        
    {        
            private 
    $db;   
            private 
    $entries;
            
            public static 
    $isLoaded false;

            public static function 
    Instance($db)
            {
                static 
    $inst null;
                if (
    $inst === null) {
                    
    $inst = new Search($db);
                }
                return 
    $inst;
            }
            
            private function 
    __construct($db)
            {
                
    $entries = array();
                
                
    $this->db $db;
                return;
            }
        
            public function default(
    $start)
            {
                try
                {      
                    
    $query $this->dbz->prepare('......');                  
                    
                    
    $query->execute();
                    
    $this->entries $query->fetchAll();
                                       
                    
    Self::$isLoaded true;     
                }
                catch(
    PDOException $e)
                {
                    echo 
    '<p>An PDO Error occured!</p>' $e;
                }
                
                return 
    $this->entries;
            }
            
            public function 
    start($year$searchText$criteria$sortOrder$start)
            {      
                try
                {           
                    
    $buildQuery "....";
                    
                    
    $buildQuery = ($buildQuery $this->buildQuery($searchText$criteria));                             
                    
                    
    $query->execute();
                    
    $this->entries $query->fetchAll();          
                }
                catch(
    PDOException $e)
                {
                    echo 
    '<p>An PDO Error occured!</p>' $e;
                }
                
                return 
    $this->entries;
            }
        } 
    db ist ein PDO Object, das sollte ja aber auch denke ich, wohl klar sein. Die anderen $_POST Werte werden alle übergeben und daraus wird dann mit der buildQuery Funktion eine Query zusammengebastelt aber das funktioniert ja wie gesagt alles schon, von daher habe ich die Query auch mal leer gelassen. Das Problem ist ja, das $isLoaded einfach immer false ist aber wieso? Sollte das nicht so funktionieren?

  • #2
    auch wenn ich da nicht durchblicke, und auch nicht verstehe was du mit
    also beim ersten Aufruf der Seite ausgeführt wird
    meinst, denn jeder Seitenaufruf ist ja eine komplett neuer Request, der code
    PHP-Code:
                static $inst null;
                if (
    $inst === null) {
                    
    $inst = new Search($db);
                } 
    scheint mir doch immer eine new Search() zu machen.

    Kommentar


    • #3
      Verstehe ich nicht ganz, wenn ich ehrlich bin.
      Bei jedem neuen Seitenaufruf werden doch auch alle Scripte neu geladen.
      Singleton bedeutet ja nur, daß nur eine Instanz des Objektes im aktuellen Scope erzeugt werden kann.
      Ein neues Laden der Seite ist automatisch auch ein neuer Scope, also sehe ich da nicht so den Sinn drin Singleton verwenden zu wollen.

      Kann aber auch daran liegen, daß ich Dein Problem grad nicht wirklich verstehe, sorry.

      EDIT: moma war schneller, meint aber das gleiche

      Kommentar


      • #4
        Zitat von Arne Drews Beitrag anzeigen
        EDIT: moma war schneller, meint aber das gleiche
        Du habst nu mehr geschrieben Arne
        Aber mal ne Frage, der zitierte Code Singelton hin oder her, erzeugt doch immer ein neues Object, da $inst ja gleich null gesetzt wird, vor dem Test;
        oder irre ich (kenn ja keine Singeltons).

        Kommentar


        • #5
          Ja, ist aber auch ein wenig schwer zu erklären. Wenn man die Seite betritt, dann soll ebend direkt die default Funktion in der Search Klasse ausgeführt werden aber das soll ebend nur einmal passieren. Da ich da auch mit einer Seitennavigation arbeite habe ich immer das Problem, das er dann bei den nächsten Seiten immer wieder die default Suche ausführt, anstatt die neuen Einträge zu laden.

          Deswegen muss ich es jetzt hinkriegen, das dann beim betreten der nächsten Seite nicht noch einmal die default Suche ausgeführt wird, sondern ebend die eigene Suche (start). Wie kann ich das also speichern, wenn bspw. die nächste Seite betreten wird? Mir fällt da einfach grade gar nichts mehr ein. Das Problem beschäftigt mich schon eine Weile.

          Kommentar


          • #6
            Schon mal sessions angeschaut?
            und nebenbei:
            . Wenn man die Seite betritt, (...)
            mit request und response ist einfacher.
            Beim ersten Request (am tag/im jahr/ überhaupüt ?), soll .....

            Kommentar


            • #7
              das er dann bei den nächsten Seiten immer wieder die default Suche ausführt, anstatt die neuen Einträge zu laden.
              Naja, neue Seite bedeutet ja neue HTTP-Anforderung, nehme ich mal an? Dann ist doch klar.
              Dann müsstest Du Dir das über eine Session merken.

              Obwohl, wenn die nächste Seite auf Parametern basiert, hast Du die doch. Wie übergibst Du die denn?
              Deren Existenz müsstest Du in die Bedingung für eine Default-Suche mit berücksichtigen!

              Zitat von moma
              Aber mal ne Frage, der zitierte Code Singelton hin oder her, erzeugt doch immer ein neues Object, da $inst ja gleich null gesetzt wird, vor dem Test;
              oder irre ich
              Da hast Du recht. Ich hatte mir seinen Code nicht angesehen. $inst = null ist da natürlich absolut fail.

              Kommentar


              • #8
                Naja, dann würde das ja mit dem Singleton sowieso nicht funktionieren, da ja auch die Skripte neugeladen werden oder nicht? $inst = null hin oder her, das spielt ja dann auch keine Rolle mehr.
                Ich frage ja mit
                PHP-Code:
                .... LIMIT :start10 ...
                $query->bindParam(':year'$year);
                $query->bindParam(':start'$startPDO::PARAM_INT); 
                nur die 10 nächsten (oder ersten) Datensätze ab. Jetzt sehe ich auch übrigens mein Problem. Daher ja bei einem Klick auf weiter (oder gehe zur Seite x) auch nicht mehr dieser Zweig ausgeführt wird, sind ja auch die Daten weg (die ganzen $_POST Werte). Wie könnte man denn da jetzt rangehen? Dann müsste ich ja die eingegeben Daten speichern oder nicht?
                PHP-Code:
                if(isset($_POST["BtnSearch"]))
                {
                    
                $entries $search->start($year$_POST["Search"], $_POST["Criteria"], $_POST["sorting"], $start);  



                Die seite überprüfe ich immer so mit
                PHP-Code:
                $site = (isset($_GET["page"]) and (int)$_GET["page"] > 0) ? (int)$_GET["page"] : 1
                und dann übergebe ich die oben mit in der URL.

                Wie könnte man denn da jetzt vorgehen? Ich kann ja schlecht alles oben in der URL mit übergeben oder ähnliches. Mir fällt da grade absolut keine Möglichkeit ein. Jetzt sehe ich zwar meinen Fehler aber ich weiß nicht, wie ich das jett richtigstellen könnte.

                Kommentar


                • #9
                  Zitat von Arne Drews
                  Dann müsstest Du Dir das über eine Session merken.

                  Kommentar


                  • #10
                    Zitat von Ironid
                    Naja, dann würde das ja mit dem Singleton sowieso nicht funktionieren, da ja auch die Skripte neugeladen werden oder nicht?
                    Genau so ist es, jeder Request beginnt bei wieder bei 0 / ganz von vorne.

                    Zitat von Arne Drews
                    Dann müsstest Du Dir das über eine Session merken.

                    Kommentar


                    • #11
                      Sorry, aber jetzt komme ich grade nicht mit. Ihr meint alsom, das ich mir in eienr Session mit einem Boolean Wert merken soll, ob die Suche schon ausgeführt wurde oder nicht? Jetzt ist ja dann aber ja auch noch das Problem, das dann ja die ganzen Suchparameter auch weg wären oder nicht? Könnt ihr mir da mal ein Beispiel geben oder wie man das dann macht? Ich komme grad echt nicht mehr mit.

                      Kommentar


                      • #12
                        Die erforderlichen Daten, die Du benötigst, speicherst Du in der Session, nicht nur einen Boolean.
                        Eine Session bietet ein globales Array $_SESSION, darin kannst Du Daten aufbewahren, wie in jedem anderen Array auch. Nur eben, daß Sessions Request-übergreifend funktionieren.

                        Kommentar

                        Lädt...
                        X