PHP MySQL
Askme mit MySQLTutorials » PHP/MySQL Tutorials » Askme mit MySQL
Askme mit MySQL - Tutorial
Im Wishbook wurde ein Tutorial gewuenscht, dass aufzeigt, wie man ein Askme erstellt, wo nicht alles in einer einzigen Datei steckt ...Ich bin zwar der Meinung, dass man sich nicht unnoetig viel Gepaeck aufladen sollte, aber nun denn ...
Unser Askme wird aus insgesamt 11 Dateien bestehen, nein kein Schreibfehler, wunderschoene 11 Dateien -.-
Wer es deutlich handlicher moechte, der liest hier bitte nicht weiter, sondern widmet sich dem Tutorial Ask and answer, da kommt am Schluss genau das Selbe in gruen bei raus, nur eben in einer einzigen Datei!
Was wird benoetigt?
- PHP / MySql Grundkenntnisse
- 1 MySql Datenbank
- Webspace der PHP unterstuetzt
Wie schauts aus?
- Askme
- Admin => Login
- Admin => Uebersicht
- Admin => Antworten
Step 1 - Die Datenbank
Als erstes erstellen wir eine neue Tabelle in der Datenbank(mit PHPMyAdmin)
CREATE TABLE IF NOT EXISTS `askme` ( `id` int(11) NOT NULL AUTO_INCREMENT, `frage` text NOT NULL, `antwort` text NOT NULL, `f_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `a_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `status` enum('B','U') NOT NULL DEFAULT 'U', `ip` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) );
Step 2 - DB Verbindung | config.inc.php
Config.inc.php heisst unsere Datei mit der wir eine Verbindung zur Datenbank herstellen
<?php // config.inc.php //--------------------------- $host = "localhost"; // Adresse des Datenbankservers, fast immer localhost $user = ""; // Dein MySQL Benutzername $pass = ""; // Dein MySQL Passwort $dbase = ""; // Name der Datenbank //--------------------------- $connection = mysql_connect("$host","$user","$pass") OR DIE ("Keine Verbindung zu der Datenbank moeglich."); $db = mysql_select_db($dbase , $connection) OR DIE ("Auswahl der Datenbank nicht moeglich."); ?>
Step 3 - ask_me.php
Die Datei ask_me.php listet alle bisher gestellen Fragen, welche beantwortet wurden, auf...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"> <head> <title>Grafixx - Askme</title> <meta http-equiv="Content-Language" content="de" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="imagetoolbar" content="no" /> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div id="ram"> <h1 id="header">Grafixx - Askme</h1> <br /> <?php include('config.inc.php'); // DB-Verbindung einbinden include('function.php'); // Funktion einbinden $pfad = $_SERVER['PHP_SELF']; // generiert aktueller Pfad zur Datei //------------------------------------------------------------------------ echo"<h1>Frag mich ...</h1>"; // ALLE fragen zaehlen $alle = "SELECT id FROM askme"; $result_a= mysql_query($alle, $connection) or die (mysql_error()); $total = mysql_num_rows($result_a); // ALLE unbeantworteten fragen zaehlen $unbe = mysql_query("SELECT id, frage, ip FROM askme WHERE status='U'"); $unbeantwortet = mysql_num_rows($unbe); // ---------------------------------- Fragen auslesen -------------------------------------------- $show = "id, DATE_FORMAT(f_date, '%d.%m.%Y') AS f_datum, DATE_FORMAT(a_date, '%d.%m.%Y') AS a_datum, frage, antwort"; $result = mysql_query("SELECT $show FROM askme WHERE status='B'"); // DB Abfrage aller Eintrage mit status = B $beantwortete = mysql_num_rows($result); // Anzahl der beantworteten Fragen if ($total == '1'){ echo "<p>Es wurde bisher <strong> $total</strong> Frage gestellt"; }else{ echo "<p>Es wurden bisher <strong> $total</strong> Fragen gestellt"; } if($unbeantwortet == '1'){ echo ", <br /><strong> $unbeantwortet </strong> Frage davon ist noch unbeantwortet ...</p>"; }else{ echo ", <br /><strong> $unbeantwortet </strong> Fragen davon sind noch unbeantwortete ...</p>"; } // ------------------- Formular zum Fragen einbinden ----------------------------------------------- include('ask.php'); // ------------------------------------------------------------------------------------------------- echo "<h1>Frage & Antwort ...</h1><br />"; // Headline ausgeben // ---------------------- Seitennavigationsdaten -------------------------------------------------- $links_per_page = "5"; // Anzahl der Links die Pro Seite angezeigt werden sollen $p = "5"; // Anzahl der Links die in der Seitenavigation ausgegeben werden include('navigation.php'); // Seitennavigation einbinden // ---------------------- ENDE Seitennavigationsdaten---------------------------------------------- // Pruefen ob Fragen vorhanden if(!$result || mysql_num_rows($result)<1) { echo "<p>Es sind bisher noch keine Fragen vorhanden ...</p>\n"; } else { // Datenbank-Abfrage ----------------------------------------------- $abfrage = mysql_query("SELECT $show FROM askme WHERE status='B' ORDER BY id DESC LIMIT $start,$links_per_page"); while ($row=mysql_fetch_array($abfrage)) { // Ausgabe der Fragen ... extract($row); echo "<div class=\"line\">\n"; echo "<strong>Frage:</strong><br />"; echo $frage; // Frage ausgeben echo "<br /><br />"; echo "<strong>Antwort:</strong><br />"; echo $antwort; // Antwort ausgeben echo "<div align=\"right\">"; echo "Gestellt am <strong>".$f_datum."</strong> | Beantwortet am <strong> ".$a_datum."</strong></div>\n"; echo "</div>\n <br />\n "; } // close while } // close nix vorhanden echo "<div id=\"navigation\">\n"; echo "<span class=\"pages\">Seite $go von $pages</span>\n"; echo $link_string; // Ausgabe der Seitennavigation echo "</div> \n"; ?> <h3>Grafixx - Askme <a href="http://alice-grafixx.de">Alice-Grafixx.de</a> <?php echo date('Y'); ?> | <a href="login.php">Login</a></h3> </div> </body> </html>
Step 4 - ask.php
In unsere Datei ask_me.php wird die Datei ask.php mittels include() Befehl eingebunden, die Datei ask.php ist dafuer zustaendig, dass Fragen gestellt werden koennen ...
<?php // ask.php // ---------------------------------- Wenn LOS gedrueckt -------------------------------------------- if (isset($_POST['go'])){ // sofern submit gedrueckt $ask = clean_it($_POST['frage']); // Uebergebene Daten bereinigen if (empty($_POST['frage'])) { echo "<div class=\"tut\"><h1>Error ...</h1>\n"; echo "<p>Wenn du keine Frage stellst, kann ich dir auch nicht antworten ...</p></div>\n"; }else{ $visitorip = $_SERVER['REMOTE_ADDR']; // ip auslesen // pruefen ob IP schon eine Frage gestellt hat in den letzen 5 Minuten $check_ip = mysql_query("SELECT id FROM askme WHERE f_date > DATE_SUB(NOW(), INTERVAL 5 MINUTE) AND ip = '$visitorip'"); if(mysql_num_rows($check_ip) == 0){ // Wenn mit der IP noch keine Frage gestellt wurde // Datenbankeintrag $eintragen = mysql_query("INSERT INTO askme (id, ip, frage, f_date) VALUES ('','$visitorip','$ask',now())"); // Wenn Frage erfolgreich in DB eingetragen if ($eintragen){ echo "<div class=\"error\"><h2>Wunderbar ...</h2>\n"; echo "<p>Die Frage wurde erfolgreich eingereicht ... </p></div>\n"; }else{ // Wenn nicht erfolgreich in DB eingetragen echo "Da lief was schief ...\n"; } }else{ // Fehler ausgeben, wenn schon gefragt echo "<div class=\"error\"><h1>Error ...</h1>\n"; echo "<p>Du hast schon ein Frage in den letzten 5 Minuten gestellt ...<br /><br />\n"; echo "Bitte versuch es spaeter nochmal ;)<br /></p>\n </div>\n"; } // close Fehlerausgeben }// close empty }// close isset submit if(!$eintrag){ //-------------------------------------------------------------- Formular um Frage zu stellen ?> <form method="post" action=""> <p>Frag auch du mich etwas ... <br /> <input type="text" name="frage" size="50"/> <input type="submit" value="Los!" name="go" /></p> </form> <?php } // close eintrag ?>
Step 5 - login.php
Die Datei login.php enthaelt das Formular zum Einloggen in den Admin-Bereich unseres Askme Scriptes ...
<?php //login.php session_start(); // startet die Session //---------------------- Logindate --------------------------------- // $grafixx_name = "USERNAME"; // Loginname angeben $grafixx_pass = "PASSWORT"; // Loginpasswort angeben //------------------------------------------------------------------ // ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"> <head> <title>Grafixx - Askme || Adminpanel</title> <meta http-equiv="Content-Language" content="de" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="imagetoolbar" content="no" /> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div id="ram"> <h1 id="header">Grafixx - Askme</h1> <br /> <?php if(isset($_POST['admin_login'])) { // sofern submit gedrueckt $login_name = strip_tags($_POST['admin_name']); // Variable definieren $login_pass = strip_tags($_POST['admin_pass']); // Variable definieren if(empty($login_name)) { $message .= 'Bitte geben Sie ihren Usernamen ein ... <br />'; $error = "1"; } if(empty($login_pass)) { $message .= 'Bitte geben Sie ihr Passwort ein ... <br />'; $error = "1"; } if($login_name != $grafixx_name OR $login_pass != $grafixx_pass){ $message .= 'Zugriff verweigert ... <br />'; $error = "1"; } if($error != "1"){ // session handle----------------------------- $_SESSION['login'] = $_SERVER['REMOTE_ADDR']; echo "<meta http-equiv=\"refresh\" content=\"0; URL=admin.php\">"; } if($error == "1"){ echo "<h1>Error ...</h1>\n <p>$message</p>"; } } // close isset [admin_login] ?> <form action="" method="post"> <fieldset style="width: 300px"> <legend>Login</legend> <label for="user">Username: </label> <input type="text" name="admin_name" style="width: 250px" /> <label for="passwort">Passwort: </label> <input type="password" name="admin_pass" style="width: 250px" /> <br /><br /> <input type="submit" value=" Login " name="admin_login" /> </fieldset> </form> <h3>Grafixx - Askme <a href="http://alice-grafixx.de">Alice-Grafixx.de</a> <?php echo date('Y'); ?></h3> </div> </body> </html>
Hier MUESSEN die Variablen $grafixx_name und $grafixx_pass mit den Zugangsdaten bestueckt werden!!!
Step 6 - admin.php
Es folgt die Datei admin.php, diese Datei listet uns ALLE unbeantworteten Fragen auf, damit diese dann beantwortet oder ggf. geloescht werden koennen ...
<?php // admin.php include('login_check.php'); // Login-Check einbinden include('config.inc.php'); // DB-Verbindung einbinden include('function.php'); // Funktion einbinden ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"> <head> <title>Grafixx - Askme</title> <meta http-equiv="Content-Language" content="de" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="imagetoolbar" content="no" /> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div id="ram"> <h1 id="header">Grafixx - Askme</h1> <br /> <?php // ----------------------------------------------------------------------------------- // Auflisten alle unbeantworteten Fragen // ----------------------------------------------------------------------------------- $result = mysql_query("SELECT id, frage FROM askme WHERE status ='U'"); // ---------------------- Seitennavigationsdaten -------------------------------------------------- $links_per_page = "5"; // Anzahl der Links die Pro Seite angezeigt werden sollen $p = "5"; // Anzahl der Links die in der Seitenavigation ausgegeben werden include('navigation.php'); // Seitennavigation einbinden // ---------------------- ENDE Seitennavigationsdaten---------------------------------------------- echo "<h1>Unbeantwortete Fragen</h1>"; if($total_records < 1){ // Pruefen ob Fragen beantwortet werden muessen echo "<p>Zur Zeit existieren keine unbeantworteten Fragen ...</p>"; }else{ $abfrage = mysql_query("SELECT id, frage FROM askme WHERE status ='U' ORDER BY id DESC LIMIT $start,$links_per_page"); while ($row=mysql_fetch_array($abfrage)) { // Ausgabe der Fragen ... extract($row); echo "<div class=\"line\">\n"; echo "<strong>Frage:</strong><br />"; echo $frage; // Frage ausgeben echo "</div>\n <br />\n "; echo "<div align=\"right\">\n <a href=\"answer.php?id=$id\">[ beantworten ]</a> <a href=\"delete.php?id=$id\" >[ loeschen ]</a></div>\n"; } // close while // ---------------------- Seitennavigation ausgeben ------------------------------------------ echo "<div id=\"navigation\">\n"; echo "<span class=\"pages\">Seite $go von $pages</span>\n"; echo $link_string; // Ausgabe der Seitennavigation echo "</div> \n"; } // close fragen vorhanden echo "<h3>Grafixx - Askme <a href=\"http://alice-grafixx.de\">Alice-Grafixx.de</a> ".date('Y')." | "; if(isset($_SESSION['login'])){ // Admin Logout echo "<a href=\"logout.php\">logout</a>"; } ?> </h3> </div> </body> </html>
Step 7 - answer.php
Die Datei answer.php ist fuer das Beantworten einer Frage zustaendig ...
<?php // answer.php include('login_check.php'); // Login-Check einbinden include('config.inc.php'); // DB-Verbindung einbinden include('function.php'); // Funktion einbinden ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"> <head> <title>Grafixx - Askme</title> <meta http-equiv="Content-Language" content="de" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="imagetoolbar" content="no" /> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div id="ram"> <h1 id="header">Grafixx - Askme</h1> <br /> <?php $id = clean_it($_GET['id']); // Variable definieren und saeubern if (!isset($_GET['id'])){ // Pruefen ob ID uebergeben wurde echo "<div class=\"error\"><h2>Error ...</h2>\n"; echo "<p>Es wurde keine ID uebergeben</p>\n</div>\n"; }else{ // Sofern ID uebergeben wurde // Abfrage der Daten $abfrage = mysql_query("SELECT frage,ip FROM askme WHERE id='$id'"); // Ausgabe der Daten $row = mysql_fetch_object($abfrage); echo "<h2>Frage ".$id." beantworten</h2>\n <p><strong>Frage:</strong> ".$row->frage."\n"; echo "<small>von IP ".$row->ip."</small></p>\n"; if (isset($_POST['okay'])){ // Wenn auf absenden geklickt wurde $antwort = clean_it($_POST['antwort']); if (empty($_POST['antwort'])) { echo "<div class=\"error\"><h2>Error ...</h2>\n"; echo "<p>Bitte Danke Antwort eingeben ...</p></div>\n"; }else{ // Datenbankeintrag $antworten = mysql_query("Update askme SET antwort ='$antwort', a_date = now(), status='B' WHERE id ='$id'"); // Wenn Frage erfolgreich beantwortet wurde if ($antworten){ echo "<meta http-equiv=\"refresh\" content=\"0; URL=admin.php\">"; // Weiterleitung => Login }else{ // wenn nicht beantwortet wurde echo "Da lief was schief ...\n"; } }// close empty } // close Post submit ?> <form method="post" action=""> <textarea rows="8" name="antwort" cols="54" class="form"></textarea><br /> <input type="submit" value="Absenden" name="okay" class="button" /> </form> <?php } // close isset ID echo "<h3>Grafixx - Askme <a href=\"http://alice-grafixx.de\">Alice-Grafixx.de</a> ".date('Y')." | "; if(isset($_SESSION['login'])){ // Admin Logout echo "<a href=\"logout.php\">logout</a>"; } ?> </h3> </div> </body> </html>
Step 8 - delete.php
Die Datei delete.php ist fuer das Loeschen einer unbeantworteten Frage zustaendig ...
<?php // delete.php include('login_check.php'); // Login-Check einbinden include('config.inc.php'); // DB-Verbindung einbinden include('function.php'); // Funktion einbinden $id = clean_it($_GET['id']); // Variable definieren und saeubern if (!isset($_GET['id'])){ // Pruefen ob ID uebergeben wurde echo "<div class=\"error\"><h2>Error ...</h2>\n"; echo "<p>Es wurde keine ID uebergeben</p>\n</div>\n"; }else{ // Sofern ID uebergeben wurde $delete = mysql_query("DELETE FROM askme WHERE id='$id'"); // Frage Loeschen if($delete){ // Wenn erfolgreich geloescht echo "<meta http-equiv=\"refresh\" content=\"0; URL=admin.php\">"; // Weiterleitung => admin.php }else{ // Wenn nicht => Fehler ausgeben echo "<div class=\"error\"><h2>Error ...</h2>\n"; echo "<p>Die Frage konnte nicht geloescht werden</p>\n</div>\n"; }// close $delete } // close GET id ?>
Step 9 - logout.php
Und dann gaebe es noch die Datei logout.php, welche zum Abmelden fuer den Admin-Bereich verantwortlich ist ...
<?php // logout.php session_start(); // startet die Session session_unset(); // Sessionvariable loeschen session_destroy(); // Session zerstoeren echo "<meta http-equiv=\"refresh\" content=\"0; URL=login.php\">"; // Weiterleitung => Login ?>
Step 10 - navigation.php
Als naechstes haetten wir dann die Datei navigation.php, diese Datei wird sowohl als auch in die admin.php und die ask_me.php eingebunden, da diese uns ermoeglicht eine Blaetterfunktion fuer die Fragen zu bieten ...
<?php // navigation.php $total_records = mysql_num_rows($result); $pages = ceil($total_records / $links_per_page); // korrigieren der aktuellen Seite if(empty($_GET['go'])) { $go = 1; } elseif($_GET['go'] <= 0 || $_GET['go'] > $pages) { $go = 1; } else { $go = $_GET['go']; } // Linkkette $links = array(); if(($go - $p) < 1){ $prevOffset = $go - 1; }else { $prevOffset = $p; } if(($go + $p) > $pages) { $nextOffset = $pages - $go; }else { $nextOffset = $p; } $off = ($go - $prevOffset); if ($go- $prevOffset > 1){ $first = 1; $links[] = "<a href=\"".$pfad."?go=$first\" title=\"Zur ersten Seite springen\">« Erste ...</a>\n"; } if($go != 1){ $prev = $go-1; $links[] = "<a href=\"".$pfad."?go=$prev\" title=\"Zurueck zur letzen Seite\"> «</a>\n"; } for($i = $off; $i <= ($go + $nextOffset); $i++){ if ($i != $go){ $links[] = "<a href=\"".$pfad."?go=$i\" title=\"Seite $i anzeigen\">$i</a>\n"; }elseif($i == $pages) { // aktuelle Seite, braucht keinen Link $links[] = "<span class=\"current\">[ $i ]</span>\n"; } elseif($i == $go){ // aktuelle Seite, braucht keinen Link $links[] = "<span class=\"current\">[ $i ]</span>\n"; } } if($go != $pages){ $next = $go+1; $links[] = "<a href=\"".$pfad."?go=$next\" title=\"Weiter zur naechsten Seite\"> » </a>\n"; } if ($off+$prevOffset*2 < $pages){ // zur letzen Seite springen $last = $pages; $links[] = "<a href=\"".$pfad."?go=$last\" title=\"Zur letzen Seite springen\">... Letzte »</a>\n"; } $link_string = implode(" ", $links); // Packt alles in einen String $start = ($go-1) * $links_per_page; ?>
Step 11 - function.php
Und dann gaebe es da noch die Datei function.php, sie ist fuer das 'Saeubern' der Daten zustaendig, welche mit der DB zu tun haben, die Datei wird mittels include() Befehl in alle Dateien eingebunden, welche mit der DB was am Hut haben ...
<?php // function.php // Funktion um die DB-Eintraege zu pruefen => SQL Injektions function clean_it($dirty){ // Auswirkungen von magic_quotes_gpc zuruecksetzen, wenn ON if (get_magic_quotes_gpc()) { $clean = mysql_real_escape_string(stripslashes(htmlspecialchars($dirty))); }else{ $clean = mysql_real_escape_string(htmlspecialchars($dirty)); } return $clean; } ?>
Step 12 - login_check.php
Und zu guter Letzt haetten wir da noch die Datei login_check.php, welche prueft ob man korrekt eingeloggt ist...
<?php // login_check.php session_start(); // startet die Session if(!isset($_SESSION['login'])){ // wenn nicht eingelogt echo "<meta http-equiv=\"refresh\" content=\"0; URL=login.php\">"; // Weiterleitung => Login } ?>
Aehm ja, ich glaube das waeren dann alle Dateien, naehere Ausfuehrungen zu diesen erspare ich mir der Einfachheit halber jetzt mal, die einzelnen Dinge sind eigentlich recht gut auskommentiert, so dass man sich mit ein paar PHP-Kentnissen recht gut zurecht finden kann, vorrausgesetzt man steht auf 1000 Dateien, wenn es auch eine Einzige tut...
Sollte jemand das dringende Beduerfnis hegen, die komplette Dateisammlung herunterladen zu wollen, bitteschoen ...
Tutorial Dateien downloaden
Kommentar schreibenHinterlasse einen Kommentar
Du musst angemeldet sein, um einen Kommentar zu hinterlassen...
Du bist noch kein Mitglied von Alice-Grafixx.de?
Dann kannst du dich hier kostenlos registrieren ...