If Abfrage: Ähnlich

Ich habe folgendes Problem:
Ich habe eine Suchmaschine mit PHP programmiert, die Datensätze aus eine MySQL Datenbank ausliest. Er soll aber natürlich nur die Datensätze anzeigen, nach denen gesucht wurde. Also habe ich eine If Abfrage eingebaut. Allerdings zeigt er jetzt nur noch einen Datensatz an, wenn genau dieser eingegeben wurde. Gibt es eine Möglichkeit (statt if($searchname == $row['searchname']), dass er auch Datensätze anzeigt, die eine Ähnlichkeit haben. Ich habe Beispielsweise eine Datensatz mit dem Name 'google.de'. Wie mache ich es, dass er auch diesen Datensatz anzeigt, wenn der Benutzer nur 'google' oder 'Google' angibt?

Danke schonmal im Vorraus
MagicMasterII
 
Hi,

liest du beim Abfragen der MySQL Datenbank etwa alle Daten aus ? Wenn ja korrigiere doch einfach dein Query in Richtung:

PHP:
$result = @mysql_query("SELECT column1,column2,column3 FROM table WHERE column2 LIKE '%google%'",$mysql_id);

Wenn du darauf angewiesen bist alle Datensätze abzufragen und im Nachhinein zu filtern kannste für PHP ja folgendes nehmen:

PHP:
if (stripos($row['searchname'],$searchname) !== FALSE) {
    ...
}

Gruß thing
 
Irgendwie funktioniert dein Code nicht...
So sieht es bei mir aus:
PHP:
<html>
<head>
</head>
<body style="border: 2px solid #FF9000" bgcolor="#303030" text="#FFFFFF" link="#FF8C00" vlink="#FF8C00" alink="#696969">
<style>
body
{
scrollbar-DarkShadow-Color:#FFFFFF;
scrollbar-Track-Color:#505050;
scrollbar-Face-Color:#333300;
scrollbar-Shadow-Color:#606060;
scrollbar-Highlight-Color:#FFFFFF;
scrollbar-3dLight-Color:#606060;
scrollbar-Arrow-Color:#FF6600;
}
</style>
<font face="Comic Sans MS,Edwardian Script ITC">
<?php
error_reporting(E_ALL);
include 'config.php';
// Konfigurationsdatei laden
@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die("Keine Verbindung zur Datenbank. Fehlermeldung:".mysql_error());
mysql_select_db(MYSQL_DATABASE) OR die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());
// Hier kann man jetzt MySQL-Querys senden
$sql = "SELECT
                searchname,
                link
            FROM
                search;";
// Das am Anfang immer ein paar Leerzeichen stehen
// ist für MySQL uninteressant.
// Hier würde sich sogar die Heredoc schreibweise
// eignen
$result = mysql_query($sql) OR die(mysql_error());
echo "Resultate:<br /><br />\n";
$searchfound = 0;
while($row = mysql_fetch_assoc($result)) {
if($searchname == $row['searchname']) {
echo "<table border=1><tr><td>";
echo "</td><td valign=\"top\"><a href=\"".$row['link']."\">".$row['searchname']."</a><br />\n";
echo "</td></tr></table>";
$searchfound = 1;
}
}
if ($searchfound == 0) {
echo "Keine Seite konnte gefunden werden.";
}
?>
</font>
</body>
</html>
 
Irgendwie funktioniert dein Code nicht...
Ohne Deinen Quellcode durchgesehen zu haben:
Was funktioniert nicht?
Woran siehst Du das?
Was passiert, wenn Du welche Suchbegriffe einsetzt?
Welche Datensätze werden gefunden?
Weche Datensätze sollten gefunden werden?

Mach Dir mal ein bisschen Mühe ...
snuu

// EDIT:
Du scheinst den Beitrag von thing überhaupt nicht berücksichtigt zu haben. Ich kann keine LIKE-Klausel im SQL-Statement entdecken.
 
Zuletzt bearbeitet:
Ich kann Dir keine Code liefern, weil mit PHP kenn ich mich nicht sehr aus, aber ich kann Dir ein mögliches Prinzip erklären, wie Deine Suche funktionieren sollte.


schrittweise erklärt


1. musst Du damit beginnen, Deinen eingegebenen Begriff zu zerlegen in seine Bestandteile.Das heisst Du musst Anzahl der eingegebenen Buchstaben abfragen.
2. nun musst Du mit dem ersten Buchstaben beginnend, in Deinem Beispiel Google das G in der DB zu suchen.

3. sobald er ein G gefunden hat, muss er Deinen nächsten Buchstaben hoolen, also das o, und muss vergleichen, ob der Buchstabe nach dem in der DB gefundenen G auch wieder übereinstimmt, und auch ein o ist.

4.Schritt drei wird so lange wiederholt, bis entweder keine übereinstimmung mehr da ist, oder die Anzahl der eingegebenen Buchstaben erreicht ist.

falls die Anzahl Buchstaben erreicht wurde, musst Du diesen Datensatz, als Kanditaten zur Ausgabe zwischenspeichern.

Ich hab das ganze natürlich jetzt sehr kurz gehalten, und es ist gut möglich, dass ich noch das eine oder andere vergessen hab, aber wenn Du Dir mal genau überlegst wie so ein Suchalgorythmus funktionieren sollte, in Sprachlicher form, dann wirst Du das nachher auch programmieren können.
 
Mmh...

Verstehst du was du da für Code hast ? Du hast eine MySQL Datenbank in der viele Datensätze liegen. Du möchstest jetzt (im Rahmen einer Suchfunktion) Datensätze aus der Tabelle ziehen.

Deine Methode:
Ich besorge mir alle Datensätze aus der Tabelle, gehe sie Zeile für Zeile in einer while-Schleife durch und wenn der eingegebene Suchbegriff dem Wert einer definierten Spalte (in deinem Fall anscheinend searchname) gleicht, dann gebe ich ihn aus.

1. Problem
Deine Methode ist absolut nicht performant weil du (angenommen deine Datenbank hätte 1000 Datensätze und davon enthalten 3 deinen Suchbegriff) ALLE Datensätze nach dem Suchbegriff durchsuchst und nicht nur die per MySQL besorgst in denen er auch wirklich vorkommt.

2. Problem
Die Ergebnisse sehen nicht so aus wie du denkst. Das liegt daran dass du dort if ($searchname == $row['searchname']) { stehen hast. Du machst einen direkten Vergleich zwischen 2 Variablen. Dein Suchstring hingegen ist ja nur ein Teil des Wertes aus der Tabelle, also schau doch einfach (siehe mein Posting) mit if (stripos($row['searchname'],$searchname) !== FALSE) { nach ob der String $searchname im String $row['searchname'] vorkommt.

Diese zwei Probleme kannst du jetzt aber locker anders lösen in dem du dein MySQL Query so designst, dass du schonmal nur die Datensätze bekommst in denen dein Suchbegriff auch vorhanden ist (steht auch in meinem Posting) wobei du darauf achten solltest, dass in MySQL das % ein Platzhalter ist und nicht das * wie fast sonst überall. Dein 2. Problem tritt somit eigentlich garnicht mehr auf, weil du so oder so nur die Datensätze hast in denen der Suchbegriff vorkommt. Und wenn ich dir immer noch nicht helfen konnte, dann poste mal deinen Code MIT meinen Gimmicks :-) !

Gruß thing
 
Original geschrieben von thing
Mmh...

Verstehst du was du da für Code hast ? Du hast eine MySQL Datenbank in der viele Datensätze liegen. Du möchstest jetzt (im Rahmen einer Suchfunktion) Datensätze aus der Tabelle ziehen.

Deine Methode:
Ich besorge mir alle Datensätze aus der Tabelle, gehe sie Zeile für Zeile in einer while-Schleife durch und wenn der eingegebene Suchbegriff dem Wert einer definierten Spalte (in deinem Fall anscheinend searchname) gleicht, dann gebe ich ihn aus.

1. Problem
Deine Methode ist absolut nicht performant weil du (angenommen deine Datenbank hätte 1000 Datensätze und davon enthalten 3 deinen Suchbegriff) ALLE Datensätze nach dem Suchbegriff durchsuchst und nicht nur die per MySQL besorgst in denen er auch wirklich vorkommt.

2. Problem
Die Ergebnisse sehen nicht so aus wie du denkst. Das liegt daran dass du dort if ($searchname == $row['searchname']) { stehen hast. Du machst einen direkten Vergleich zwischen 2 Variablen. Dein Suchstring hingegen ist ja nur ein Teil des Wertes aus der Tabelle, also schau doch einfach (siehe mein Posting) mit if (stripos($row['searchname'],$searchname) !== FALSE) { nach ob der String $searchname im String $row['searchname'] vorkommt.

Diese zwei Probleme kannst du jetzt aber locker anders lösen in dem du dein MySQL Query so designst, dass du schonmal nur die Datensätze bekommst in denen dein Suchbegriff auch vorhanden ist (steht auch in meinem Posting) wobei du darauf achten solltest, dass in MySQL das % ein Platzhalter ist und nicht das * wie fast sonst überall. Dein 2. Problem tritt somit eigentlich garnicht mehr auf, weil du so oder so nur die Datensätze hast in denen der Suchbegriff vorkommt. Und wenn ich dir immer noch nicht helfen konnte, dann poste mal deinen Code MIT meinen Gimmicks :-) !

Gruß thing

Das Problem ist, das beide deiner Codes nicht funktionieren. Bei dem mit stripos meldet er, dass die Funktion nicht definiert ist.

Und bei der anderen sagt er:

You have an error in your SQL syntax near ''search' WHERE 'searchname' LIKE '%google%'' at line 1

MagicMasterII
 
Okay mein Fehler...

Die Funktion stripos(); existiert erst ab PHP5 (ist im CVS schon verfügbar) und du dürftest bestenfalls PHP4.x einsetzen.

Bei dem MySQL wäre es mal hilfreich wenn du den Code (mit LIKE drin) posten könntest...

Gruß thing

[edit]
Es gibt ein Äquivalent dazu in PHP3/4 das ich vorher nicht gesehen habe: strpos();
[/edit]
 
Zuletzt bearbeitet:
Original geschrieben von thing
Okay mein Fehler...

Die Funktion stripos(); existiert erst ab PHP5 (ist im CVS schon verfügbar) und du dürftest bestenfalls PHP4.x einsetzen.

Bei dem MySQL wäre es mal hilfreich wenn du den Code (mit LIKE drin) posten könntest...

Gruß thing

[edit]
Es gibt ein Äquivalent dazu in PHP3/4 das ich vorher nicht gesehen habe: strpos();
[/edit]
Jetzt funktioniert es mit der strpos-funktion... Aber nur wenn der Datensatz Beispielsweise 'Google' heißt und der User auch 'G' eingibt. Wenn er allerdings 'g' eingibt, wird der Datensatz nicht gefunden. Wie mache ich es aber, dass der Datensatz auch gefunden wird, wenn der Benutzer 'g' eingibt?
Trotzdem Danke nochmal,
MagicMasterII
 
AAAHHH... Zeig mir doch bitte bitte bitte dein MySQL Query *heul* !

Ansonsten
$searchstring = strtolower($searchstring);
while (...) {
if (strpos(strtolower(...),$searchstring) !== FALSE) {
...
}
}

Gruß thing
 
Zurück