Günther S: Suchformular (mit POST) und Seiten-Blätterfunktion (mit GET)

Hallo zusammen,

ich habe auf meiner Website eine Suche, bei der die Suchbegriffe mit der  POST-Methode übermittelt werden und anhand derer wird dann eine MySQL-Datenbank durchsucht. Bei sehr vielen Suchergebnisse möchte ich die Ergebnisse auf Seiten aufteilen, meinetwegen 15 Ergebnisse pro Seite.
Nun möchte ich, dass man für die Blätterfunktion keinen Submit-Button drücken muss, sondern dass man mit einem simplen Klick auf die Seitenzahl zur gewünschten Seite gelangt (wie z.B. bei Google auch).
Ich hatte schon die Idee, die Suchbegriffe (es gibt mehrere Suchfelder) irgendwie in $_GET zu speichern, und diese an die Seitenzahl-Links anzuhaengen, so dass anhand dieser Variable nochmal dieselbe Suche laufen könnte und man dann einfach die nächsten paar Ergebnisse rauspickt.

Aber gibt es da nicht irgendeine elegantere Lösung?

Gruß,

Günther

  1. Hi Günther,

    Aber gibt es da nicht irgendeine elegantere Lösung?

    Klar, du könntest z.B. mit Sessions arbeiten - aber ob das wirklich eleganter ist? Ok, für den User gibt es nicht so viel Wirrwar in der URL zu sehen, trotzdem würde ich an dieser Stelle das Ganze (sofern es nicht die Länge einer URL sprengt!) per GET weitergeben:

    $link = $_SERVER['PHP_SELF'] . "?pagenumber=" . $page;  
    foreach($_POST as $key => $value)  
      $link .= "&" . $key . "=" . $value;  
    }
    

    Das geht allerdings in der Form wie oben nur solange du keine Arrays in $_POST hast.

    Du könntest aber auch noch um nicht sämtlichen "Müll" durchzuschleusen (also z.B. die Werte der Buttons) die benötigten Werte in dem Formular, was du per $_POST bekommst noch in ein Unterarray (z.B. search[]) packen und nur die darin enthaltenen Werte an die URL dranhängen.

    Na gut - vielleicht wären Session doch eleganten ;-)

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Crypt::PasswdMD5 jetzt auch in PHP
    Wissen ist gut, Können ist besser, aber das Beste und Interessanteste ist der Weg dahin! (Detlef G.)
    1. Hallo Dennis!

      $link = $_SERVER['PHP_SELF'] . "?pagenumber=" . $page;

      foreach($_POST as $key => $value)
        $link .= "&" . $key . "=" . $value;
      }

        
      genau an diese Loesung habe ich auch schon gedacht..  
      Die ganzen URLs in der Website werden zwar via mod\_rewrite als unterordner dargestellt (www.domain.de/suche/ für www.domain.de/suche.php), aber das ginge ja trotzdem indem ich dann einfach noch für jedes suchfeld die RewriteRules erweitern würde nach dem Prinzip "www.domain.de/suche/name/ort/beruf/" o.Ä. - das Problem dabei ist nur dass ich tatsächlich Arrays habe.  
        
      Also sind Sessions die einzige echt Lösung, oder?  
        
      Gruß,  
      Günther
      
      1. Hi Günther,

        Die ganzen URLs in der Website werden zwar via mod_rewrite als unterordner dargestellt (www.domain.de/suche/ für www.domain.de/suche.php), aber das ginge ja trotzdem indem ich dann einfach noch für jedes suchfeld die RewriteRules erweitern würde nach dem Prinzip "www.domain.de/suche/name/ort/beruf/" o.Ä.

        So kompliziert musst du es doch gar nicht machen - im zweiten Schritt hängst du die Daten einfach an /suche/ dran, also /suche/?foo=bar&wert=bla, dann kannst du das ganze einfach so umschreiben lassen:

        RewriteRule script.php /foobar.php [QSA]

        Durch das QSA (Query String append) wird der "Anhang" von script.php auch wieder an foobar.php angehängt, zusätzlich kannst du aber auch noch Parameter fest hinter foobar.php angeben, z.B. so:

        RewriteRule script.php /foobar.php?mode=redirected [QSA]

        Damit sollte schon einiges zu machen sein ...

        ... das Problem dabei ist nur dass ich tatsächlich Arrays habe.

        Was ja aber erst mal nicht gegen die Verwendung der obigen Methode spricht, zumindest nicht aus technischen Gründen. Und wenn du alle Parameter die weitergereicht werden müssen in ein Array packst, kannst du selbiges ja auch bequem anhängen per:

        foreach($_POST['array'] as $key => $value)

        Also sind Sessions die einzige echt Lösung, oder?

        Wenn die Daten serverseitig speichern willst und die Weitergabe nicht dem Clienten überlassen willst, dann bleibt dir keine andere Möglichkeit, als die Daten serverseitig zu speichern, womit du einen Session-Mechanismus hast.

        MfG, Dennis.

        1. Hi,

          Wenn die Daten serverseitig speichern willst und die Weitergabe nicht dem Clienten überlassen willst, dann bleibt dir keine andere Möglichkeit, als die Daten serverseitig zu speichern, womit du einen Session-Mechanismus hast.

          Ähm ... ja. Ich glaube, ich habe auch schon mal sinnvollere Sätze geschrieben ;-)

          Aber es dürfte klar sein, was gemeint ist: Wenn du die Daten irgendwie serverseitig speichern willst, hast du ja automatisch einen Session Mechanismus. Ob das jetzt PHP-Session sind oder etwas Selbstgebasteltes macht hierbei keinen Unterschied.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Crypt::PasswdMD5 jetzt auch in PHP
          Ich finde, der IE ist eine super Software. Nur eben nicht als Browser. (Manuel B.)
          1. Hallo Dennis,

            danke für deine schnelle Hilfe.
            Ich denke ich werde das mit den [QSA]-Flags mal probieren.

            Danke,
            Günther

  2. Hello,

    wenn Du Paramter über die URL übergibst, sollten die so vollständig sein, dass ein Bookmark auf eine derartig aufgerufene Seite auch wieder dieselben Ergebnisse liefert, sonst ist das ganze nicht benutzerfreundlich. Google ist dabei ein gutes Beispiel. Schau mal in Deine Logbücher die Referer an, die von Google kamen.

    Wenn Du keine Bookmark-Fähigkeit wünschst, dann mach es per Post.

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau