mrmonk
Goto Top

Abfrage so realisierbar ?

Hallo,

ich habe eine Frage zu folgender SQL Abfrage:

SELECT * FROM ex_articles WHERE subcategory = 'varSubcategory' OR region = 'varRegion' OR city = 'varCity'

Erreichen will ich folgendes

Auf meiner Website gibt es 3 Selectboxen in einem Formular.
Dieses werden per PHP mit Inhalten aus den jeweilgen Spalten einer MySQL Datenbank gefüllt.

Nun soll man die Möglichkeit haben durch Auswählen von Werten der 3 Selectboxen, die Datensätze zu filtern.

Wichtig ist, dass abhängig gefiltert wird, d.h. egal ob nur in einer Box ein Wert ausgwählt wird, in 2 oder in allen 3.

Leider komme ich mit meiner Abfrage oben nicht sonderlich weit. Einen Wert herauszufiltern ist nicht das Problem. Doch sobald ich einen zweiten Wert auswähle muss das Filterergebnis ja

Beispiel:

Selectbox 1: "Kategorie"
Selectbox 2: "Region"
Selectbox 3: "Ort"

Wenn ich jetzt in der Selectbox "Kategorie" den Wert "Sport" auswähle und in der Selectbox "Region" den Wert "NRW", dann sollen alle Artikel angezeigt werden, die sowohl der Kategorie "Sport" als AUCH in der Region "NRW" stattfinden. Das nicht ausgefüllte Feld "Ort" bleibt von der Filterung unberücksichtigt.

Wenn ich jedoch Werte in allen drei Boxen auswähle, dann müssen auch alle drei Felder in die Filterung eingebunden werden. Beim Filterergebnis müssen alle zwei bzw. drei Bedingungen exakt zutreffen. Die Übereinstimmung eines Wertes in nur einer Spalte reicht nicht aus.

Beispiel:
Wenn als Kategorie "Sport" ausgwählt wird, als Region "Hessen" und als Stadt "Frankfurt", dann darf das Ergebnis nur Werte ausgeben, die ALLEN 3 Bedinungen entsprechen. Ergebnisse die etwa nur beim Wert "Frankfurt" oder nur beim Wert "Hessen" eine Übereinstimmung liefern, müss´ten unberücksichtsigt bleiben.

Geht so etwas überhaupt `?

Hat jemand einen Verbesserungsvorschlag ?

Danke für jeden Tipp !

Grüße !!!

Content-Key: 89210

Url: https://administrator.de/contentid/89210

Printed on: April 25, 2024 at 15:04 o'clock

Member: bytecounter
bytecounter Jun 05, 2008 at 10:26:43 (UTC)
Goto Top
Hi,

die Abfrage würde ich mit PHP basteln:

<?php

Basis der Abfrage
$sql_query = "SELECT * FROM ex_articles WHERE";

if ($_GET['subcategory']) {
Füge das Feld 'subcategory' hinzu, wenn übermittelt
$sql_query .= " subcategory LIKE ".$_GET['subcategory']." AND";
}
if ($_GET['region ']) {
füge das Feld 'region' hinzu, wenn übermittelt
$sql_query .= " region LIKE ".$_GET['region']." AND";
}
if ($_GET['subcategory']) {
füge das Feld 'city' hinzu, wenn übermittelt
$sql_query .= " city LIKE ".$_GET['city']." AND";
}

// "Dummy", falls keine der obigen Felder übermittelt und Anzahl max. Ergebnisse
$sql_query .= " 1 LIMIT 0,50;"

?>

Das ist eine ungetestete und mal schnell geschriebene Lösung. Es gibt sicherlich auch bessere Ansätze.
Man sollte aber aus Performancegründen keine "SELECT *"-Abfrage verwenden, sondern immer die benötigten Felder explizit nennen.

vg
Bytecounter
Member: mrmonk
mrmonk Jun 05, 2008 at 13:58:31 (UTC)
Goto Top
Hallo,

erstmal besten Dank für die Hilfe !

Sorry, dass ich nochmal nachfrage, aber meine PHP Kenntnisse halten sich doch etwas in Grenzen.

Bisher sind die Auswahlfelder ja in einem Formular (GET) bei "Absenden" wird ja eine neue Seite aufgerufen auf der die gefilterten Ergebnisse dargestellt werden.

Wie und vorallem wo binde ich jetzt den PHP Code ein ?

Wäre nett, wenn ihr mich nochmal unterstützen könntet.

Besten Dank !!!!
Member: bytecounter
bytecounter Jun 05, 2008 at 14:17:04 (UTC)
Goto Top
Das Snippet muss natürlich in das Script, welches nach Absenden des Formulars ausgeführt wird.

Infos über Formulare und PHP findest Du im Web genügend..einfach mal googlen...
Member: mrmonk
mrmonk Jun 05, 2008 at 14:22:55 (UTC)
Goto Top
Ok, Danke.

Nachdem ich mich da jetzt mal ein bißchen selbst versucht habe, kommt folgendes dabei raus.
Allerdings werden immer alle Artikel angezeigt:

<?php require_once('Connections/conExpero.php'); ?>
<?php

$sql_query = "SELECT * FROM ex_articles WHERE";

if ($_GET['subcategory']) {

$sql_query .= " subcategory LIKE ".$_GET['subcategory']." AND";
}
if ($_GET['region ']) {

$sql_query .= " region LIKE ".$_GET['region']." AND";
}
if ($_GET['subcategory']) {

$sql_query .= " city LIKE ".$_GET['city']." AND";
}

// "Dummy", falls keine der obigen Felder übermittelt und Anzahl max. Ergebnisse
$sql_query .= " 1 LIMIT 0,50;"

?>


<?php
$varRegion_recErlebnis_detail = "0";
if (isset($_POST["region"] )) {
$varRegion_recErlebnis_detail = (get_magic_quotes_gpc()) ? $_POST["region"] : addslashes($_POST["region"] );
}
$varCity_recErlebnis_detail = "0";
if (isset($_POST["city"] )) {
$varCity_recErlebnis_detail = (get_magic_quotes_gpc()) ? $_POST["city"] : addslashes($_POST["city"] );
}
$varSubcategory_recErlebnis_detail = "0";
if (isset($_POST["subcategory"] )) {
$varSubcategory_recErlebnis_detail = (get_magic_quotes_gpc()) ? $_POST["subcategory"] : addslashes($_POST["subcategory"] );
}
mysql_select_db($database_conExpero, $conExpero);
$query_recErlebnis_detail = sprintf($sql_query, $varSubcategory_recErlebnis_detail,$varRegion_recErlebnis_detail,$varCity_recErlebnis_detail);
$recErlebnis_detail = mysql_query($query_recErlebnis_detail, $conExpero) or die(mysql_error());
$row_recErlebnis_detail = mysql_fetch_assoc($recErlebnis_detail);
$totalRows_recErlebnis_detail = mysql_num_rows($recErlebnis_detail);
?>

Was ist denn daran falsch ?
Member: bytecounter
bytecounter Jun 05, 2008 at 15:09:00 (UTC)
Goto Top
Ist auch kein Wunder...Du arbeitest mit POST, ich mit GET, daher kommt es zu folgender Abfrage:

SELECT * FROM ex_articles WHERE 1 LIMIT 0,50;

=> Alle Ergebnisse

Du kannst auch mit

echo $sql_query;

am Ende meines Scripts angucken, wie die Query ausschaut.