Teil von  SELFPHP
  +++ SELFPHP CronJob-Service :: Jetzt auch als Professional-Version verfügbar! +++



:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP? In über 120.000 Beiträgen finden Sie sicher die passende Antwort!  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

:: Qozido ::

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.   

 
 
Suchmaschine im Google-Format


Systemvoraussetzung

  • Linux
  • Windows
  • PHP 3
  • PHP 4
  • PHP 5

Datei(en)

suchmaschine.php, blaettern_grafik.php, suchmaschine.sql

Problem

Die zuvor beschriebene Problematik stellt sich auch hier bei diesem Beispiel ein. Allerdings wollen wir diesmal die Ausgabe der Seiten mit grafischen Elementen darstellen. Zusätzlich wird noch eine einfache Suchmaschine eingebaut.

Lösung

Wir werden in unserem Beispiel eine sehr einfache Suchmaschine erstellen, die innerhalb einer Datenbank nach einem Suchwort sucht und die Treffer auflistet. Zusätzlich soll sie selbstverständlich auch die Gesamtmenge der Treffer, die aktuelle Auflistungsmenge (z. B. 33 bis 48) und die Suchzeit für unsere Datenbankabfrage aufzeigen.

Im unteren Teil der Auflistung soll neben einer Textverlinkung für die einzelnen Seiten jeweils eine Grafik für jede Seite angezeigt werden. Sie kennen sicherlich die Funktionsweise von Google. Genau diesen Mechanismus werden wir hier vereinfacht nachbauen.

Sie sehen nachfolgend eine Grafik mit der möglichen Ausgabe. Aus Darstellungsgründen wurde die Webseite in der Breite so klein gezogen, dass sie hier im Buch noch einigermaßen gut dargestellt werden kann.

Das Beispielskript im beiliegenden ZIP-Archiv ist allerdings so konzipiert, dass die Ausgabe über die komplette Webseite geht. Sie müssen allerdings die Ausgabe der Treffer selbst modifizieren, indem Sie die Verlinkungen mit Ihrer Datenbank verknüpfen. Dieses sollte aber keinerlei Probleme darstellen, weil dafür nur wenige Zeilen Programmcode zu ändern sind.



Abbildung 5.2: Suche

function startTime()
   @param   void
   @return   float   $time

Die Funktion startTime() erwartet keinen Parameter, sondern gibt lediglich die aktuelle Zeit in Sekunden zurück. Dafür wird zuerst die aktuelle Zeit in Sekunden und Mikrosekunden zerlegt (40). Im Anschluss daran werden beide Werte addiert (41) und das Ergebnis (also die Zeit als Fließkommazahl) zurückgegeben (43).

Dieser Wert dient uns als Startwert für die spätere Anzeige der Laufzeit unserer Suchanfrage. Daher wird auch diese Funktion bereits zum Anfang der Suche aufgerufen und der Wert zwischengespeichert.

038:
039:
040:
041:
042:
043:
044:
045:
function startTime(){
    
    
$timeExplode explode(" "microtime());
    
$time $timeExplode[1] + $timeExplode[0];

    return 
$time;

}
Beispiel 5.5: blaettern_grafik.php

function endTime($timer)
   @param   float   $timer
   @return   float   $endTime

Die Funktion endTime() berechnet die gesamte Laufzeit der Suchanfrage. Sie erwartet als Parameter den Startwert für die Suchanfrage. Dieser Startwert wurde bereits am Anfang der Datei mit der Funktion startTime() ermittelt. Wieder zerlegen wir die aktuelle Zeit in Sekunden und Mikrosekunden (49), addieren die beiden Werte (50) und subtrahieren () vom Ergebnis (51) den Startwert.

Bevor wir das Ergebnis, also die Laufzeit der Suchanfrage, zurückgeben (54) formatieren wir diesen Wert (52). Da die meisten Suchanfragen weit unter einer Sekunde liegen, kürzen wir das Ergebnis auf drei Stellen hinter dem Komma.

047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
function endTime($timer){

    
$timeExplode explode(" "microtime());
    
$time $timeExplode[1] + $timeExplode[0];
    
$finish $time $timer;
    
$endTime sprintf("%4.3f"$finish); 
  
    return 
$endTime;

}
Beispiel 5.6: blaettern_grafik.php

function makeInfo($endTime,$seiteAktuell,$maxEintraege,$Eintraege, $infoText)
   @param   float       $endTime
   @param   integer   $seiteAktuell
   @param   integer   $maxEintraege
   @param   integer   $Eintraege
   @param   string     $infoText
   @return   string     $infoText

Die Funktion makeInfo() ist für unseren Infotext zuständig, also wie viele Treffer es gab, wie lange die Suche gedauert hat und welche Ergebnisse gerade angezeigt werden. Eine mögliche Ausgabe könnte folgendermaßen aussehen:

Ergebnisse 1 - 16 von ungefähr 125. (0.001 Sekunden)

Die Funktion erwartet die Laufzeit der Suchanfrage, die per $GET übermittelte aktuelle Seite, die maximalen Ergebnisse pro Seite, die Menge der gesamten Ergebnisse der Suchanfrage und den Infotext. Der Infotext wird bei den Konfigurationsparametern (später mehr dazu) festgelegt und hat die Form:

Ergebnisse {ERGEBNIS} von ungefähr {MENGE}. ({SEKUNDEN} Sekunden)

Im ersten Schritt ersetzen wir (59) in unserem Infotext den Flag {SEKUNDEN} durch die Laufzeit. Danach wird der Flag {MENGE} durch die Gesamtzahl der gelieferten Ergebnismenge ersetzt (60).

Wir berechnen im Anschluss daran, welche Ergebnisse momentan angezeigt werden (62-63) und ersetzen (65) die beiden Werte durch den Flag {ERGEBNIS}. Der Infotext ist somit fertig und kann an die aufgerufene Stelle zurückgegeben werden (67).

058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
function makeInfo($endTime,$seiteAktuell,$maxEintraege,$Eintraege,$infoText) {
    
$infoText preg_replace("/{SEKUNDEN}/"$endTime$infoText);
    
$infoText preg_replace("/{MENGE}/"$Eintraege$infoText);
    
    
$start $seiteAktuell $maxEintraege $maxEintraege 1;
    
$end $seiteAktuell $maxEintraege;
    
    
$infoText preg_replace("/{ERGEBNIS}/""$start - $end"$infoText);
    
    return 
$infoText;
    
}
Beispiel 5.7: blaettern_grafik.php

function navigationsLeiste($SitesComplete,$seiteAktuell)
   @param   integer   $SitesComplete
   @param   integer   $seiteAktuell
   @return   array      $ausgabe

Die Funktion navigationsLeiste() berechnet die Gesamtzahl der anzuzeigenden Seiten, aktiviert oder deaktiviert die Seitennummer für die Verlinkungen und stellt die Möglichkeiten für „Eine Seite zurück“ oder „Eine Seite vor“ in einem Array dar.

Die Funktion erwartet als Parameter die kompletten anzuzeigenden Seiten, die aktuelle per GET übermittelte Seite und die Menge der anzuzeigenden Seitenzahlen.

Zuerst dividieren wir die anzuzeigenden Seitenzahlen durch 2 und runden das Ergebnis ab (83). Mit diesem Wert bauen wir links und rechts um unsere aktuelle Seitenzahl das Menü auf.

Nachfolgend ein Beispiel mit elf Seitenzahlen. Die aktuelle Seite ist hier 9.

11 / 2 = 5.5 abgerundet 5

Angenommen, wir können 30 Seitenzahlen darstellen, so wird die Ausgabe folgendermaßen aussehen – also auf jeder Seite fünf Seitenzahlen.

4 5 6 7 8 9 10 11 12 13 14

Die nächsten Schritte sind lediglich Überprüfungen, ob eine Zahl oder Grafik verlinkt oder angezeigt werden muss.

Sollte die aktuelle Seitenzahl größer als 1 sein (87), so könnte man die Darstellung „Eine Seite zurück“ anzeigen. Daher speichern wir den Wert (Aktuelle Seite – 1) in unser mehrdimensionales Array (89). Zusätzlich wird die Möglichkeit gespeichert, direkt zur ersten Seite zu springen (88).

In unserem Beispiel wird diese Variable später allerdings nicht berücksichtigt. Sie können diese aber problemlos einbinden. Sollten wir uns bereits auf der ersten Seite befinden, so setzen wir den Wert auf FALSE (91).

Im zweiten Teil formulieren wir die Seitenzahlen (1 2 3 4 5 etc.). Wir nehmen als Beispiel wie vorhin eine Menge von elf Seitenzahlen und die aktuelle Seite 9 als Grundlage für unsere Erklärung. Die FOR-Schleife (95) darf bei so einer Navigation nicht bei 0 beginnen, sondern richtet sich jeweils nach der aktuellen Seite. In unserem Fall beginnt die Schleife bei 4 (9-5) und durchläuft sie 11-mal (9+5).

Falls $x größer als 0 (Null) und $x kleiner als die aktuelle Seite ist, wird die anklickbare Seitenzahl in unser Array (98) gespeichert. Ist $x größer als die aktuelle Seitenzahl und $x kleiner als die komplette Seitenzahl, wird die anklickbare Seitenzahl ebenfalls in unser Array (98) gespeichert.

Trifft keines der beiden Auswahlkriterien zu, handelt es sich um eine nicht anklickbare Seitenzahl und die Abfrage des Vergleichs (102) wird ausgeführt. Der Wert wird dann als nicht klickbar gespeichert (103).

Falls die aktuelle Seite kleiner als die komplette Seitenzahl ist, könnte man die Darstellung „Eine Seite vor“ darstellen. Daher speichern wir den Wert (Aktuelle Seite + 1) in unser mehrdimensionales Array (110).

Zusätzlich wird die Möglichkeit gespeichert, direkt zur letzten Seite zu springen (111). In unserem Beispiel wird diese Variable später allerdings nicht berücksichtigt. Sie können diese aber problemlos einbinden. Sollten wir uns bereits auf der letzten Seite befinden, so setzen wir den Wert auf FALSE (113).

Wir geben zum Schluss unser mehrdimensionales Array an die aufrufende Stelle zurück (116).

080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
function navigationsLeiste($SitesComplete,$seiteAktuell,$navLeiste){
        
    
// Die Menge der angezeigten Links für die Seiten werden errechnet 
    
$NavCeil floor($navLeiste 2);
    
    
// Eine Seite zurück oder zum Anfang nur anzeigen, wenn mindestens eine Seite zurück
    // geblättert werden kann 
    
if($seiteAktuell 1){
        
$ausgabe['begin']['second'] = 1;
        
$ausgabe['begin']['first'] = $seiteAktuell-1;
    } else {
        
$ausgabe['begin']['first'] = FALSE;
    }
    
    
// Baut die Seitennavigation aúf (1 2 3 4 5 6 ... n)
    
for($x=$seiteAktuell-$NavCeil;$x<=$seiteAktuell+$NavCeil;$x++){
        
// Alle Seitenzahlen vor und nach der aktuellen Seite verlinken
        
if(($x>&& $x<$seiteAktuell) || ($x>$seiteAktuell && $x<=$SitesComplete)){
            
$ausgabe['middle']['site'][] = $x;
        }
        
        
// Die Seitenzahl der aktuellen Seite nicht verlinken
        
if($x==$seiteAktuell) {
            
$ausgabe['middle']['site'][][0] = $seiteAktuell;
            }
    }
    
    
// Eine Seite vor oder zum Ende nur anzeigen, wenn mindestens eine Seite weiter
    // geblättert werden kann 
    
if($seiteAktuell $SitesComplete){
        
$ausgabe['end']['first'] = $seiteAktuell+1;
        
$ausgabe['end']['second'] = $SitesComplete;
    } else{
        
$ausgabe['end']['end'] = FALSE;
    }
    
    return 
$ausgabe;
    
}
Beispiel 5.8: blaettern_grafik.php

function makeText($ausgabe,$seiteAktuell,$href)
   @param   array     $ausgabe
   @param   integer   $seiteAktuell
   @param   array     $href
   @return   string     $string

Die Funktion makeText() erstellt jetzt mit dem eben erstellten mehrdimensionalen Array die Textausgabe der Seitenzahlen. Als Parameter erwartet die Funktion das mehrdimensionale Array, die aktuelle Seite und den Aufbau der Linkstruktur als Array. Diese Linkstruktur wird bei den Konfigurationsparametern gesetzt. Wir möchten Ihnen an dieser Stelle ein Beispiel liefern.

  $href[0] = '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.$extVariables.'">Zurück</a>';
$href[1] = '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.$extVariables.'">{SITE}</a>';
$href[2] = '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.$extVariables.'">Vorwärts</a>';

Wir durchlaufen wie in der vorherigen Funktion beschrieben unser Array und füllen es mit den Tabellen und Text-Verlinkungen.

Sollte der ausgelesene ArrayInhalt (122) größer oder gleich 1 (Eins) sein, so könnten wir die Ausgabe „Eine Seite zurück“ anzeigen. Da wir in unserer Funktion navigationsLeiste() den Wert für die erste Seite auf FALSE gesetzt haben, greift hier erst bei der zweiten Seite die Abfrage.

Ist also die Seite größer oder gleich, so ersetzen wir in unserer Linkstruktur (siehe obiges Beispiel) die notwendigen Parameter (123) für die Seitenzahl. Ist die Seite kleiner, so speichern wir lediglich ein Leerzeichen.

Wir begeben uns wieder in die FOR-Schleife (129) und durchlaufen das Array, um die Seitenzahlen zu verlinken. Falls es sich bei dem Wert in dem Array um ein weiteres Array handeln sollte (130), so handelt es sich um die aktuelle Seite und wird daher nicht verlinkt, sondern nur als Text angezeigt.

Handelt es sich bei dem Wert nicht um ein Array (133), so müssen wir den Wert als Seitenzahl verlinken. Wir suchen in unserem Array $href[1] nach den Flags {SITE} und ersetzen (134) diese durch die aktuelle Seitenzahl. Das Ergebnis dieser Ersetzung hängen wir der Variablen $string an.

Sollte die aktuelle Seite kleiner als der Wert im ausgelesenen Array-Inhalt (138) sein, könnten wir die Ausgabe „Eine Seite vor“ anzeigen. Ist die aktuelle Seite kleiner, ersetzen wir in unserem Array $href[2] (siehe obiges Beispiel) die notwendigen Parameter (139) für die Seitenzahl. Ist die Seite größer oder gleich, speichern wir lediglich ein Leerzeichen (141).

120:
121:
122:
123:

124:
125:
126:
127:
128:
129:
130:
131:
132:

133:
134:

135:
136:
137:
138:

139:

140:
141:
142:
143:
144:
145:
146:
147:
function makeText($ausgabe,$seiteAktuell,$href) {
    
$string .= '<tr>';
    if(
$ausgabe['begin']['second'] >= || $ausgabe['begin']['first'] >= 1)    {
        
$string .= '<td align="right">'.preg_replace("/{SITE}/i"$seiteAktuell-1
                 $href[0]).'</td>';
        
    } else {
        
$string .= '<td align="right">&nbsp;</td>';
    }
    
    foreach(
$ausgabe['middle']['site'] as $key => $value) {
        if(
is_array($value)) {
            
            
$string .= '<td align="center">'.$ausgabe['middle']['site'][$key][0].
                         '</td>';
        } else {
            
$string .= '<td align="center">'.preg_replace("/{SITE}/i"$value
                        
$href[1]).'</td>';
        }
    }
    
    if(
$seiteAktuell $ausgabe['end']['second'] || 
      
$seiteAktuell $ausgabe['end']['first']){
        
$string .= '<td align="left">'.preg_replace("/{SITE}/i"$seiteAktuell+1
                 $href[2]).'</td>';
    } else {
        
$string .= '<td align="left">&nbsp;</td>';
    }
        
    
$string .= '</tr>';
        
    return 
$string;
}
Beispiel 5.9: blaettern_grafik.php

function makeGraph($ausgabe,$seiteAktuell,$link,$grafik)
   @param   array     $ausgabe
   @param   integer   $seiteAktuell
   @param   string     $link
   @param   array     $grafik
   @return   string     $string

Die Funktion makeGraph() erstellt mit dem eben erstellten mehrdimensionalen Array die Grafikausgabe der Seitenzahlen. Als Parameter erwartet die Funktion das mehrdimensionale Array, die aktuelle Seite, den Aufbau der Linkstruktur und die einzelnen Grafiken als Array-Element für die Darstellung der Seitennavigation. Die Linkstruktur sowie die Grafiken werden bei den Konfigurationsparametern gesetzt. Auch an dieser Stelle liefern wir Ihnen ein Beispiel.

  $link '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.$extVariables.'">{LINK}</a>';
$grafik['backS'] = '<img src="pfeil_links.gif" border="0">';
$grafik['back'] = '<img src="s.gif" border="0">';
$grafik['site'] = '<img src="u_blau.gif" border="0">';
$grafik['none'] = '<img src="u_bbraun.gif" border="0">';
$grafik['next'] = '<img src="che.gif" border="0">';
$grafik['nextE'] = '<img src="pfeil_rechts.gif" border="0">';

Zuerst definieren wir ein Array (150) mit den zu ersetzenden Flags, die bereits in der übergebenen Variable $link gesetzt wurden. Anhand dieser Flags werden nachher die einzelnen Links für die Seitennavigation aufgebaut.

Falls wir uns auf einer größeren Seite als 1 (eins) befinden (155), können wir die Grafiken für „Eine Seite zurück“ anzeigen. Wir ersetzen (159) daher in unserem übergebenen Link die Flags {SITE} und {LINK} durch den jeweiligen Wert für „Eine Seite zurück“ und speichern den String in unsere Variable (159).

Befinden wir uns auf der ersten Seite (161), so dürfen wir die Grafik nicht verlinken, da sie sonst auf 0 (Null) zeigen und es zu einem Fehler kommen würde. Wir speichern daher nur die Grafik ohne Verlinkung in unsere Variable (162).

Wir müssen nun die Grafiken für die einzelnen Seiten aufbauen, also für jede Seite eine eigene kleine Grafik. Wir durchlaufen das Array und speichern entweder eine nicht verlinkte Grafik für unsere aktuelle Seite (168) oder eine verlinkte Grafik (173).

Anschließend müssen wir nur noch das Ende der Seitenverlinkung herstellen. Wenn also unsere aktuelle Seite kleiner (177) ist als die Gesamtmenge, können wir auch „Eine Seite vor“ anzeigen. Wir speichern eine verlinkte Grafik (180) in unsere bestehende Variable (180). Sollten wir uns bereits auf der letzten Seite befinden, müssen wir lediglich die Grafik ohne Verlinkung in unsere Variable speichern (183).

Nachdem wir die komplette Verlinkung erstellt haben, müssen wir diese Variable der aufrufenden Stelle zurückgeben (188).

149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:

174:
175:
176:
177:

178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
function makeGraph($ausgabe,$seiteAktuell,$link,$grafik) {
    
$search = array(
        "/{SITE}/",
        "/{LINK}/"
     );
    
$string .= '<tr>';
    if(
$ausgabe['begin']['second'] >= || $ausgabe['begin']['first'] >= 1) {
        
        
$replace[0] = $seiteAktuell-1;
        
$replace[1] = $grafik['backS'].$grafik['back'];
        
$string .= '<td align="right">'.preg_replace($search$replace$link).'</td>';
        
    } else {
        
$string .= '<td align="right">'.$grafik['back'].'</td>';    
    }
    
    foreach(
$ausgabe['middle']['site'] as $key => $value) {
        if(
is_array($value)) {
            
            
$string .= '<td align="center">'.$grafik['none'].'</td>';
        
        } else {
            
$replace[0] = $value;
            
$replace[1] = $grafik['site'];
            
$string .= '<td align="center">'.preg_replace($search$replace
                        
$link).'</td>';
        }
    }
    
    if(
$seiteAktuell $ausgabe['end']['second'] || 
            $seiteAktuell $ausgabe['end']['first']){
        
$replace[0] = $seiteAktuell+1;
        
$replace[1] = $grafik['next'].$grafik['nextE'];
        
$string .= '<td align="left">'.preg_replace($search$replace$link).'</td>';
        
    } else {
        
$string .= '<td align="right">'.$grafik['next'].'</td>';    
    }
        
    
$string .= '</tr>';
        
    return 
$string;
}
Beispiel 5.10: blaettern_grafik.php

Die Konfigurationsparameter für unser Beispiel sind relativ simpel und schnell geschehen. Wir benötigen dabei folgende Parameter:

  • die maximalen Suchergebnisse (4)
  • die Anzahl der Seitenzahlen bei der Seitenverlinkung (9)
  • den MySQL-Hostnamen (12)
  • die MySQL-Datenbank (13)
  • der MySQL-User (14)
  • das MySQL-Passwort (15)

Zusätzlich benötigen wir die verschiedenen Verlinkungen, zum einen für die Textverlinkung (19) und zum anderen die Verlinkungen für die einzelnen Grafiken. Dabei gibt es folgende Zustände für die Textverlinkungen:

  • Eine Seite zurück (21)
  • Die einzelnen Seiten selbst (22)
  • Eine Seite vor (23)

Für die Verlinkung der einzelnen Grafiken benötigen wir lediglich eine Variable, um nachher alle Grafiken verlinken zu können (24). Die einzelnen Grafiken können Sie über die einzelnen Variablen (27-32) steuern oder austauschen.

Wir müssen jetzt lediglich den Connect zur Datenbank herstellen, um die späteren Datenbankabfragen stellen zu können (35, 36).

001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:

022:

023:

024:

025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:

036:
<?PHP

// Wieviel Einträge pro Seite sollen dargestellt werden?
$maxEintraege 16;

// Wieviel Seitenzahlen in der Navigationsleiste angezeigt werden. Ausgabe kann sein
// << < 2 3 4 5 6 7 8 9 10 11 12 > >>
// Die Berechnung erfolgt nur für ungerade Zahlen!!!
$navLeiste 13;

// Definiert die Parameter für den Datenbank Connect
define("DB_HOST","localhost"); // MySQL hostname
define("DB_NAME","db151892537"); //MySQL db-name
define("DB_USER","dbo151892537"); //MySQL User
define("DB_PASS","FDvmhU8E"); // MySQL Passwort

// Weitere Variablen den Seitenzahlem mit übergeben in Form:
// &var1=wert1&var2=wert2
$extVariables '&textfield='.urlencode($_GET['textfield']);

$href[0] = '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.
             $extVariables.'">Zurück</a>';
$href[1] = '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.
             $extVariables.'">{SITE}</a>';
$href[2] = '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.
            
$extVariables.'">Vorwärts</a>';
$link '<a href="'.$_SERVER["SCRIPT_NAME"].'?site={SITE}'.
             $extVariables.'">{LINK}</a>';
$infoText 'Ergebnisse {ERGEBNIS} von ungefähr {MENGE}. ({SEKUNDEN} Sekunden) ';
$tableNavi '<div align="center"><table>{TABLENAVI}</table></div>';
$grafik['backS'] = '<img src="pfeil_links.gif" border="0">';
$grafik['back'] = '<img src="s.gif" border="0">';
$grafik['site'] = '<img src="u_blau.gif" border="0">';
$grafik['none'] = '<img src="u_bbraun.gif" border="0">';
$grafik['next'] = '<img src="che.gif" border="0">';
$grafik['nextE'] = '<img src="pfeil_rechts.gif" border="0">';

// Datenbank Connect herstellen
$db = @MYSQL_CONNECT(DB_HOST,DB_USER,DB_PASS) or 
             die(
"Datenbank-Connect fehlgeschlagen");
$db_check = @MYSQL_SELECT_DB(DB_NAME) or 
            die(
"Datenbank momentan nicht erreichbar");
Beispiel 5.11: blaettern_grafik.php

Wir müssen zu Beginn als Erstes den Timer für die spätere Anzeige setzen (192). Hierbei wird die aktuelle Zeit gespeichert. Wurde eine Seitenzahl durch den Besucher angeklickt, ist unsere Variable $_GET[’site’] mit einem Wert gefüllt (195). Da wir nur IntegerWerte benötigen, erzwingen wir mit der Addition von 0 (Null) eine Konvertierung der Variable in einen IntegerWert.

Falls die Variable leer ist oder Null (198), setzen wir den Startwert auf 1 (Eins) (199). Wir errechnen jetzt den Wert für unsere spätere Datenbankabfrage. Wir wollen erreichen, dass ab einer bestimmten Position in der Datenbank die Datensätze ausgelesen werden. Wenn wir also z. B. 16 Einträge anzeigen lassen wollen, so müssen wir den Wert folgendermaßen berechnen:

  • Seite 1 1 * 16 – 16 = 0
  • Seite 2 2 * 16 – 16 = 16
  • Seite 3 3 * 16 – 16 = 32

Dies geht dann bis zur maximalen Anzahl so weiter. Wir haben somit den jeweiligen Startwert für unsere Abfrage (205). Es kann so ein Limit bei der Abfrage gesetzt werden, da wir den Startwert und die maximalen Einträge vorliegen haben. Als Ergebnis erhalten wir nur die maximale Menge, mehr nicht.

Wir müssen jedoch vor der Abfrage die übermittelte Suchanfrage für die Datenbank sicher machen (SQL Injection Angriffen)(206), sodass kein schadhafter Befehl an die Datenbank gesendet werden kann

Was jetzt noch fehlt, sind die gesamten Suchtreffer, da wir diese ebenfalls anzeigen möchten. Wir setzen also nochmals die gleiche Abfrage ab (210), allerdings diesmal ohne ein Limit und ohne Werte aus der Datenbank.

Wir speichern den gefundenen Wert der Gesamtmenge (212) und berechnen daraus die maximalen Seitenzahlen (215). Wir müssen lediglich darauf achten, diesen Wert noch aufzurunden, um alle Datensätze anzeigen zu können.

Wir übergeben die Werte an die Funktion navigationsLeiste() (218) und erhalten als Rückgabewert ein Array mit allen Navigationselementen. Dieses Array geben wir anschließend an die Funktion makeText() (220) für die Textverlinkung und an die Funktion makeGraph() (222) für die Grafikverlinkung. Wir erhalten jeweils als Rückgabewert einen String mit der formatierten Seitennavigation.

Im nächsten Schritt müssen wir unsere Datenbankabfrage mit den Ergebnissen ausgeben (225-228) und danach nochmals den Timer für die Gesamtzeit aufrufen (231). Dabei übergeben wir der Funktion endTime() den Startwert und erhalten als Rückgabewert die komplette Suchzeit.

Jetzt haben wir alle Informationen zusammen, um unseren Hinweistext für die Ausgabe vorzubereiten (233). Dieser Text beinhaltet z. B. die Suchzeit, die aktuellen Datensätze als Zahl und die Suchtreffer. Zum Schluss müssen wir nur noch die Navigationsleiste in unserer Variablen ersetzen (235).

191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:

208:
209:
210:
211:

212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
// Startet den Timer
$timer startTime();

// Die aktuell angeforderte Seite
$seiteAktuell $_GET['site'] + 0;

// Falls noch keine Seitenzahl übergeben wurde, den Wert auf die erste Seite setzen
if(empty($seiteAktuell))
    
$seiteAktuell 1;
    
// Berechnet die nächsten Eintraege aus MAX_EINTRAEGE
$start $seiteAktuell $maxEintraege $maxEintraege

// Holt die aktuellen Datensätze aus - define("MAX_EINTRAEGE",10)
//$result = @mysql_query("SELECT * FROM suchmaschine LIMIT $start, ".$maxEintraege);
$textfieldSecure = @mysql_real_escape_string(stripslashes($_GET['textfield']));
$result = @mysql_query("SELECT * FROM suchmaschine WHERE words LIKE('%".
      
$textfieldSecure."%') LIMIT $start, ".$maxEintraege);

// Ermittelt die Gesamtzahl der Datensätze
//$resultGesamt = @mysql_query("SELECT COUNT(*) AS menge FROM suchmaschine"); 
$resultGesamt = @mysql_query("SELECT COUNT(*) AS menge FROM suchmaschine WHERE words 
      LIKE('%"
.
$textfieldSecure."%')"); 
$Eintraege = @mysql_result($resultGesamt,0,"menge");

// Errechnet die kompletten Seiten
$SitesComplete ceil($Eintraege $maxEintraege);

// Navigation mit in Ausgabe einfügen
$ausgabe navigationsLeiste($SitesComplete,$seiteAktuell,$navLeiste); 

$ausgabeText makeText($ausgabe,$seiteAktuell,$href);

$ausgabeGraph makeGraph($ausgabe,$seiteAktuell,$link,$grafik);

// Ausgabe der Seite
while($row = @mysql_fetch_row($result)){
    
// Hier findet die Ausgabe des Seiteninhalts statt
    
$contentWeb .= $row[2] . '<br>';
}

// Beendet den Timer
$endTime endTime($timer);

$infoText makeInfo($endTime,$seiteAktuell,$maxEintraege,$Eintraege,$infoText);

$leisteBottom preg_replace("/{TABLENAVI}/"$ausgabeGraph $ausgabeText$tableNavi);
Beispiel 5.12: blaettern_grafik.php

Wie Sie sehen, haben Sie jetzt eine fast fertige Lösung für eine Suchmaschine à la Google. Sie müssen selbstverständlich noch einige Dinge anpassen, werden dies aber relativ einfach lösen können.



 


Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!

Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.


 




:: Premium-Partner ::

Webhosting/Serverlösungen


Premium-Partner MECO Systemhaus GmbH & Co. KG
Premium-Partner PSW GROUP GmbH & Co. KG
Premium-Partner BPI-Systeme
Premium-Partner Pixel X
Premium-Partner
 

:: SELFPHP Sponsoren ::


Microsoft Deutschland GmbH
twosteps.net - ...Premium-Webhosting
Sedo - Bei uns wird PHP großgeschrieben
hostfactory.ch - OptimaNet Schweiz AG
ZEND - The PHP Company
Kaspersky Labs
HighText iBusiness
SELFPHP Sponsoren
 

Qozido


© 2001-2009 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt