Kritisches bei
|
Volltextsuche in einer Text-Datei
Volltextsuche-Tutorial in PHP von Daniel Schwamm (26.02.2009)
Aus "Heimat des Dilettantismus"
http://www.henrys.de/daniel/index.php?cmd=software_php_volltext-suche_index.htm
Wir betrachten hier ein Ein-Seiten-Script in PHP, mit dessen Hilfe
eine kleine Datenbank in Form einer Text-Datei nach beliebigen
Text-Passagen durchsucht werden kann. Der Suchbegriff lässt sich
auf der Webseite über eine Form-Variable eingeben und die gefundenen
Datensätze werden anschliessend in formatierter Weise ausgegeben.
Die Prominenten-Datenbank
Folgende Text-Datei "daten.txt" mit einer kleinen Promi-Datenbank sei gegeben:
1;Musiker;Queen;GB;queen.jpg
2;Musiker;Billy Idol;GB;billy-idol.jpg
3;Musiker;Eminen;USA;eminem.jpg
4;Schauspieler;Kate Winslet;GB;kate-winslet.jpg
5;Schauspieler;Brad Pitt;USA;brad-pitt.jpg;
6;Angelina Jolie;Brad Pitt;USA;angelina-jolie.jpg
7;Musiker;Kate Bush;GB;kate-bush.jpg
8;Schauspieler;Kate Beckinsale;GB;kate-beckinsale.jpg
9;Schauspieler;Alyssa Milano;USA;alyssa-milano.jpg
10;Schauspieler;Rose McGowan;USA;rose-mcgowan.jpg
11;Schauspieler;Winona Ryder;USA;winona-ryder.jpg
12;Moderator;Gülcan Kamps;Deutschland;guelcan-kamps.jpg
13;Moderator;Collien Fernandes;Deutschland;collien-fernandes.jpg
14;Musiker;Britney Spears;USA;britney-spears.jpg
15;Musiker;Christina Aguilera;USA;christina-aguilera.jpg
16;Schauspieler;Charlize Therone;Südafrika;charlize-therone.jpg
17;Musiker;Kylie Minouge;Australien;kylie-minouge.jpg
|
Jede Zeile entspricht einem Datensatz. Jeder Datensatz
besteht wiederum aus 5 Feldern, die durch den Delimiter ";"
abgegrenzt werden. Diese Felder enhalten jeweils "ID", "Kategorie",
"Namen", "Land" und "Bild-Namen" eines Promis.
Der Algorithmus des Scripts verfährt folgendermassen:
- Wir holen uns den Wert der CGI-Variable "volltext" in "$volltext"
- Die Variable "$ergebnis" wird auf Nichts gesetzt
- Ist "$volltext" nicht leer, dann
- öffnen wir die Text-Datei "daten.txt"
- Wir durchlaufen sie zeilenweise, speichern den String in "$zeile"
- Wir prüfen, ob "$volltext" in "$zeile" enthalten ist
- Ist dem so, dann
- spalten wir "$zeile" in ein Array "$zeile_ar" auf
- wir füllen "$ergebnis" mit den Array-Werten aus "$zeile_ar"
- Sind alle Datensätze fertig, schliessen wir "daten.txt" wieder
- Wir geben die HTML-Form aus mit der INPUT-Variable "volltext"
- Falls "$ergebnis" ungleich Nichts ist, hängen wir es hinten dran
Das Script behandelt also die alles entscheidende CGI-Variable "volltext"
wie einen Parameter, der an eine gewöhnliche Funktion übergeben wird.
Der Submit-Button der HTML-Form bewirkt einen quasi
rekursiven Aufruf der Funktion, indem die PHP-Seite neu geladen wird.
Der Script-Source
Der Script-Source wird in der Datei "script.php" gespeichert.
Aufgerufen wird das Programm dann wie eine gewöhnliche HTML-Datei mit
einem Browser. Es muss jedoch eine gültige URL angegeben werden. Als
lokale Datei funktioniert es nicht, da zur Interpretation der
PHP-Befehle ein Web-Server benötigt wird.
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'
'http://www.w3.org/TR/html4/loose.dtd'>
<html>
<head>
<META NAME='ROBOTS' CONTENT='INDEX, FOLLOW, ARCHIVE'>
<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=windows-1252'>
<meta name='author' content='Daniel Schwamm'>
<meta name='Description' content='Demo zur Volltext-Suche in PHP:
Positionen in Mini-Datenbank per Volltext-Suche ohne MySQL selektieren'>
<meta name='Keywords' content='software, tutorial, php, volltext, suche,
text-datei, kein mysql, demo, mini-datenbank'>
<link rel='canonical'
href='/daniel/cmd/software/php/volltext-suche/script.php'>
<title>[DAN] • Software - PHP - Volltext-Suche in einer
Text-Datei - Demo</title>
<?PHP
/*
Created 24.02.2009 09:36:23 by dirty DanPHPEd V2.2.5
volltext-such-demo von daniel schwamm
Aufbau der datenbank-tabelle: daten.txt
ID; Kategorie; Name; Land; Bild
--------------------------------------------
1; Musiker; Queen; GB; queen.jpg
2; Musiker; Billy Idol; GB; billy-idol.jpg
...
*/
//hole dan-hilfsfunktionen
include "../help-functions/dan-service.php";
//hole cgi-variable volltext.
//falls nicht vorhanden, setze volltext auf 'kate'
$volltext=dan_cgivar_get('volltext','kate');
$datensatz_c=0;
$ergebnis="<b>Kein Suchbegriff angegeben!</b>";
if($volltext<>''){
//volltext vorhanden
$treffer_c=0;
$ergebnis="";
//datenbank oeffnen
$datei=fopen("daten.txt",'r') or
die ("Kann Datei 'daten.txt' nicht lesen.");
//durchlaufe datenbank zeilenweise
while(!feof($datei)){
//lese eine zeile ein
$zeile=trim(fgets($datei,1024));
$datensatz_c++;
//taucht volltext in zeile auf?
//volltext und zeile werden in kleinschrift umgewandelt
//so dass nicht zwischen gross-/kleinschreibung unterschieden wird
if(strpos(strtolower($zeile),strtolower($volltext))===false){
//nein, also zeile ignorieren
continue;
};
//ok, volltext in zeile gefunden
//zeilen-string in zeilen-array umwandeln
$zeile_ar=explode(";",$zeile);
//die spalten-werte in variable packen
$id =$zeile_ar[0];
$kategorie=$zeile_ar[1];
$name =$zeile_ar[2];
$land =$zeile_ar[3];
$bild =$zeile_ar[4];
//ausgabe bauen
$ergebnis.="
<b>Datensatz:</b> $datensatz_c
<b>ID:</b> $id
<b>Kategorie:</b> $kategorie
<b>Name:</b> $name
<b>Land:</b> $land
<br><br>
<img src='$bild' alt='$bild' title='$bild' height=200 border=2>
<hr width='60%'>
";
//treffer-anzahl erhoehen
$treffer_c++;
};
//datenbank wieder schliessen
fclose($datei);
//ergebnis anhand der treffer interpretieren
if($treffer_c>0){
$ergebnis="
Suchbegriff '$volltext' <b>$treffer_c-mal</b> gefunden
<br><br>
$ergebnis
";
}
else{
$ergebnis="Suchbegriff '$volltext' <b>nicht</b> gefunden";
};
};
//webseite ausgeben
echo trim("
<body bgcolor=#d0d0a0>
<center>
<font face=arial>
<h1>Demo zur Volltext-Suche in PHP</h1>
<h2>Positionen in Mini-Datenbank per Volltext-Suche
ohne MySQL selektieren</h2>
<form action='script.php' method='get'>
<b>Suche nach:</b> <input type='text' name='volltext'
value='$volltext'>
<input type=submit value='Go'>
</form>
<hr>
$ergebnis
<center>
</body>
</html>
");
?>
|
Hinweise zum Script:
- Die Funktion "dan_cgivar_get" wird in den
PHP-Hilfsfunktionen
definiert. Mit ihrer Hilfe können CGI-Variablen eingelesen werden.
Der erste Parameter gibt den Namen des Input-Feldes wieder
(hier "volltext"), der zweite Parameter einen Default-Wert,
den die Variable annehmen soll, falls sie leer sein sollte
(hier "kate").
- "datensatz_c" ist ein Zähler für die Anzahl aller Datensätze,
"treffer_c" ein Zähler für die Anzahl Datensätze, die den
Suchbegriff enthalten.
- Die Funktion "fgets" liest eine Zeile aus einer geöffneten Datei,
wobei der erste Parameter das Datei-Handle angibt, und der zweite
Parameter bestimmt, wieviel Zeichen die Zeile maximal enthält.
- Die Funktion "strpos" prüft, ob ein String in einem anderen
String enhalten ist. Falls ja, liefert sie die Position im String zurück.
Da diese Position durchaus "0" sein kann, was dem Boolschen Wert "false"
entspricht, muss explizit mit drei Gleichheitszeichen auf "false"
geprüft werden. Das ist für einen Delphi-Programmierer recht ungewohnte
Kost :-)
- "$volltext" und "$zeile" werden mit strtolower
in Kleinschrift umgewandelt, so dass Gross-/Kleinschrift bei der Suche
keine Rolle spielt.
- Die Funktion "explode" spaltet einen String in ein Array mit
mehreren Feldern auf, auf die dann mittels "[x]"-Index zugegriffen werden
kann.
- Das HTML-Form-Action wird auf "script.php" gesetzt.
Dies bewirkt, dass sich durch einen Klick auf den Sumit-Button
das Script selbst aufruft.
- Die HTML-Input-Variable "volltext" enthält als Value
"$volltext", so dass nach einer Suchaktion der Suchbegriff erhalten
bleibt.
Volltext-Suche ausprobieren
Klicken Sie hier ...
... um das Volltext-Suche-Script auszuprobieren. Nette Suchbegriffe sind z.B.:
- "kate" liefert alle Promis, deren namen "kate" enthält
- "usa;" liefert alle Promis aus den USA
- "e" liefert alle Datensätze zurück, da in jedem Datensatz mindestens
einmal "e" auftaucht
|