Filtern von MySQL Daten

Eurocid

Mitglied
Hallo erstmal

Ich stelle hier eine Frage die sicher schon zigmal gestellt wurde, leider hab ich in der Suchfunktion nichts hilfreiches finden können.

Ich habe eine Datenbank mit diversen Daten gefüllt, die standard mässig beim aufrufen der Seite komplett angezeigt wird. Nun habe ich seitlich zum filtern für jede Filtereigenschaft einen Link gesetzt.

-----------------------

Beispiel:

$query_land = mysql_query("SELECT DISTINCT land FROM shop ORDER BY id");
while ($land = mysql_fetch_array($query_land))
{
echo "<li><a href='shop.php?land=$land[0]'>$land[0]</a></li>";
}

if(isset($_GET[land]))
{
$shop_daten = mysql_query("SELECT * FROM shop WHERE land='$_GET[land]' ORDER BY id");
}

----------------------

Wenn ich jetzt auf den Link klicke, zeigt mir die Datenbank nur noch alle Einträge mit Land=bla , was ja so eh passt.

Jetzt zu meiner Frage, wie mache ich das am besten, wenn ich mehrere solcher filterungen habe? Da ja wenn ich jetzt auf einen anderen Filter klicke, der Filter nicht mehr weis das ich das Land schon ausgewählt habe?

PS: Ich suche keine fertige Lösung, ich brauche nur einen denkanstoss, da ich jetzt keine Ahnung habe wie ich da ran gehen soll. :(

Mfg
Cid
 
Hallo,

übergib einfache eine 2. $_GET mit sowas wie $_GET[func] und in die func schreibst du dann zb Filter 1. Dann kannst auf den jeweiligen Filter einfach verweisen.

LG

Michael
 
Hallo

Danke für deine anteilnahmen. :)
Also wenn ich das richtig verstehe, meinst du ich soll für jeden Filter eine $_GET Variable anlegen. Und genau da ist mein Problem, ich habe z.B. 6 Filtermöglichkeiten, jede für sich wird in eine andere $_GET Variable übergeben. Ich weiß jetzt aber leider nicht wie ich bei einem neuen Seiten aufbau (der ja passiert, wenn ich einen zweiten Filter auswähle), den ersten Filter mitnehmen soll, und dann das Ganze auch nocht, der MySQL Datenbank erklären soll.
 
wie kann man denn bei einem Link also a Tag mehrere Sachen auswählen?. Wie wäre es wenn du einfach ein Forumlar mit checkboxen machen würdest? Weiß ja leider nicht wie dein Aufbau da ist;)
 
Hab da vor einiger Zeit mal ein Beispiel mit $_POST geschrieben. Dies geht aber auch mit $_GET. Es ist mindestens ein Ansatz wie du das der DB beibringen kannst.

PHP/MySQL Einfacher SQL-Filter aus $_POST zusammenstellen

PHP:
    // Array initializieren. Falls kein argument angegeben wurde,
    // dann ist die Argumentliste ein leeres Array
    $wheres = array();
    //Jedes Feld prüfen und ggf in den Where-Array einfügen
    if($_GET['text1']) $wheres[] = "text1='{$_GET['text1']}'";
    if($_GET['text2']) $wheres[] = "text2='{$_GET['text2']}'";
    if($_GET['zahl3']) $wheres[] = "zahl3={$_GET['zahl3']}";

    // WHERE-Tel des SQL-String zusammenstellen
    if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $wheres);
    //SQL-String zusammensetzen
    $sql = "SELECT * FROM mytable {$wherestring}";
    //TODO: Sql an die DB absetzen
    echo $sql;
}


Für die Weitergabe der Links: Entweder arbeitest du mit Sessions oder aber du erweiterst bei jedem Klick den get.

Hier eine Methode wo du die Auswertung für die DB weiterverwenden kannst
PHP:
	//Ein Array mit vorgängig abgefüllten Variablen zusammensetzen
	foreach($wheres[] as $key => $value){
		$uriArray[] = "{$key}={$value}";
	}

	//Für jeden Key den uriArray um den neuen GET erweitern. $uriArray wird dabei nie verändert
	$uriArrayForLink4 = array_merge($uriArray[], array('link4=value4'));
	$uriArrayForLink5 = array_merge($uriArray[], array('link5=value5'));
	
	//Link 4 ausgeben
	echo 'site.php?'.implode('&', $uriArrayForLink4);

	//Link 5 ausgeben
	echo 'site.php?'.implode('&', $uriArrayForLink5);
 
Deine GET-Variable könnte auch dermaßen aussehen:
Code:
url.de/index.php?filter=land:germany,alter:20,zimmer:4
welche Du beim Entgegennehmen mit explode() in ein Array überführst und dann für die MySQL-Anweisung zusammenbaust. Nur macht so ein Aufbau in Verbindung mit einer Form und Checkboxen nicht soviel Sinn :D
PHP:
$list = $_GET['filter'];
$array = explode(",",$list);

$sql_Query="SELECT table WHERE ";

foreach($array as $entry)
{
  $temp = explode(":",$entry);
  $sql_Query .= $temp[0]."='".$temp[1]."' AND ";
}
$sql_Query = substr($sql_Query, 0, -4);

echo $sql_Query;

mfg chmee
 
Allerdings sind in yaslaw's und chmee's Code keine Sicherheitsvorkehrungen.
Aber du kannst ganz leicht alle Werte escapen lassen:
PHP:
foreach ($_GET as &$value)
{
  $value = mysql_real_escape_string($value);
}
Das funktioniert zumindest bei eindimensionalen Arrays.

Auf yaslaw's Seite steht deswegen auch:
In dieser Lösung sind keine Security-Relevanten Teile eingebaut. Der Code dient eher als Idee, wie man sowas umsetzen kann. Natürlich muss man noch mit input_filter() und mysql_escape_string() arbeiten....
 
Hallo erstmal

Danke für die Gedanken-Anstöße :)

Ich habe es jetzt mit SESSIONS gelöst, mein Ergebnis sieht so aus:


PHP:
if($_GET['typ']) {
$_SESSION['filter'][0] = "typ='{$_GET['typ']}'";
}
if($_GET['jahrgang']) {
$_SESSION['filter'][1] = "jahrgang='{$_GET['jahrgang']}'";
}
if($_GET['aktion']) {
$_SESSION['filter'][2] = "bemerkung1='{$_GET['aktion']}'";
}

usw...

$anzahl_filter = count($_SESSION['filter']);

for($i = 0; $i < $anzahl_filter; $i++)
    {
        $gesamt_filter[$i] =  $_SESSION['filter'][$i];
    }

if(count($gesamt_filter) > 0) $filter_query = " WHERE ".implode(' AND ', $gesamt_filter);
$sql = "SELECT * FROM shop $filter_query";

echo $sql;


@ ComFreek:
Danke für den Sicherheitshinweis, aber da ich fest vorgegeben Links definiere, sollte ich das nicht benötigen. Die Werte die die Links übergeben werden auch alle schon vorher von mir vergeben. Sollte also kein Schadhafter Queltext darin vorkommen. ;)

Da ich mit dem Filter noch nicht fertig bin, und euch möglicherweise noch einmal belästigen werde, schliesse ich das Thema noch nicht. :D

Trotzdem schon mal ein DANKE SCHÖN an alle beteiligten.
 
Hallo wiedermal, ich denke der Filter steht schon recht gut so wie er jetzt ist.
Darum schliesse ich dieses Thema.
Ich werde einfach ein neues Thema auf machen für die weiteren Fragen. :)
 
Zurück