Seite 1 von 3

phpBB: In suche bei Buch Datenbank benutzung von AND/OR/NOT?

Verfasst: 05.08.2003 18:20
von KoSSo
Hi,
ich habe meinem phpBB eine kleine Buch Datenbank hinzugefügt diese Datenbank konnen die Benutzer über ein formular durchsuchen das Query für die Ausgabe der ergebnisse sieht so aus:

Code: Alles auswählen

$sql = "SELECT buch_titel, buch_preis, buch_kommentare
FROM phpbb_books
WHERE `$table_row` LIKE '%$search_keywords%'";
$table_row enthält die tabellenspalte in der gesucht werden soll und $search_keywords die stichwörter nach denen gesucht werden soll! Nun meine frage: Wie kann ich es den Usern ermöglichen das sie wie bei der phpBB-Suche AND/OR/NOT benutzen können?

Ich habe schon probiert vor dem Query das einzufügen:

Code: Alles auswählen

$split_search = array();
$split_search = split(' ', $search_keywords);
$current_match_type = 'or';

for($i = 0; $i < count($split_search); $i++)
			{
				switch ( $split_search[$i] )
				{
					case 'and':
						$current_match_type = 'and';
						break;

					case 'or':
						$current_match_type = 'or';
						break;

					case 'not':
						$current_match_type = 'not';
						break;

					default:
                  $current_match_type = 'and';
						break;
                                 }
}

$search_keywords = str_replace('*', '%', $split_search[$i]);
aber das funktioniert leider nicht :(

Ich wäre dankbar wenn mir da jemand weiterhelfen könnte :)

Grüße KoSSo

Verfasst: 05.08.2003 19:12
von Pyramide
Du kannst dir ja mal meine SearchToSQL-Funktion angucken: http://www.phpbb.de/viewtopic.php?p=172565#172565

Verfasst: 05.08.2003 19:49
von KoSSo
Danke aber so ganz verstehe ich nicht wie man das benutzt müsste ich das dann einfach nur so abändern und dann können die User AND/OR/NOT verwenden?:

Code: Alles auswählen

$sql = "SELECT buch_titel, buch_preis, buch_kommentare 
FROM phpbb_books 
WHERE " . SearchToSQL($search_keywords, array($table_row)) . ";
Grüße KoSSo

Verfasst: 05.08.2003 21:35
von Pyramide
Ja (das . " am Ende solltest du allerdings entfernen...)

Verfasst: 06.08.2003 01:13
von itst

Verfasst: 06.08.2003 15:59
von KoSSo
Hi,
und danke euch beiden :)

@Pyramide funktioniert wunderbar :) Aber eine frage noch, hier:

Code: Alles auswählen

//settings
	$like_exact_combine='OR';
	$like_fields_combine='OR';
	$exact_fields_combine='OR';
wird doch festgelegt das als standard suchmuster 'oder' verwendet wird also wenn ich z.b. kunst schule als suchwort habe sucht er nach Kunst OR schule wenn ich es nun so wie bei der phpBB Suche haben möchte das er dann als standard nach kunst AND schule sucht muss ich dann bei allen drei variablen das OR durch AND ersetzen?

Grüße KoSSo

BTW: Gibt es eigentlich auch eine möglichkeit das in 2 tabellenspalten gesucht wird z.b. statt in buch_titel oder buch_beschreibung in beiden?

Verfasst: 06.08.2003 17:56
von Pyramide
KoSSo hat geschrieben:BTW: Gibt es eigentlich auch eine möglichkeit das in 2 tabellenspalten gesucht wird z.b. statt in buch_titel oder buch_beschreibung in beiden?
Ja, einfach bei Parameter 2/3 mehr Elemente in das Array setzen. also z.B: SearchToSQL($search_keywords, array('feld1', 'feld2')). Und für diesen Fall sind auch die drei Variablen:
  • like_exact_combine bestimmt, wie der Suchstring der 'exact' Felder mit dem der 'like' Felder verbunden werden
  • like_fields_combine bestimmt, wie die Suchstrings der einzelnen 'like' Felder miteinander verbunden werden
  • exact_fields_combine bestimmt, wie die Suchstrings der einzelnen 'exact' Felder miteinander verbunden werden.
Wenn du z.B. like_fields_combine auf AND setzt, müssen die Suchbegriffe sowohl im Titel als auch in der Beschreibung vorkommen.

Wenn du die Suchstring-interne Standardoperation auf AND setzen willst, wird das schon etwas komplizierter. Du kannst zwar unter //state, wo die Variablen initialisiert werden, $is_and = false durch $is_and = true ersetzen; allerdings kannst du dann kein OR mehr verwenden, da OR als Standardoperation kein Zeichen (wie + für AND) hat und deshalb in TrimAndOr() komplett entfernt wird. Du könnst dir allerdings ein Zeichen ausdenken und dann den case '+'-Block kopieren (mit $is_and = false)

Verfasst: 06.08.2003 20:07
von KoSSo
Pyramide hat geschrieben:Ja, einfach bei Parameter 2/3 mehr Elemente in das Array setzen. also z.B: SearchToSQL($search_keywords, array('feld1', 'feld2')).
Hi,
danke aber das funktioniert leider nicht ich bekomme ne fehlermeldung. So sieht die WHERE Klausel aus der sql abfrage aus die vom debugger unter der fehlermeldung ausgegeben wird:

Code: Alles auswählen

WHERE ((Array LIKE '%test%'))
Grüße KoSSo

Verfasst: 06.08.2003 20:51
von Pyramide
Wie sieht denn dein Code jetzt aus?

Verfasst: 07.08.2003 12:40
von KoSSo
Wie vorher nur das $table_row jetzt so aussieht:

Code: Alles auswählen

$table_row = "'buch_titel','buch_beschreibung'";
statt so:

Code: Alles auswählen

$table_row = 'buch_beschreibung';
Ich muss es ja über diese variable machen da das ganze per formular übergeben wird ;)

Grüße KoSSo