GET Parameter Sortieren und in DB-Abfrage verwerten

querytail

Erfahrenes Mitglied
Hallo zusammen.

Ich arbeite mich gerade in die Materie ein und man verzeihe mir Laienhafte ausdrücke.

Also: Ich übertrage verschiedene Parameter per URL und nehme die Werte per GET entgegen, woraus dann eine Datenbankabfrage entsteht. Das funktioniert.


Jetzt habe ich meine Auswahl erweitert (Multiple Select) und übertrage mehrere Parameter mit gleichem Namen per URL und den Klammern [ ] zur Kennzeichnung als Array. Das funktioniert und ich kann die Werte mit
PHP:
print_r($_GET);
ausgeben.

Da die URL nicht nur Parameter enthält, muss ich bestimmen können, welche Parameter per GET entgegengenommen werden.

Mit
PHP:
foreach($_GET['parameter1'] AS $get_key => $get)
{
    echo 'value="'.$get.'">';
}
werden mir die Werte eines Parameter-Arrays ausgegeben.

Wie aber kann ich mehrere Parameter-Arrays aus der URL entnehmen, diese "entpacken" und in eine DB-Abfrage schreiben?

Vielen Dank im Voraus.

Grüße

Michael Meyer
 
Ich versteh deine Frage nicht.
item: Du kannst das was du da hast ja für jeden Parameter machen den du hast.
item: Wie sollen sie in der DB gespeichert werden? Pro Parameter eine Zeile in iner Tabelle?
item: In welcher Form willst du nachher die Parameter haben. 'entpacken' kann bedueten, dass du einen Kommaseparierten String haben willst, oder halt etwas anderes

Also, mehr Infos sind von nöten um dir zu helfen
 
Wenn ich dich richtig verstehe brauchst du 2 Schleifen. Eine für die Get Parameter und eine falls der Parameter ein array ist.
 
Hallo

Es soll nichts eingetragen, sondern nur Werte abgerufen werden. Insgesamt sind es 7 Multiselects und entsprechende Parameter-Arrays, die abgerufen werden können.

Die abzurufenden Parameter-Werte befinden sich alle in einer Spalte der DB.

Für die Datenbankabfrage, die mit den einfachen Selectfeldern ja schon funktioniert, ist es deshalb wichtig, dass die übergebenen Parameter-Werte aus den Parameter-Arrays "nach dem Entpacken" alle in ein Array geschrieben werden.

Nachtrag: Und es dürfen, wie geschrieben, nur bestimmte Parameter sein, weil die URL noch mehr enthält.

Vielen Dank im Voraus.

Grüße

Michael Meyer
 
Zuletzt bearbeitet:
Und wieso funktioniert meine Idee nicht?
Um nur die bestimmten Parameter zu erlauben, erstelle ein Array und nutze das als Whitelist, sprich du trägst alle erlaubten Get Parameter dort ein. In der ersten Schleife prüfst du dann ob der Parameter im Whitelistarray enthalten ist.
 
von einem Array in ein Array - ist aber nicht entpacken.

Also wenn ich dich richtig verstehe, hast du 7 Multiselects. Mit diesen wird ein Filter zusammengesetzt. Jedes Multiselect entspricht einer Spalte der Tabelle.

Um flexibel ein SQL zusammenzustellen hast du hier ien Beispiel
http://wiki.yaslaw.info/wikka/PhpVariableWhereSimple

Um zu prüfen, ob ein Wert einer Spalte einem Wert einer Liste enspricht gibts das schöne Wort IN
SQL:
WHERE spalte_1 IN (1, 2, 345)

Im Endeffekt könnte es etwa so ausehen (ein kleiner Testcode von mir
PHP:
<?php 
//zu Testzwecken simuliertes $_GET
$_GET = array(
    'params1' => array(1, 2),
    'params2' => array('a', 'b')
);

//Initialisieren des argumenten-Arrays
$args = array();


function whereListNumeric($fieldName, $array){
    $in = implode(',', $array);
    return "{$fieldName} IN ({$in})";
}
function whereListString($fieldName, $array){
    //Die Einträge mit ' umgeben array("a", "b") => array("'a'", "'b'")
    array_walk($array, create_function('&$item, $key', '$item = "\'{$item}\'";'));
    $in = implode(',', $array);
    return "{$fieldName} IN ({$in})";
}

//Für numerische Werte
if(isset($_GET['params1'])) $args[] = whereListNumeric('spalte_1', $_GET['params1']);
//Für Strings
if(isset($_GET['params2'])) $args[] = whereListString('spalte_2', $_GET['params2']);


$where = implode(' AND ', $args);

$sql = "SELECT * FROM my_table";

if(isset($where)) $sql = $sql." WHERE ".$where;

echo $sql;
?>
Ausgabe
SQL:
SELECT * FROM my_table WHERE spalte_1 IN (1,2) AND spalte_2 IN ('a','b')
 
Zuletzt bearbeitet von einem Moderator:
@timestamp:

Sorry, unsere erste Antwort kam ja zeitgleich. Aber ich wüßte jetzt nicht wirklich, wie es gehen soll. Ich habe es jetzt erstmal so, weiß aber nicht, wie ich aus den Einzelwerten wieder ein Array mache.

PHP:
foreach($_GET AS $get_key => $get)
{
    if(is_array($get))
    {
        foreach($get as $key => $value)
        {
            echo 'value="'.$value.'">';
        }
    }
    else
        echo 'value="'.$get.'">';
}
 
von einem Array in ein Array - ist aber nicht entpacken.

Also wenn ich dich richtig verstehe, hast du 7 Multiselects. Mit diesen wird ein Filter zusammengesetzt. Jedes Multiselect entspricht einer Spalte der Tabelle.

Um flexibel ein SQL zusammenzustellen hast du hier ien Beispiel
http://wiki.yaslaw.info/wikka/PhpVariableWhereSimple

Um zu prüfen, ob ein Wert einer Spalte einem Wert einer Liste enspricht gibts das schöne Wort IN
SQL:
WHERE spalte_1 IN (1, 2, 345)

Im Endeffekt könnte es etwa so ausehen (ein kleiner Testcode von mir
PHP:
<?php 
//zu Testzwecken simuliertes $_GET
$_GET = array(
    'params1' => array(1, 2),
    'params2' => array('a', 'b')
);

//Initialisieren des argumenten-Arrays
$args = array();


function whereListNumeric($fieldName, $array){
    $in = implode(',', $array);
    return "{$fieldName} IN ({$in})";
}
function whereListString($fieldName, $array){
    //Die Einträge mit ' umgeben array("a", "b") => array("'a'", "'b'")
    array_walk($array, create_function('&$item, $key', '$item = "\'{$item}\'";'));
    $in = implode(',', $array);
    return "{$fieldName} IN ({$in})";
}

//Für numerische Werte
if(isset($_GET['params1'])) $args[] = whereListNumeric('spalte_1', $_GET['params1']);
//Für Strings
if(isset($_GET['params2'])) $args[] = whereListString('spalte_2', $_GET['params2']);


$where = implode(' AND ', $args);

$sql = "SELECT * FROM my_table";

if(isset($where)) $sql = $sql." WHERE ".$where;

echo $sql;
?>
Ausgabe
SQL:
SELECT * FROM my_table WHERE spalte_1 IN (1,2) AND spalte_2 IN ('a','b')

WOW, dankeschön. Allerdings liegen die abzufragenen Values (von allen Multiselects) in einer Spalte.
 
Zuletzt bearbeitet von einem Moderator:
Hallo

Es handelt sich um char(255).

Wie schon geschrieben, wichtig wäre, dass die übertragenen Einzelwerte bestimmter Parameter-Arrays alle in ein neues Array geschrieben werden.

Vielen Dank im Voraus.

Grüße

Michael Meyer
 
Zurück