Anzeige
Tutorialbeschreibung

Suchmaschine für die Homepage:

Suchmaschine für die Homepage:

Wozu ein Tutoral über Suchmaschinen für die eigene Homepage, wenn man quasi ‚an jedem Eck’ im www Links zu solchen Web-Crawlern (Google …) in die eigene Homepage einbauen kann?
Das mag sein, aber diese Crawler durchsuchen ‚nur’ das www und geben die Suchergebnisse auf Ihrer Homepage aus! Aber hier geht es darum, Ihren HomepageInhalt zu durchsuchen und die Treffer auf der Homepage auszugeben.
Das ist etwas ganz anderes!


Voraussetzungen: Unter welchen Vorraussetzungen ist diese Suchmaschine nur realisierbar?
  1. Mysql-Datenbank
  2. PHP-Interpreter
  3. Homepage muss mit ihrem gesamten Inhalt in einer Datenbank gespeichert sein, konkret in einer Tabelle der Datenbank.

Nun zu den Code-Snippets: 

Im Großen und Ganzen sollte man diese Suchmaschine in 3 große Bereiche unterteilen: 

I.: Der Bereich, der den Suchvorgang einleitet, also ein Formular, es kann in *.html oder *.php geschrieben sein, das ist egal!

… wir nennen es (der Einfachheit halber) input.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><body>
<meta http-equiv="Content-Language" content="de-at">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<form method="POST" action="search.php" name="submit">
<input type="text" size="65" value="SUCHEINGABE" name="inhalt" onclick="this.value='';"> <input type="submit" title="Suchen"  value="Suchen" name="submit"></form><br></body></html>

 Ein ganz ‘normales’ HTML-Formular, mit zwei erwähnenswerten Kleinigkeiten:

 
-  einem kleinen *.js, das nicht stört, wenn der Browser kein *.js versteht, aber recht ‚nobel’ wirkt, wenn Javascript aktiviert ist (etwa 95% der User verwenden den IE, und zwar in dessen Grundeinstellungen [… und da ist Javascript aktiviert]) und sich in der Textzeile verbirgt, es heißt onclick="this.value=' ';". Wenn man also im value Text eingibt, löscht es automatisch den (von Ihnen [hier ‚Sucheingabe’]) vorgegebenen value.

-   Im Submit-Button der Titel (title), er ist dafür verantwortlich, dass beim Hovern über den Button noch mal ‚eingeblendet’ wird, was geschieht (hier: Suchen). 

KURZER EXKURS: Ich denke, es passt zwar nicht zum Oberthema, jedoch zum Subthema title! 

title ist der einzig richtige ‚Hoverbefehl’ wenn Text beim mouseover eingeblendet werden soll, NICHT ‚alt’ (nur der IE, übrigens auch falsch Frontpage versteht alt wie title). title klappt nicht nur bei Buttons und bei Bildern, sondern bei jedem Text-Hyperlink (probiert es einfach aus J)!

Was ist dann ‚alt’?

Das ALT Attribut soll einen alternativen (!) Text für ein Bild enthalten um den Inhalt des Bildes auch dann zugänglich zu machen, wenn der User-Agent (z.B. der Browser) keine Bilder unterstützt oder der Benutzer das automatische Laden von Bildern deaktiviert hat. D.h. man sollte bei Bildern beide Attribute verwenden (‚title’ für den Hovertext und ‚alt’ für User die Bilder nicht anzeigen lassen in ihrem Browser …)

… wieder zurück zum Oberthema: 

II.: Der Bereich, der den Suchvorgang in der Datenbanktabelle durchführt, es muss in *.php sein … immerhin muss es die Datenbank durchsuchen, wir nennen es search.php!

<? include 'connect.php';

     $query = mysql_query("SELECT * FROM `tabelle` WHERE inhalt LIKE '%".$inhalt."%';");
   $ausgabe=""
   while($row = mysql_fetch_array($query))
{
     $id=$row['id'];
     $inhalt1=$row['inhalt'];
     $Text = $inhalt1;
     $GekuerzterText = substr($Text, 0, 300);
     $GekuerzterText = preg_replace("!<img (.*?)>!si", "- BILDINFO -",        $GekuerzterText);    

$ausgabe.='<a href="javascript:neuesFenster('frame.php?id='.$id.'')" title="Treffer zu °'.$inhalt.'°"><font face="Verdana" color="#0951FC"><b>Bitte hier klicken, für den gesamten Trefferinhalt!</a></font></b><br><font color=#0951FC>'.$GekuerzterText.' ...</font><hr size="1">';

}

if (empty($ausgabe)) echo '<br>Ihre obige <b>Suchanfrage</b> ergab leider <b>keinen Treffer</b>, bitte versuchen Sie es <b>erneut</b>!<br><br><br>';

else echo '';?>

ERKLÄRUNGEN: 
Ich werde versuchen, die Erklärungen Zeile für Zeile vorzunehmen: 
ich wollte die Datenbankanbindung hier im Code sparen (man kann sie überall nachlesen), also ist sie hier includet in Form der connect.php!
zunächst eine ‚ganz normale’  query, mit der Besonderheit, dass sie die Tabelle `tabelle` auf ALLE Worte (Wortteile) durchsucht, die der Eingabe `ìnhalt` (aus input.html) entsprechen, aber was bedeuten dann die beiden Prozentzeichen vor  u n d  nach $inhalt?
Das bedeutet: wirf jedes Ergebnis aus, das die Wortfolge ‚inhalt’ enthält. Z.B.: wenn die Eingabe ALD lautet, findet dieses SELECT unter anderem Wald, Waldrand, Walderdbeeren … und gibt es aus. 
  1. zunächst eine ‚ganz normale’  query, mit der Besonderheit, dass sie die Tabelle `tabelle` auf ALLE Worte (Wortteile) durchsucht, die der Eingabe `ìnhalt` (aus input.html) entsprechen, aber was bedeuten dann die beiden Prozentzeichen vor  u n d  nach $inhalt?
    Das bedeutet: wirf jedes Ergebnis aus, das die Wortfolge ‚inhalt’ enthält. Z.B.: wenn die Eingabe ALD lautet, findet dieses SELECT unter anderem Wald, Waldrand, Walderdbeeren … und gibt es aus.
  2. als nächstes benötigen wir eine while-Schleife (sie durchsucht die gesamte Tabelle), deren Aufbau auch in anderen tuts dargestellt ist, interessant ist für diese Suchmaschine nur zweierlei:

a. substr() -- Gibt einen Teil eines Strings zurück (siehe php.net) … für unsere Suchmaschine ist dieser Befehl sehr wichtig, weil zunächst (bei den gefundenen Treffern) nur ein Teil des Einzeltreffers (es werden ja mehrere sein!) angezeigt werden soll (in unserem Code, sollen bei jedem Treffer nur 300 Zeichen angezeigt werden, und zwar von 0 an).

b. $GekuerzterText = preg_replace("!<img (.*?)>!si", "- BILDINFO -",        $GekuerzterText è dies dient dazu, um keine Bilder in der Kurzanzeige der Treffer zu haben, statt dessen wird als Text - BILDINFO – ausgegeben!

Wo bleibt dann der gesamte Treffertext?
… in frame.php und das wird hier in einem POPUP aufgerufen, mit dem link:
$ausgabe.='<a href="javascript:neuesFenster('frame.php?id='.$id.'')" title="Treffer zu °'.$inhalt.'°"><font face="Verdana" color="#0951FC"><b>Bitte hier klicken, für den gesamten Trefferinhalt!</a></font></b><br>

Der Vollständigkeit halber das *.js, das hier im Link für das POPUP verwendet wird (im <head> einbauen):

<SCRIPT language="JavaScript">
<!--
    function neuesFenster(fenster_name, fenster_titel)
    {
      if(navigator.appName == 'Netscape')
        { dummy=open(fenster_name, fenster_titel, 'menubar=no,locationbar=no,status=no,resizable=yes,scrollbars=yes,innerwidth=650,innerheight=600'); }
      else
        { dummy=open(fenster_name, fenster_titel, 'menubar=no,locationbar=no,status=no,resizable=yes,scrollbars=yes,width=650,height=600'); }
    }
//-->
</SCRIPT> 

  1. Wie wird frame.php korrekt aufgerufen, damit der richtige (gewünschte) Treffer vollständig angezeigt wird?  Mit der id, die sozusagen (im Rahmen der while-Schleife) ‚mitgenommen’ wird ($id=$row[’id’];)

III.: Der Bereich, der das Suchergebnis zur Gänze anzeigt, es muss in *.php sein, wir nennen es frame.php.

<?include "connect.php"

$id=$_GET['id'];
$check = "SELECT inhalt FROM tabelle Where id='".$id."'"
$result = mysql_query($check);
  if (mysql_num_rows($result))
  {
    while($row=mysql_fetch_array($result))
    {
$name = $row[inhalt];
echo '<font size="1">'.(nl2br($name));
   }
}

?>

… so jetzt haben wir ‚alles’, um das Klappen der Suchmaschine zu gewährleisten!
Unbedingt sollte aber eine frei zugängliche Suchmaschine (manche hätten vielleicht eine Freude über diese Eingabe Ihre Datenbank zumindest in Unordnung zu bringen, dem kann man einen Riegel vorschieben!) auch eine Sperre für Mysql-Injections haben, das wird das Thema für das nächste Tutorial, hier würde es zu weit führen.

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von K-Dawg
  • 29.01.2011 - 16:01

Vielen Dank für deine Mühe, jedoch ist dieses Tutorial weniger als nur die Oberfläche ankratzen.

Hätte mir mehr tiefe zu dem Thema gewünscht.

Gruß

Portrait von Dissel2010
  • 07.02.2010 - 20:39

Sehr nützliches und einfach zu verstehendes Tutorial! Danke

Portrait von Mainclain
  • 30.09.2009 - 12:17

Finde den Inhalt ganz gut, leider durch die viele Erklärung etwas unübersichtlich geworden.
Wäre vll besser gewesen, wenn man alles zeilenweise abarbeiten will, jede zeile nocheinmal hinzuschreiben und den erklärung in die nächste Zeile zu schreiben, dann eine leerzeile usw.
Den gesamten Quellcode könnte man dann ganz unten oder ganz oben als ganzes schreiben.

Sonst recht interessant, da du allerdings z.b. die mysql Connection wegelassen hast, war es recht unvollständig.
Da solltest du dich vll ein wenig auf ein Thema "spezialisieren".
Hier war ja das eigentlich besondere die MYSQL Anweisung:
LIKE '%".$inhalt."%';")
Diese hättest du zum Beispiel noch ein wenig mehr erläutern können - und noch andere nützliche Tipps zum Thema Suchmachine&MySQL geben können (Welche "Besonderheiten" wie Like %% es noch gibt die im Zusammenhang mit Suchmachinen wichtig sind, oder was man noch bedenken müsste um Optimale Suchergebnisse zu bekommen.)

Portrait von Destruction929
Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 18.06.2009 - 15:29

schlecht und unüberscihtlich!

Portrait von Top_Gun
  • 14.04.2009 - 10:39

Wirr und unvollständig, leider nicht zu gebrauchen.

Portrait von hurtsea
  • 15.02.2009 - 04:09

das sieht recht gut aus.....würde mich sehr über eine fortsetzung freuen ;)

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 29.10.2008 - 10:05

Herzlichen Dank für die Mühe, ich habe schon lange eine "interne Suchmaschine" gesucht, die sich nicht nur durch Google realisieren lässt. Danke dafür !

Portrait von landrobber
  • 17.01.2008 - 19:22

Eigentlich das, was ich schon lange gesucht habe - werde es gleich mal ausprobieren ^^

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 14.09.2006 - 15:11

genial...hab ich voll lange gesucht...thx

Portrait von Schrottie
  • 18.08.2006 - 13:05

Dein kleines Script ist ja ganz nett, du hast auch am anfang geschrieben das die ganze Seite in einer Tabelle sein muss. Leider hast du vergessen zu schreieben wie die Tabelle aussehen muss.
Auser ist es immer ganz net wenn man nicht nur die Link bekommt sondern auch noch ein wenig mehr, so wie z.B. bei jeder Suchmaschiene immer noch ein Teil des Textest vor dem Suchwort und nach dem Suchwort kommt.
Auserdem gehört eigendlich eine "und" "oder" zu einer Suchmaschiene.

Portrait von webmastersworld
  • 18.08.2006 - 14:20

hi!

>> natürlich bekommst du nicht nur das trefferstichwort, mit link, sondern die ersten 300 buchstaben, kannst aber jederzeit erweitern! > siehe $gekuerzterText

codesnippet dazu:




<br>

Ein ganz ‘normales’ HTML-Formular, mit zwei erwähnenswerten Kleinigkeiten:

- einem kleinen *.js, das nicht stört, wenn der Browser kein *.js versteht, aber recht ‚nobel’ wirkt, wenn Javascript aktiviert ist (etwa 95% der User verwenden den IE, und zwar in dessen Grundeinstellungen [… und da ist Javascript aktiviert]) und sich in der Textzeile verbirgt, es heißt onclick="this.value=' ';". Wenn man also im value Text eingibt, löscht es automatisch den (von Ihnen [hier ‚Sucheingabe’]) vorgegebenen value.

- Im Submit-Button der Titel (title), er ist dafür verantwortlich, dass beim Hovern über den Button noch mal ‚eingeblendet’ wird, was geschieht (hier: Suchen).

KURZER EXKURS: Ich denke, es passt zwar nicht zum Oberthema, jedoch zum Subthema title!

title ist der einzig richtige ‚Hoverbefehl’ wenn Text beim mouseover eingeblendet werden soll, NICHT ‚alt’ (nur der IE, übrigens auch falsch Frontpage versteht alt wie title). title klappt nicht nur bei Buttons und bei Bildern, sondern bei jedem Text-Hyperlink (probiert es einfach aus J)!

Was ist dann ‚alt’?

Das ALT Attribut soll einen alternativen (!) Text für ein Bild enthalten um den Inhalt des Bildes auch dann zugänglich zu machen, wenn der User-Agent (z.B. der Browser) keine Bilder unterstützt oder der Benutzer das automatische Laden von Bildern deaktiviert hat. D.h. man sollte bei Bildern beide Attribute verwenden (‚title’ für den Hovertext und ‚alt’ für User die Bilder nicht anzeigen lassen in ihrem Browser …)

… wieder zurück zum Oberthema:

II.: Der Bereich, der den Suchvorgang in der Datenbanktabelle durchführt, es muss in *.php sein … immerhin muss es die Datenbank durchsuchen, wir nennen es search.php!

!si", "- BILDINFO -", $GekuerzterText);

...?>

>> was möchtest bei der tabelle noch wissen? ... aber hast recht, das nächste mal mach ich die create_table.php auch dazu :-)

>> das mit AND bzw. OR oder beides liess ich weg, weiss zu weitläufig gewweseen wäre, aber in der query wirds für jeden der php ein bisserl versteht kein problem sein, sonst ist die suchmaschine nur für ein suchwort, da hast recht ;-)

Portrait von lomion
  • 30.06.2006 - 16:29

nett hätte ich vor ein paar wochen brauchen können..^^
was mich jetzt allerdings noch interessiert wie würdest du es machen wenn man nach mehreren verknüpften wörtern suchen will..wie z.B. in google??
da bin ch nämlich dann gescheitert

Portrait von webmastersworld
  • 30.06.2006 - 16:38

hab ich zwar nicht getestet (mehrere wörter), müsste aber mit mehreren eingabefeldern (z.b platzsparend nebeneinander) + veränderderter query (OR bzw. AND, je nach wahl z.b. in einem dropdown klappen). zugegeben das ist jetzt eine 'lösung aus der hüfte', die zwar klappen wird, aber nicht elegant ist (wie z.b. bei google), aber gerade fällt mir ein, die worttrennung ist im echo von $inhalt identifizierbar (z.b $inhalt=array()) ... aber das wäre sicher ein eigenes tut wert, mal sehen, zuerst will ich aber eine injectionssperre machen, dann werde ich mir das genauer ansehen, gute anregung thx :-).

Portrait von webmastersworld
  • 30.06.2006 - 17:43

hi ich bins nochmal, ;-) deine anfrage ließ mir jetzt keine ruhe: ich hab hir 2 varianten, die klappen müssten:<br>
<b>1. das habe ich getestet</b>
$inhalt1=array($inhalt);
foreach($inhalt1 as $ausgabe)
{
print 'Die Eingabe lautet: '.$ausgabe.'!<br>';
}

<br><br>
<b>2. nicht getestet (versuchs mal) - konkret bei der suchmaschine:</b>
include 'connect.php';
$inhalt1=array($inhalt);
foreach($inhalt1 as $ausgabe)
{
$query = mysql_query("SELECT * FROM `tabelle` WHERE inhalt LIKE '%".$ausgabe."%';");
$ausgabe="";
while($row = mysql_fetch_array($query)) {
$id=$row['id'];
$inhalt1=$row['inhalt'];
$Text = $inhalt1;
$GekuerzterText = substr($Text, 0, 300);
$GekuerzterText = preg_replace("!!si", "- BILDINFO -", $GekuerzterText);
$ausgabe.='<a href="javascript:neuesFenster('frame.php?id='.$id.'')"><b>Bitte hier klicken, für den gesamten Trefferinhalt!</a></b><br>'.$GekuerzterText.' ...';
}}
if (empty($ausgabe)) echo '<br>Ihre obige <b>Suchanfrage</b> ergab leider <b>keinen Treffer</b>, bitte versuchen Sie es <b>erneut</b>!<br><br><br>';
else echo '';


sry bei den obigen codes fehlen die , aber das 'auskommentiert code :-0'

x
×
×