SQL-Suchabfrage verfeinern

son gohan

Erfahrenes Mitglied
Hallo Forum,

ich habe eine kleine Datenbanksuche mit PHP gebaut.

Gesucht wird einfach mit
PHP:
SELECT * FROM `$tabelle` WHERE `name` LIKE '%$such%'
die Variable $such wird aus einem POST Array geholt.

Leider bringt diese Art der Suche nur schlechte Ergebnisse und ich würde die Suche gerne etwas verfeinern.

Ich dachte z.B. daran noch eine weitere Spalte in die Suchabfrage einzubauen, sowas:
PHP:
SELECT * FROM `$tabelle` WHERE `name` LIKE '%$such%' OR WHERE `beschr` LIKE '%$such%'
aber das klapt nicht.

Hat jemand von euch mal einen guten Rat zu Hand wie man die Suche besser bauen könnte? :)
 
Was hälst du davon einen Suchbutton reinzustellen und dazu 2 submit Button.

Sodass du genaue und ähnliche ergebnisse abfragen kannst.

Code:
// Ähnliche Ergebnisse suchen
	if($aehnlich)
	{
	$result = mysql_query("SELECT Vorname,Name
			FROM webusers
			WHERE Name LIKE '%$such%' OR Vorname LIKE '%$such%'");
	}
	// nur treffende Ergebnisse
	else
	{
	$result = mysql_query("SELECT Vorname,Name
			 FROM Tabelle
			WHERE Name = '$such' OR Vorname = '$such'");
	}
 
Das ist schon eine gute Idee die Suche zu verfeinern, aber ich wollte sie so bauen das auch nur ähnliche Wörter mit gefunden werden, weniger ist manchmal mehr, zu viel Funktionen sind nur erschreckend.

Übrigens, die Syntax
PHP:
SELECT Vorname,Name
			FROM webusers
			WHERE Name LIKE '%$such%' OR Vorname LIKE '%$such%'
wie du sie geschrieben hast ist korrekt, ich hatte nur einen Fehler in meiner eigenen Abfrage vorher, jetzt sucht meine Suche auch nach ähnlichen Wörtern in einer zweiten Spalte, das sollte mir dann auch reichen, vielen Dank an dich. :)
 
Gerne gemacht ;)

Ich habe nicht so auf Fehler geachtet, dachte du wolltest das noch vergrößern, aber nun ja so hat es sich dann ja auch erledigt....
 
Hi.

Ich habe ein ähnliches Problem mit einem Script.

Wenn ich etwas suche und es nicht genau gefunden wird aber es mehrere Ähnlichkeiten gibt, zeigt er mir immer nur den ersten treffer. Wie kann ich machen das er mir sagt wieviele treffer er gefunden hat und sie mir alle nach der reihe anzeigt?

Danke.
 
Ein kleiner Hinweis am Rande: wenn sowas wirklich in einer Homepage eingesetzt wird, sollte man nie Daten unkontrolliert aus $_POST, $_GET usw. an die DB übergeben. Am besten immer quoten . Bei mysql: mysql_real_escape_string()
 
Hi.
@ christoph. ich will es nicht auf einer homepage einsetzten. Ich möchte ein "teile-such-programm" schreiben. Man tippt die teilenummer ein und es erscheint preis, lagerfach und so weiter. Warum ich das auf php/mysql mache? Wir haben etwa 600000 teile und eine mysql datenbank ist schön schnell.

Hier kommt mein code:
PHP:
$abfrage_artikel="SELECT * FROM alle  WHERE artnummer LIKE '%$artikel%' ";
$ergebnis_artikel = mysql_query($abfrage_artikel) or die ("Anfrage Artikel nicht erfolgt. Warum?");
$adr_nummer = mysql_fetch_array($ergebnis_artikel);


		echo $adr_nummer["artnummer"];
		echo "<br>";
		echo $adr_nummer["bezeichnung"];
		echo "<br>";
		echo $adr_nummer["n_nummer"];
                 }

vielleicht ein bischen umständlcih aber ich mag es so und es super. Klar habe ich noch keine Formatierung aber das kommt noch, ich will nur mal die grundfunktionen haben bevor ich mich an das design mache.
Ich hoffe ihr könnt was damit anfangen.

P.S: Wieso geht bei mir die Email-benachrichtigung nicht bei antwort
 
Ah ok, wollt ihr dann über den Browser auf einen zentralen Server zugreifen oder warum PHP? Gut, geht mich nichts an. ;)
Zum eigentlichen Code: an und für sich finde ich bis dato daran nichts umständlich. Freilich geht es in weniger Zeilen, aber auf die Lesbarkeit ist ein Gütekriterium eines Programms.
Allerdings ist mir den Query nicht ganz klar. IMHO macht es keinen Sinn, nach einem Teil einer Artikelnummer zu suchen. Gebe ich in deinem Beispiel 2 ein, werden alle Artikel gefunden, die eine 2 beinhalten. Das dürfte eine Ergebnismenge liefern, die keinen praktischen Wert mehr hat. Soll die Möglichkeit bestehen, nach dem Anfang einer Artikelnummer zu suchen (z.B. wenn alle Softwaresachen mit 1, alle Hardware mit 2 usw. beginnen), was je nach interner Logik mehr Sinn macht, muss wenigstens das vordere % weg. Das hätte dann auch den schönen Nebeneffekt, dass die Suche um einiges schneller läuft (bei 600000 Teilen durchaus relevant), weil der Index herangezogen wird. Artikelnr ist ja wohl Primärschlüssel.
 
Hallo!

Die Ausgabe gehört in eine while() Schleife.
Die Anzahl der Treffer bekommst Du in dem Du mysql_num_rows() auf Dein Query ansetzt.

PHP:
$abfrage_artikel="SELECT * FROM alle WHERE artnummer LIKE '%$artikel%' "; 
$ergebnis_artikel = mysql_query($abfrage_artikel) or die ("Anfrage Artikel nicht erfolgt. Warum?"); 
$treffer = mysql_num_rows($ergebnis_artikel);
 
echo "Es wurden ".$treffer." Artikel gefunden.";
 
while($adr_nummer = mysql_fetch_array($ergebnis_artikel)) {
     echo $adr_nummer["artnummer"]; 
     echo "<br>"; 
     echo $adr_nummer["bezeichnung"]; 
     echo "<br>"; 
     echo $adr_nummer["n_nummer"]; 
}
 

Neue Beiträge

Zurück