Suchformular verfeinern

ConSoleM

Grünschnabel
Hi. Ich hab mir ein Suchformular gebastelt, was drei Spalten einer Tabelle in einer MySQL Datendank durchsucht. Nun bin ich soweit, dass der User eine Eingabe machen kann und es werden die Daten angezeigt. Nun hätte ich aber gern, dass der User auch 2 Begriffe eingeben kann und es nur Datensätze angezeigt werden, wo beide Begriffe eine Übereinstimmung finden. Mein Problem: wenn ich per explode() die Eingabe auseinander nehme, funktioniert das ganze nicht, wenn der User z.B. den Straßennamen "An der Post" angibt, da dies ja 3 Strings wären und in der DB nirgends "Post" allein steht. Kann man evtl. eine Datenbank so durchsuchen, dass die Zeichenketten irgendwo mitten im Wort stehen? Geht das? Wenn ja, bitte helft mir.

Hier mal der bisherige Code meiner Datei:
Code:
<?php
$get = htmlspecialchars($_GET["SearchInput"]); //HIER KOMMT DER STRING
if(empty($get)){
	exit;
}

// mysql blabla
    define('MYSQL_HOST',     'localhost');
    define('MYSQL_USER',     '...);
    define('MYSQL_PASS',     '...');
    define('MYSQL_DATABASE', 'dbTest);

// mysql conntecten
	$connect = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die("Es konnte keine Verbindung zur Datenbank aufgebaut werden:".mysql_error());
    mysql_select_db(MYSQL_DATABASE) OR die("Es konnte keine Datenbank ausgeweahlt werden:".mysql_error());

$sql = "SELECT * FROM MH_Adressen GROUP BY strasse";
$result = mysql_query($sql, $connect);
echo "<ul>";
while($row = mysql_fetch_object($result)){
	$pattern = "/^".$get."/i";
		if(preg_match($pattern, $row->strasse) || preg_match($pattern, $row->ort) || preg_match($pattern, $row->ortsteil)){ //wenn Formulareingabe übereinstimmt, dann...
			echo "
			<li>
			<form method='get' action='tuewas.php' accept-charset='iso-8859-2'>
			<input type='hidden' value='".htmlentities($row->strasse)."' name='strasse'></input>
			<input type='hidden' value='".htmlentities($row->ortsteil)."' name='ortsteil'></input>
			<input type='hidden' value='".htmlentities($row->ort)."' name='ort'></input>
			<input type='submit' value='".htmlentities($row->strasse).", ";
			if($row->ort == $row->ortsteil || $row->ortsteil =="") 
				{
				echo htmlentities($row->ort);
				}
			else {
				echo htmlentities($row->ort)." (OT ".htmlentities($row->ortsteil).")";
				 }
			echo "'></input>
			</form></li>";
			
			} //if zu
	} //while zu	
	echo "</ul>";


?>
 
Du kannst die DB mit einer WHERE-Klausel durchsuchen:

Code:
$get = $_GET['SUCHSTRING'];
SELECT * FROM MH_Adressen WHERE strasse LIKE '%$get%' OR ort LIKE '%$get%' GROUP BY strasse
Die %-Zeichen haben die Bedeutung von Platzhaltern...

LG
Andy
 
Stimmt. Da hätte ich eigentlich auch selber drauf kommen können :rolleyes:

Danke vielmals. Werds probieren ob so dann auch geht, wenn ich mehrere Begriffe eingebe und den String explode. Aber sollte eigentlich gehn...
 
Du könntest zusätzlich die in den Kommentaren der strtok()-Funktion erwähnte tokenizeQuoted()-Funktion nutze, um dem Benutzer auch die Möglichkeit zu geben, Begriffe zu gruppieren. Des weiteren solltest du aber nicht vergessen, die Eingaben zu maskieren.
 
Habe eben noch auf MySQL.com was gelesen über Volltext-Suche in MySQL ab Version 5:
damit soll es möglich sein, Begriffe nach Relevanz auszuwerten etc:

Code:
SELECT * FROM tabelle WHERE MATCH(feld1,feld2,feld3...) AGAINST ('Zeichenkette')

LG
Andy
 
Korrekt! Daher fragte ich auch, welches Backend du verwendest. Vorraussetzung ist MyISAM.

Du musst deine Felder, die du durchsuchen willst, als FULLTEXT INDEX definieren. Dann brauchst du sowas wie Suchstring splitten nicht, und kannst sogar mit boolschen Operatoren in der Suche (bekannt von Google z.B.) wie das Minuszeichen für Negativ-Begriffe einsetzen.

Das erleichtert eine Sufu ungemeint ^^

Außerdem wollte ich noch Anmerken, das Volltext-Suche auch mit MySQL 4.1 funktioniert: http://dev.mysql.com/doc/refman/4.1/en/fulltext-search.html
 
Zurück