1.7k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von timoxy Mitglied (133 Punkte)
Hallo @ all,

ich bin gerade dabei eine "optimale" Suchfunktion zu schrieben. Oder möchte zumindest eine solche schreiben ;-P

Mein aktueller Code:
<html>
<head>
<meta http-equiv="content-type" content="text/html; ">
<meta http-equiv="refresh" content=";">
<title></title>
</head>
<body>
<form action="#" method="get">
<input type="text" name="suche" size="20">
<input type="submit">
</form>
<?php
include '_config.php'; //USER, PW, DATENBANK

$suche = $_GET['suche'];

$sql = "SELECT * FROM `tabelle` WHERE `titel` LIKE '%".$suche."%' or `text` LIKE '%".$suche."%' ORDER BY id ASC";
$query = mysql_query($sql);
$count = mysql_affected_rows();

while($row = mysql_fetch_assoc($query)){
echo '<b><a href="#">'.$row['titel'].'</a></b>';
echo '<ul>'.substr($row['text'], 0, 500).'... <a href="#">[mehr]</a></ul>';
}
?>
</body>
</html>


Meine Datenbank:
id | title | text


Meine Suchfunktion soll nun folgende Funktionen enthalten:
> Groß- und Kleinschreibung ignorieren
> Sowohl die "titel" als auch die "text" Spalte durchsuchen
> zuerst aber alle gefundenen Ergebnisse aus der "titel" Spalte darstellen dann die restlichen aus der "text" Spalte
> auch ganze Textpassagen finden z.B. "Der kleine Thomas geht spazieren" wobei hier zusammenhängende Passagen, Vorrang vor einzelnen Wörtern haben sollten z.B. "kleine [...] geht [...] Thomas [...] geht [...] der"
> die Ausgabe substr($row['text'], 0, 500) so formatieren, dass alle Suchbegriffe z.b. mit <b></b> hervorgehoben werden

ich hoffe ich habe mein Problem ausreichend dokumentiert. Kann mir jemand weiterhelfen wie ich einzelne Punkte hiervon verwirklichen kann, oder hat sogar noch jemand eine Idee, was eine "optimale" Suche noch für Funktionen enthalten sollte?

Ich danke schon mal im Voraus für alle Antworten und Tipps.

LG Timoyx

3 Antworten

0 Punkte
Beantwortet von timoxy Mitglied (133 Punkte)
hat denn keiner eine Idee, wenn es auch nur zu einem Teilbereich der Suche ist, ich bin für jede Antwort dankbar.

LG
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Das ist eine ganz schön simpler Ausgangscode. Von deinen drei hingelegten Steinen will ich dir nicht das komplett erbaute Haus liefern, sondern nur Ansätze für die richtige Richtung. Dazu kannst du natürlich weitere spezifische Fragen stellen:

// den Text für das DBMS maskieren, ansonsten könnte jemand "; DROP DATABASE;" suchen
$suche= addslashes( $_GET['suche'] );

// für die genaue Suche muss der gesamte Text so wie er ist gefunden werden (Groß-/Kleinschreibung ausgeschlossen)
$suche_genau= '%'. $suche. '%';

// um nur die Wörter zu finden ersetzen wir alle Leerzeichen durch %
// hiermit müssen ALLE Wörter in derselben REIHENFOLGE auftauchen! Nach etwas anderem hast du nicht gefragt
$suche_worte= '%'. str_replace( ' ', '%', $suche ). '%';

$sql_genau= 'SELECT * FROM tabelle t WHERE t.titel LIKE \''. $suche_genau. '\' or t.text LIKE \''. $suche_genau. '\' ORDER BY t.id ASC";
$sql_worte= 'SELECT * FROM tabelle t WHERE t.titel LIKE \''. $suche_worte. '\' or t.text LIKE \''. $suche_worte. '\' ORDER BY t.id ASC";

// zuerst alle genauen Texte finden
$result= mysql_query( $sql_genau ); // Abfrage ausführen
$feld1= array(); // Ergebnisfeld vorbereiten
while ( $row= mysql_fetch_array( $result ) ) $feld1[$row['id']]= $row; // alle Ergebnisse ins Feld füllen
mysql_free_result( $result ); // MySQL-Ergebnis freigeben

// dasselbe für alle Wörter
$result= mysql_query( $sql_worte );
$feld2= array();
while ( $row= mysql_fetch_array( $result ) ) $feld1[$row['id']]= $row;
mysql_free_result( $result );

// gibt es Elemente im Ergebnisfeld für den gesamten Text?
if ( count( $feld1 )> 0 ) {
echo '<h1>'. count( $feld1 ). ' Ergebnisse für den gesamten Text:</h1><ul>';
foreach ( $feld1 as $k1=> $v1 ) { // alle Elemente des Feldes durchlaufen
echo '<li>ID='. htmlentities( $k1 ). '<br />Titel='. htmlentities( $v1['titel'] ). '<br />Text='. htmlentities( $v1['text'] ). '</li>';
}
echo '</ul>';
} else echo '<h1>Keine Ergebnisse für den gesamten Text</h1>';

if ( count( $feld2 )> 0 ) {
echo '<h1>'. count( $feld2 ). ' Ergebnisse für die Wörter:</h1><ul>';
foreach ( $feld2 as $k1=> $v1 ) {
echo '<li>ID='. htmlentities( $k1 ). '<br />Titel='. htmlentities( $v1['titel'] ). '<br />Text='. htmlentities( $v1['text'] ). '</li>';
}
echo '</ul>';
} else echo '<h1>Keine Ergebnisse für die Wörter</h1>';

0 Punkte
Beantwortet von timoxy Mitglied (133 Punkte)
ich danke dir für deine Antwort, werde schauen, was ich damit erreichen kann
...