DVA Praktikum – Versuch 1 Gruppe 20
Transcription
DVA Praktikum – Versuch 1 Gruppe 20
DVA Praktikum – Versuch 1 Gruppe 20 von Yannic Chermette, Tobias Kloastermair und Philipp Kaufman Aufgabenstellung: Realisieren Sie mit PHP : einen Taschenrechner einen Bankautomat • einen Linkcrawler • • Herangehensweise(Taschenrechner): Als erster Schritt wurde eine neue Datei(taschenrechner.php) mit Gedit erstellt. Im zweiten Schritt wurde mit Hilfe von Html die Oberfläche erstellt, sie besteht aus einer Form,die einen Select(zur Auswahl des Rechenzeichens), 2 Inputfeldern(Zahleingabe)und einen Button für die Berechnung(eigentlich „absenden“ der Eingaben an POST) besitzt . Im dritten schritt wurde die logik des Taschenrechners mit PHP realisiert. Wenn der Button gedrückt wird, werden die Inhalte der Inputfelder(+Rechenzeichen) in die POST Variable übertragen und können somit ausgelesen und verarbeitet werden werden. Zunächst wird überprüft ob Zahlen eingegeben wurden, danach wird mit einem Switch die richtige Rechenart anhand des Rechenzeichens bestimmt und die Berechnung in $ergebnis gespeichert. Zum Schluss wird die gesamte Rechenaufgabe mit Ergebnis angezeigt (über echo + String). Bankautomat: Der Bankautomat besteht aus einer HTML-Form, welche die Benutzereingaben verarbeitet. Mögliche Eingaben sind die Kontonummer, ein Betrag sowie eine Operation (Ein- bzw. Auszahlung) welche auszuführen ist. Form zur Eingabe der Kontonummer sowie eines Betrages Source-Code der Form Nach Eingabe der Kontodaten sowie eines Betrages und Auswahl einer Operation wird der Nutzer nach Absenden des Formulares auf eine weitere Seite geleitet, welche verschiedenen Erfolgs- bzw. Fehlermeldungen bereithält. Wurde kein Konto mit dieser Kontonummer gefunden oder reicht das Guthaben eines Kontos nicht aus, so wird eine entsprechende Meldung angezeigt; ansonsten erscheint eine Erfolgsmeldung. Die verschiedenen Konten werden mit ihrer Kontonummer sowie dem aktuellen Guthaben in einer MySQL-Tabelle gespeichert. Diese ist simpel aufgebaut: ID, Kontonummer sowie Guthaben. Aufbau der Tabelle Source Code der Antwort-Seite nach Absenden des Formulares Hier wird zuerst abgefragt, ob das Formular bereits abgeschickt wurde, ist dies nicht der Fall erfolgt keinerlei Ausgabe. Nun wird unterschieden zwischen einer Auszahlung und einer Einzahlung. Im Falle einer Einzahlung wird der angegebene Betrag dem angegebenen Konto gutgeschrieben und anschliessend der neue Kontostand ausgegeben. Bei einer Auszahlung wird zuerst überprüft, ob das Konto über ausreichend Deckung verfügt um den gewünschten Betrag auszuzahlen. Ist dies nicht der Fall, wird eine entsprechende Fehlermeldung ausgegeben. Reicht das Guthaben aus, wird abgebucht und der neue Kontostand wird angezeigt. Einfacher Webcrawler Was ist ein Webcrawler? Ein Webcrawler ist ein kleines Tool mit dem man Webseiten aufrufen und nach bestimmten Eigenschaften filtern kann. Außerdem filtern die meisten Webcrawler noch die Links von einer Webseite und führt die Analyse auch bei diesen Unterseiten bzw. verlinkten Seiten aus. Bekanntes Beispiel Der bekannteste Webcrawler ist der berühmte Google Crawler. Dieser holt sich den Content von Webseiten und wertet diesen Inhalt für die Suchmaschinenpositionen für bestimmte Keywörter aus. Wie funktioniert und was kann unser einfacher Webcrawler? Bei unserem Tool kann eine Startseite angegeben werden – quasi eine Url – und es kann eine Tiefe mit angegeben werden. Anhand der Tiefe wird entschieden wie weit die Webseiten analysiert werden. Eine Tiefe 1 gibt an das nur die angegebene Startseite analysiert wird. Eine Tiefe 2 besagt, das auch die Seiten hinter den Links von der Startseite analysiert wird. Sobald man den Startbutton betätigt werden alle Title-Tags von den jeweiligen Webseiten herausgezogen. Der Code index.php Die index.php wird aufgerufen sobald man per Browser den Ordner – in dem das Tool abgelegt ist auf dem Webserver aufruft. In einem einfachen html-Formular wird die Informationen von Start-Url und der Tiefe entgegengenommen. Mit einem Klick auf den Startbutton werden die Informationen per Post an die result.php übergeben. <html> <head> <title>Versuch 1 - Ein einfacher Webcrawler</title> </head> <body> <h1>Ein einfacher Webcrawler</h1> <form action="result.php" method="post"> <p> Start-Url<br> <input name="start_url" type="text" size="30"> </p> <p> Tiefe<br> <select name="deep" size="1"> <?php for($i=1;$i<=100;$i++){ echo "<option>".$i."</option>"; } ?> </select> </p> <input type="submit" value="Start"> </form> </body> </html> result.php Hier werden die Daten von Post ausgelesen und die benötigten Funktionen werden aus der funktions.php inkludiert. Anschließend wird der eigentliche Crawler-Algorithmus gestartet. Der Rückgabewert ist ein Array und wird mit dem Standart-PHP-Befehl print_r ausgegeben. <?php //include functions include "functions.php"; //get input from form $start_url = $_POST["start_url"]; $deep = $_POST["deep"]; //get content from url echo "<pre>"; print_r(startProcess($start_url, $deep)); ?> functions.php In dieser Datei sind die eigentlichen Crawler-Algorithmus-Funktionen. Diese werden im Nachfolgenden im Code beschrieben. getContentFromUrl($url) Hier wird die entgegengenommene URL übergeben und der Content dieser Url wird per Curl geholt und auch zurückgegeben. getTitleByHtmlContent($html_content) Der von getContentFromUrl zurückgegebene Content wird hier übergeben und es wird erst überprüft ob es ein Title-Tag gibt. Wenn ja, dann wird eben der Titel zurückgegeben. Falls nein, dann wird „no title“ zurückgegeben. getLinksByHtmlContent($html_content) Hier wird wieder der von getContentFromUrl zurückgegebene Inhalt übergeben und die Links werden mit „preg_match_all“ ausgelesen. Für diese Funktion wird ein Regular-Expression-Pattern benötigt. Mit dem Pattern |<a.*?href=“(.*?)“| kann man HTML-typische Links ermitteln. Diese werden alle heraus gefiltert und per Array zurückgegeben. convertLink($link, $start_url) Hier wird jeder ausgelesene Link übergeben und konvertiert. Falls nämlich interne Links ausgelesen werden – Bsp. /unterseite.html – dann wird die Haupturl noch davorgehängt. Das wird gemacht weil Curl ordentliche Links benötigt. startProcess($url, $deep, $title_array = array()) In dieser Funktion – der Hauptfunktion – werden zunächst die 3 Methoden von oben aufgerufen und die selbe Funktion rekursiv je nach angegebener Tiefe wiederholt nochmal. Zurückgegeben wird das Title-Array von allen aufgerufenen Seiten. <?php function getContentFromUrl($url){ $cl = curl_init(); curl_setopt($cl, CURLOPT_URL, $url); curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1); $content_from_url = curl_exec($cl); curl_close($cl); return $content_from_url; } function getTitleByHtmlContent($html_content){ if(preg_match("~<title>~", $html_content)){ $first_split_array = preg_split("~<title>~", $html_content); $second_split_array = preg_split("~</title>~", $first_split_array[1]); return $second_split_array[0]; } return "no title"; } function getLinksByHtmlContent($html_content){ $regex='|<a.*?href="(.*?)"|'; preg_match_all($regex,$html_content,$parts); return $parts[1]; } function convertLink($link, $start_url){ if(!preg_match('~http://~', $link)){ return $start_url."/".$link; } return $link; } function startProcess($url, $deep, $title_array = array()){ $content_from_start_url = getContentFromUrl($url); $title_array[] = getTitleByHtmlContent($content_from_start_url); $link_array = getLinksByHtmlContent($content_from_start_url); if($deep == 1){ return $title_array; } else { foreach($link_array as $link){ $title_array = startProcess(convertLink($link, $url), $deep-1, $title_array); } return $title_array; } } ?>