Datenbank dynamsch mit Array durchsuchen

Jan Schattling

Grünschnabel
Hallo.
Ich habe ein Problem.
Ich habe eine Datenbank mit Büchern.
Nun möchte ich den Usern die Möglichkeit geben nach den Titeln zu suchen.
Allerdings soll die Suche sich nicht vollständig so in der Datenbank befinden müssen.
Bedeutet:
Der User will das Buch "Der Herr der Ringe".
Er kann den Titel so eingeben, aber auch nur "Herr der Ringe", oder "Herr" wobei ihm dann alle einträge mit dem Wort "Herr" im Titel angezeigt werden, also auch z.B. "Herr der Fliegen".

Dies wollte ich mit einem Array lösen, aber scheinbar funktioniert das nicht.
Ich bekomme zwar keine Fehlermeldung, aber auch kein Ergebnis. Nicht einmal, wenn ich den Suchbegriff so schreibe wie in der Datenbank.

PHP:
$Suche = $HTTP_POST_VARS["Suche"];
$search = explode(" ",$Suche);
include ("config.php");
include ("connect.php");
$abfrage = "SELECT * FROM bibliothek_1 WHERE Titel LIKE '[%$search%]' ORDER BY 'Titel' ASC";
$result=mysql_query($abfrage) or die(mysql_error());
while($row = mysql_fetch_object($result))
{
	echo "<tr><td><div align='center'><font face='Verdana, Arial, Helvetica, sans-serif' size='2'> <a href='anzeige.php?ID=$row->ID'>$row->Titel</a> </font></div></td></tr>";
}

Die $abfrage scheint in ordnung zu sein. (Darum habe ich das hier auch nicht in Mysql gestellt.) Aber was stimmt im ganzen nicht?
Kann mir bitte jemand helfen?


Jan

P.S.: Ein entfernen der [Klammern] oder %Prozentzeichen% hat mir nichts gebracht.
 
Also die [] müsstest Du normalerweise weglassen können.
Und was das suchen betrifft, mach doch mal ein echo $abfrage, das zeigt Dir an, wie das select Statement aussieht, welches Du absetzt.
Ich vermute, dass das Problem darin liegt, dass Du mit explode() $Suche zerlegst, aber nur nach $search suchst. Setzt mal $Suche in das select Statement anstelle von $search ein und schau, was passiert (siehst Du anhand des echo).

redlama
 
Also ich habe jetzt den Code folgendermaßen angepasst:

PHP:
$Suche = $HTTP_POST_VARS["Suche"];
$Suche = explode(" ",$Suche);
include ("config.php");
include ("connect.php");
$abfrage = "SELECT * FROM bibliothek_1 WHERE Titel LIKE '%$Suche%' ORDER BY Titel ASC";
$result=mysql_query($abfrage) or die(mysql_error());
echo $abfrage;

Als ergebnis bekomme ich bei echo $abfrage:

SELECT * FROM bibliothek_1 WHERE Titel LIKE '%Array%' ORDER BY Titel ASC


Jan
 
Mach mal bitte aus
PHP:
$Suche = explode(" ",$Suche);
folgendes:
PHP:
//$Suche = explode(" ",$Suche);
Damit ist es auf Kommentar gesetzt und wird von PHP nicht mehr augewertet.
Was kommt dabei raus?

redlama
 
Wenn ich es auf Kommentar setzte kommt beim Echo:

SELECT * FROM bibliothek_1 WHERE Titel LIKE '%The Lord%' ORDER BY Titel ASC

... also meine Sucheingabe raus.

Und seltsamer weise gibt er nun, obwohl das explode weg ist die Korrekte suche aus.
Ich bekomme also bei "Herr" alle ergebnisse mit "Herr".
Danke.

Kannst du mir jetzt noch erklähren warum ich kein explode brauche? Reichen die %% aus?


Jan
 
[phpf]explode[/phpf] zerlegt einen String anhand eines Trennzeichens in ein Array. Ich weiß nicht, warum du den Suchstring in ein Array zerlegen wollest. Wo liegt da der Sinn?
 
Nu ja... ich dachte, das explode die richtige option ist um eine variable in ihre teile aufzuspalten und dann nach den einzelnen Teilen zu suchen.


Jan
 
Hallo,

also ich hatte das gleiche Problem wie du, hab es aber lösen können.

Du wandelst ja den String in einen Array per explode um.

Das ist soweit richtig. Ein Array wird ja automatisch hochgezählt, also ARRAY[0] - ARRAY[1] usw.

Jedes Wort würde dann einen eigenen Array Wert bekommen.

Du musst nun das Array dazu bewegen, das dieses in der Suchabfrage jeweils erweitert wird.
PHP:
$abfrage = "SELECT * FROM bibliothek_1 WHERE ";

for ($i = 0; $i < count($Suche); $i++)
{
$abfrage .="Titel LIKE '%$Suche[$i]%' "; 
if($i<count($Suche)-1){ 
            $abfrage .= ' and '; 
        } 
	}
$abfrage .="ORDER BY Titel ASC";
Das müsste dir schon mal weiterhelfen ...

Wenn du sehen willst, was passiert dann gib mal einen var_dump($abfrage); auf deinen query ....


mfg Dream;
 
Ja das funktioniert auch.
Jetzt habe ich nur ein problem.
Scheinbar zerlegt er es zu stark.
Statt nach Wörtern sucht er nach buchstaben.
Das ist natürlich nicht so toll wenn er alles mit nem "e" ausgibt wenn man danach sucht.
Außerdem entstehen zum Beispiel bei "in" das Problem das er nach der Buchstabenkette "in" sucht und dann auch "Rings" ausgibt.
Was muß ich da noch ändern?


Jan
 
hmm also ich würde das so lösen.

Ich würde einfach die Anzahl der eingegeben Buchstaben begrenzen. Also das man mehr als 3 Buchstaben eingeben muss, um ein effektives Suchergebnis zu erhalten. Zudem ist da noch ein kleiner Fehler enthalten.

Du musst bei Explode explizit ein Array definiereren. Es reicht nicht aus, das du da nur $suche schreibst.

Mach daraus einfach mal $such_array bla ....

Vielleicht funktioniert das....

und per strlen kannst du ja die Anzahl der Buchstaben auslesen und diese dann zurück geben wenn es zu wenig sind.

mfg Dream
 
Zurück