GET Parameter Sortieren und in DB-Abfrage verwerten

Das ist noch viel einfacher
array_merge() fügt mehrere Arrays zusammen
PHP:
<?php 
//zu Testzwecken simuliertes $_GET
$_GET = array(
    'params1' => array("a", "b"),
    'params2' => array("c", "d"),
    'params3' => array("e", "f")
);

//Die Arrays zusammenfügen
$items = array_merge($_GET['params1'], $_GET['params2'], $_GET['params3']);

//Die Einträge mit ' umgeben array("a", "b") => array("'a'", "'b'") 
array_walk($items, create_function('&$item, $key', '$item = "\'{$item}\'";'));

//Liste für SQL erstelen
$in = implode(',', $items);
$where = "{$fieldName} IN ({$in})";

$sql = "SELECT * FROM my_table";

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

echo $sql;
?>
 
Hallo!!

Danke für die Hilfen aber ich glaube mittlerweile, dass mein Vorhaben so einfach nicht funktioniert.

Um das mal zu erklären: Ich habe mir einen Filter gebaut, die mit folgender Lösung übereinstiimt: http://www.tutorials.de/forum/relat...62440-mehrfach-auf-eine-spalte-zugreifen.html.

Ziel des ganzen ist aber nun eine erweiterte Suche per Auswahl, d.h. über Multiselcect-Felder sollen mehrere Eigenschaften anklickbar sein. Da reicht es ja nicht mehr aus, dass er alle Werte findet, sondern es muss ja differenziert werden.

Beispiel:

Kunde wählt:
1. Multiselect 1: Zeige mir alle Produkte, die z.B. Eigenschaften A&B aus Parameterarray 1 haben

2. Multiselect 2: Zeige alle Prodkute, die den gewählten Eigenschaften aus 1 entsprechen und zusätzlich z.B. Eigenschaften C&D aus Parameterarray 2 haben

3. Multiselect 3: Zeige alle Prodkute, die den gewählten Eigenschaften aus 1 und 2 entsprechen und z.B. Eigenschaften E&F&G aus Parameterarray 3 haben

usw.

Gibt es dafür eine Lösung?

Vielen Dank im Voraus.

Grüße

Michael Meyer
 
Sorry, ich versteh nicht was du meinst. Mach mal klare Beispiele.
Was du da schreibst, dazu brauchst du keine Multiselect, sondern Einzelselect.

Also, mach mal ein PrintScreen deiner Maske, zeig mal ein wenig Code, Zeig mal wies in der DB aussieht und zeig an einem Konkreten Beispiel was dabei herauskommen sollte.
 
Hallo!!

Ich versuche, es so gut wie möglich zu erklären:

HTML:
<select id="example" name="Farbe" multiple="multiple">
<option value="rot">Option 1</option>
<option value="gelb">Option 2</option>
<option value="grün">Option 3</option>
<option value="...">Option 4</option>
<option value="...">Option 5</option>
</select>

Also über mehrere Selectfelder, die wie oben aussehen, kommen die Werte rein. Per GET und das geht ja schonmal.

Nun zur Anwendung:

Bsp: Den Eimer gibt es in versch. Farben mit verschiedenen Durchmessern mit und ohne Deckel

Multiselect 1: Farbe: rot, gelb, grün

Multiselect 2: Durchmesser: 10, 20, 30, 40, 50

Multiselect 3: Deckel: ja, nein

Wenn jemand rot und gelb anklickt und 10 und 20 sollen alle roten und gelben mit jeweils einem Durchmesser von 10 und 20 angezeigt werden. Klickt jemand dann noch ohne Deckel an, dann bitte alle die rot und gelb sind, einen Durchmesser von 10 und 20 ohne Deckel anzeigen.


Die Abfrage erfolgt im Moment so (genau wie in Deinem Beispiel):

PHP:
SELECT *
FROM table1
WHERE id IN (SELECT
    objectid
FROM
    (
        -- Die objectid Gruppieren
        SELECT
            objectid,
            -- Alle obetvalues zu einer Liste mit Komma getrennt zusammenführen
            GROUP_CONCAT(DISTINCT objektvalue SEPARATOR ',') AS ovalues
        FROM
            objekt
        GROUP BY objectid
    ) AS dat
WHERE
     -- Pro gesuchter Wert hier eine Bedinung mit FIND_IN_SET anwenden
    FIND_IN_SET('1', ovalues)
    AND FIND_IN_SET('3', ovalues);)

Wenn ich jetzt nur einfach alle gewählten Array-Werte hinzufüge, sucht er ja nur das raus, was wirklich alle Werte hat und das kann ja nicht funktionieren.

Ich hoffe, es ist nun deutlicher.

Vielen Dank im Voraus.

Grüße

Michael Meyer
 
Muss man nicht "einfach" zwischen den Einzelwerten eines Parameter-Arrays ein "OR" schreiben und zwischen den Arrays selbst ein "AND" ?

Also so. Zeige mir alle Werte mit rot ODER gelb UND mit den Durchmessern 10 ODER 20 UND ohne Deckel ?
 
Zuletzt bearbeitet:
Also so scheint es zu funktionieren. Ich muss nun nur zwischen den Parametern eines Arrays (also z.B. Multiselect 1) ein OR und an der Grenze zum nächsten Array (also wo die Werte von Multiselect 2 anfangen) ein AND schreiben.
 
Guten Morgen,

also es funktioniert noch nicht ganz, weil die Ausgabe etwas anders gestaltet sein muss, nämlich:

Jeder Wert des ersten Arrays muss mit jedem Wert des nächsten Arrays verknüpft werden:

Array
(
[0] => Array(
[0] => rot
[1] => gelb
[2] => grün
)

[1] => Array(
[0] => 10
[1] => 20
[2] => 30
)

[2] => Array(
[0] => mit Deckel
[1] => ohne Deckel
)

)

Jetzt muss ich jedes Element des Array[0] mit jedem Element des Array[1], sowie des Array[2] und Array[3] usw.

Beispielsweise:
rot 10 ohne Deckel
rot 10 mit Deckel
rot 20 ohne Deckel
rot 20 mit Deckel
rot 30 ohne Deckel,
rot 30 mit Deckel
gelb 10 ohne Deckel
gelb 10 mit Deckel
gelb 20 ohne Deckel
gelb 20 mit Deckel
gelb 30 ohne Deckel,
gelb 30 mit Deckel
grün 10 ohne Deckel
grün 10 mit Deckel
grün 20 ohne Deckel
grün 20 mit Deckel
grün 30 ohne Deckel,
grün 30 mit Deckel
... usw.

Zwischen den Werten einer Zeile muss ein AND und beim Sprung zur nächsten Zeile muss ein OR hin.

Gruß und Danke

Michael Meyer
 
Also nochmals.
Das ganze geht im Endeffekt um SQL.
Also, wie sieht die Tabellenstruktur aus?
 
Hallo

Tab. objekt
+----+------------+----------------+
| id | objectid | objektvalue |
+----+------------+----------------+
| 1 | -----x1-----| ------1-------- |
| 2 | -----x2-----| ------2-------- |
| 3 |----- x3------|------3-------- |
+----+------------+----------------+

In der Zeile objektvalue stehen die Werte rot, gelb, grün, 10,20,30,mit Deckel, ohne Deckel. Es sollen nun die objectids ermittelt werden, die alle die gewählten objektvalues haben. Hat das Produkt ein Value nicht, so fällt es weg. Mit der ermittelten objektid werden in einer 2 Tabelle die Produkte abgerufen.

Tab. objectwerte
+-----------+-----------------+----------------+
| objectid | objectname| objectmulti |
+-----------+-----------------+----------------+
| -----1--- |------ x1-------- | -----1--------- |
+----------+------------------+----------------+

Grüße & Danke

Michael Meyer
 
Zeile objektvalue?
Du schreibst also pro Objekt eine Zeile und in dem Feld Objektvalue werden alle Kommasepariert reingeschrieben?
Oder gibts da mehrere Zeilen pro Objekt?

Du solltest die Informationen weiter verfeinern.

So währe es optimal
Code:
objectid | valuetype | objectvalue
1 | farbe | rot
1 | farbe | gelb
1 | grösse | 10
1 | grösse | 20
1 | grösse | 30
1 | deckel | ja
1 | deckel | nein
2 | grösse | XL
2 | grösse | XXL

Dann kannst du auch sauber die Multiselct dem valuetype zuordnen und nachher ein saubers SQL machen
 
Zurück