$_GET Parameter und Submit / Ideenfindung für eine Themensuche

godlike

Warp drölf
Veteran
Registriert
13 Juli 2013
Beiträge
14.290
Ort
Topkekistan
Joa, ich zermartere mir hier wieder etwas mein Hirn. Bin dabei eine Themensuche zu erstellen. Diese umfasst ~ 50 bis 60 Checkboxen. Funktioniert so weit auch alles. Mein Problem ist nun das oft, also je nach dem WAS der Nutzer auswählt, auch mal 200, 300 oder 400 Ergebnisse ausgespuckt werden. Diese möchte ich nun natürlich auf mehrere Seiten verteilen. Klappt so weit auch wenn ich NUR die Seitenanzahl über den Link übergebe.

Ich ermittle die Trefferanzahl per mysql_num_rows und lasse so unter den Ergebnissen, Links ausgeben, mit denen man zwischen den Seiten springen kann. Das sieht dann so aus:



[src=php]for($i = 1; $i <= $Seiten; $i++) {
echo "<a href=\"". $_SERVER['PHP_SELF']. "";
echo "?seite=".($i-1)*$ErgebnisseProSeite."";
if ($seite == (($i-1)*$ErgebnisseProSeite)) {
echo "\"><b>$i</b></a> ";
} else {
echo "\">$i</a> ";
}
}[/src]

Soweit klappt das auch super. Jetzt kommt aber das Problem mit den weiteren GET-Parametern. Diese sind ja dymamisch. Nun habe ich es mit folgendem versucht:

[src=php]foreach($_GET as $key => $value) {
echo "&".$key."=".$value;
}[/src]
Was für meine anderen Parameter super funktioniert, leider das "?seite", welches ich mir ja eher manuell rein zwinge, dann doppelt vor kommt. Und irgendwie stehe ich grad auf dem Schlauch wie ich das am dümmsten lösen könnte. Ich will ja keine ?seite=50&seite=200&var1=foo&var2=bar Links haben :dozey:

Wo haperts bei mir denn gerade?

Edit: Hab mir mal sowas gebaut. Vielleicht nicht gerade das schönste aber es funktioniert...

[src=php]foreach($_GET as $key => $value) {
$get_param = "&".$key."=".$value;
echo str_replace("&seite=".$value,"",$get_param);
}[/src]
 
Zuletzt bearbeitet:
Einfach: Alle Fragen in ein Dokument ausgeben und die Paginierung mit Java Script lösen und mit einmal posten.

Besser: Du erstellst eine Session und pusht per Ajax/Post die Antworten an den Server. Dort speicherst du sie. Dann gibst du den nächsten Satz an Fragen aus und wiederholst den Fortgang, bis alle Fragen beantwortet sind.
 
Was für meine anderen Parameter super funktioniert, leider das "?seite", welches ich mir ja eher manuell rein zwinge, dann doppelt vor kommt. Und irgendwie stehe ich grad auf dem Schlauch wie ich das am dümmsten lösen könnte. Ich will ja keine ?seite=50&seite=200&var1=foo&var2=bar Links haben :dozey:
Das könntest du leicht vermeiden, indem du vor deiner Schleife `seite` aus $_GET löschst:
PHP:
Expand Collapse Copy
unset($_GET['seite']);
Beachte auch, dass dein aktueller Code XSS-Schwachstellen aufreisst, da du sowohl Inhalte von $_GET als auch PHP_SELF ohne adäquate Maskierung im HTML-Kontext ausgibst. Nutze htmlspecialchars(), um das zu verhindern.

Wenn ich godlike richtig verstehe, möchte er nicht die Fragen auf mehrere Seiten verteilen, sondern eventuelle Suchergebnisse. Bei ~50 Checkboxen schiene mir eine Pagination auch noch wenig sinnvoll ...
 
  • Thread Starter Thread Starter
  • #4
Uh, das mit unset() ist natürlich um vieles besser :T Um XSS vorzubeugen werden im fertigen Script natürlich entsprechende $_GET-Inhalte maskiert.

Und ja, mir ging es weniger darum das ich die ganzen Checkboxen verteilen wollte, nur die Suchergebnisse, welche ich am Ende erhalte. Sprich ich grenze meinen Such-Query ein

[src=php]LIMIT ".$seite.", ".$ErgebnisseProSeite."";[/src]

und lasse mir dann am Ende Links ausgeben an die ich dann seite=0, seite=20, seite=40 anhängen lasse. Beim submit packt mir die foreach-Scheife dann aber immer noch ein zweites mal die "seite" an die URL. Das war das Problem :)

Vielen Dank an euch beide :T
 
Um XSS vorzubeugen werden im fertigen Script natürlich entsprechende $_GET-Inhalte maskiert.
Du weißt das sicher alles, aber nur für den Fall der Fälle: htmlspecialchars konvertiert keine einfachen Anführungszeichen, sofern du deine href Attribute mit ' umschließt, solltest du das ENT_QUOTES flag setzen. htmlspecialchars wandelt dir auch das & in & um. Und vergiss nicht auch ein urlencode über die Werte laufen zu lassen: $_GET ist decodiert for your convenience.

Für die for Schleife gibt es etwas eleganteres:

[src=php]$parameters = array('seite' => $seite));
$url = http_build_query(array_merge($_GET, $parameters));[/src]

1: schleift die alten Parameter durch, die nicht konsumiert (mit unset entfernt) wurden
2: neue Parameter lassen sich praktisch in einem Array sammeln
3: wenn die url erstellt wird, überschreiben die Neuen die Alten, jene sind aber noch im $_GET
4: http_build_query nimmt dir urlencode, & und = ab.

Vor dem Konsum validieren und bei der Ausgabe von $url noch kontextspezifisch escapen und fertig :T
 
  • Thread Starter Thread Starter
  • #6
Klappt schon mal super, danke auch dir Shodan. Dein Script ist wirklich eleganter :T

Nun hab ich aber noch ne Frage wenn ich schon dabei bin. Da es sich hier um so viele Checkboxen handelt habe ich diese nach Themen gruppiert und in Spoiler gepackt welche standardmäßig auf display:none; gesetzt sind. Sende ich mein Formular ab sind demnach auch alle Spoiler wieder geschlossen. Momentan "umgehe" ich das in dem ich per isset($checkboxvariable) abfrage ob im entsprechenden Spoiler Checkboxen aktiviert sind. Ist das der Fall bekommen diese ein display:block;. Gibt es da eine elegantere Methode? Sollte ich das per Ajax regeln?

Viele Grüße

godlike
 
Zurück
Oben