Multiple Datenbank Abfrage

Tgutteck

Grünschnabel
Hallo,

als erstes Sorry wenn das Thema irgendwo schon beantwortet wurde und ich wohl nur zu blöd war die Antowrt zu finden.

Ok ich habe eigentlich keine Ahnung von SQL Datenbanken, aber ich habe ein problem und weiss nicht ob das so eigentlich lösbar ist.

Also ich habe eine Datenbank für eine Art Gastgeber für eine Ferienunterkunftseite.
Tabelle ist normal geliedert. es gibt eine Spalte Kategorie, wo dann enstprechend Hotel, Pension usw drinsteht.

Ich habe jetzt eine PHP Seite, ganz normales Formular wo der Suchende seine Eingaben machen kann, es werden 3 oder 4 Variablen abgefragt. Und die Variablen mit Get übergeben. Dort habe ich den Punkt kategorien wo er nach hotel Pension usw suchen kann.

Auf der nächsten Seite lese

ich so:
$auswahl_kategorie = $_GET[kategorie] ;
$auswahl_personen = $_GET[personen] ;
$auswahl_preislimit = $_GET[preislimit] ;
$auswahl_haustiere = $_GET[haustiere] ;
$auswahl_fruehstueck = $_GET[fruehstueck] ;

und lasse die Datenbank so durchsuchen und die Variablen umwandeln:

$anweisungid=mysql_query("SELECT *
FROM `gastgeber`
WHERE 1 AND `Kategorie`
LIKE '%$auswahl_kategorie' AND `Preis` <=$auswahl_preislimit AND `Personen` >=$auswahl_personen AND `Haustiere`
LIKE '%$auswahl_haustiere' AND `Fruehstueck`
LIKE '%$auswahl_fruehstueck' ORDER BY `Preis` ASC LIMIT 0 , 30 ");
while ($zeile=mysql_fetch_array($anweisungid)) {
$id=htmlspecialchars($zeile["ID"]);
$name=htmlspecialchars($zeile["Name"]);
$bild=htmlspecialchars($zeile["Bild"]);
$preis=htmlspecialchars($zeile["Preis"]);
$url=htmlspecialchars($zeile["Visitenkarte"]);
$personen=htmlspecialchars($zeile["Personen"]);

Das ganz klappt auch alles ohne Probleme. Nun möchte ich es dahingehend erweitern das er bei der Auswahl multiple arbeiten kann, d.h. bei der Auswahl der Kategorien kann er halt Pensionen und Hotel gleichzeitig auswählen.

Per get würde er mir ja dann den sting kategorien 2 mal übergeben zur Ausgabeseite, doch wie gestalte ich dann die Abfrage der Datenbank Ist es möglich eine mysql_query zu formulieren wo er die Spalte Kategorie in der Datenbank nach Pension und Hotel durchsucht?

Also wie gesagt ich beschäftige mich jetzt ganz kurz mit Datenbanken. Vielleicht geht das gar nicht

Hat jemand einen Tipp

Vielen Dank.

TGutteck
 
Hi, Wenn du die Kategorien, etc in einem Array speicherst, kannst du sie ebenfalls in der WHERE-Klausel nutzen. Du musst dann nur das LIKE durch IN ersetzen.

vereinfachtes Bsp.:
SELECT * FROM Tabelle WHERE Spalte IN (1, 2, 3, ...)

Anstatt der der Liste, die in den Klammern steht, kannst du im Php-Script auch dein Array setzen.

mfg
 
Hallo.

Danke für die schnelle Antwort, prinzipiell verstehe ich auch wie das meinst, leider weisst ich es technisch nicht so ganz umzusetzen.

Wie speichere ich die übergebenen Variablen in einem Array.

Theoretisch erfolgt der Aufruf der Ausgabeseite ja so:

......php?kategorie=pension?kategorie=hotel?.......

Wäre dann so das Auslesen richtig:

$auswahl_kategorie[] = $_GET[kategorie] ;

Danke Gruss

Thomas
 
Ok ich hab eben mal nachgedacht und festgestellt eigentlich müsste das ja müll sein was ich eben geschrieben habe.

Weil wenn ich per get variablen übergebe die den gleichen Name haben nimmt er immer den letzten wert!
Alos muss ich doch erstmal meine Auswahlseite verändern!
 
Du kannst die Variablen auch in einem Array übergeben:
<a href="./irgendwas.php?arr[]=1&amp;arr[]=2&amp;arr[]=3">
Im Formular:
<input type="text" name="arr[]" />
Im PHP-Code kannst Du mit [phpf]implode[/phpf] dann genau den String zusammenbauen, den Du für die Abfrage mit IN brauchst:
PHP:
$s=implode(',',$_GET['arr']);
$q="SELECT * FROM Tabelle WHERE Spalte IN (".$s.")";

Gruß hpvw
 
OK!

Aber irgendwo muss ich jetzt einen Fehler drin haben! Weil die einfache Abfrage klappt, aber wenn ich nach Pensionen und Ferienhäuser such hab ich kein Ergebnis:

So sieht es bis jetzt aus:

Hab inzwischen auf Post umgestellt.

<form name="form1" method="post" action="gastgeber2.php">
<select name="kategorie[]" type="text" multiple size="3" >
<option value="" selected>Beliebig</option>
<option value="Bauernhof">Bauerhof</option>
<option value="Pension">Pension</option>
<option value="Schloss">Schlo&szlig;/Gutshaus</option>
<option value="Hotel">Hotel</option>
<option value="Ferienhaus">Ferienhaus</option>
<option value="2rfewo">2 Raum Fewo</option>
<option value="3rfewo">3 Raum Fewo</option>
<option value="4rfewo">4 Raum fewo</option></select>

<input type="submit" name="Submit" value="Senden">

So auf der Ausgabenseite Gastgeber 2 lese ich wie folgt die Variablen aus:

$auswahl_kategorie = implode(',',$_POST['kategorie']);
$auswahl_personen = $_POST[personen] ;
$auswahl_preislimit = $_POST[preislimit] ;
$auswahl_haustiere = $_POST[haustiere] ;
$auswahl_fruehstueck = $_POST[fruehstueck] ;

und starte dann folgende Abfrage

mysql_query("SELECT *
FROM `gastgeber`
WHERE 1 AND `Kategorie`
IN ('$auswahl_kategorie') AND `Preis` <=$auswahl_preislimit AND `Personen` >=$auswahl_personen AND `Haustiere`
LIKE '%$auswahl_haustiere' AND `Fruehstueck`
LIKE '%$auswahl_fruehstueck' ORDER BY `Preis` ASC LIMIT 0 , 30 ")

Wenn ich nur 1 Kategorie anwähle klappt es wenn ich mehrere Anwähle erhalte ich eine Leere Seite!

Wenn ich es richtig Verstehe müsste er ja wenn ich Hotel und Pension auswähle und auch diese beiden begriffe übergebe eigenlich diese Anfrage stellen

mysql_query("SELECT *
FROM `gastgeber`
WHERE 1 AND `Kategorie`
IN ('Hotel,Pension') AND `Preis` <=$auswahl_preislimit AND `Personen` >=$auswahl_personen AND `Haustiere`
LIKE '%$auswahl_haustiere' AND `Fruehstueck`
LIKE '%$auswahl_fruehstueck' ORDER BY `Preis` ASC LIMIT 0 , 30 ")

Oder?

Gruss

Thomas
 
Ups, ich bin von einer normalisierten DB ausgegangen und habe nicht richtig gelesen.
Das hätte bedeutet, dass Du eine eigene Tabelle Kategorien hast und in der Kategoriespalte nur die ID aus dieser Tabelle stehen hast.
Du machst jedoch Stringvergleiche, daher muss jeder einzelne String in Anführungszeichen:
PHP:
$s="'".implode("','",$_POST['arr'])."'";

Gruß hpvw

PS: Bitte nutze die Code Tags, [ php ]code[ /php ] für PHP-Quelltexte, [ html ]code[ /html ] für HTML-Quelltexte und [ code ]code[ /code ] für sonstige Quelltexte, natürlich ohne die Leerzeichen. Das macht die Quelltexte übersichtlicher. Für kuze Code-Teile im Fließtext (z.B. Variablen- oder Funktionsnamen) kannst Du [ mono ]kurzer Code fetzen[ /mono ] verwenden.
 
Danke für den Tip wie ich die Code Tag einfügen soll! Wie oben schon mal beschrieben bin ich Anfänger dahingehend, deshalb solch ein Aufbau der Datenbank!

Aber es funktioniert und deshalb soll mein Dank dich ewig verfolgen! ;-)

Danke!

Gruss

Thomas
 
1 Frage habe ich noch!

Wie man bei meinen Select Auswahl oben sehen kann, gibt es auch die Auswahl beliebig, das heisst alle Kategorien sollen angezeigt werden!

Wie lösst man das am elegantesten in betracht der restlichen Lösung!
 
Ach ich hab eben mal nachgedacht und die Lösung selbst gefunden!

Einfach eine If Kontrolle zu dem Ausdruck und im Falle des einfach alle Begriffe rein!

Ach manchmal muss man nur selber nachdenken!
 

Neue Beiträge

Zurück