Loading...   Upload Image

Ask & AnswerTutorials » PHP/MySQL Tutorials » Ask & Answer

Verfasst von Alice am 26.05.2008 - wurde schon 8602 mal gelesen

Kategorie: PHP/MySQL
Bewertung:
4x bewertet
Schwierigkeit: mittel
Kommentare: [ 18 ]

Tag - Schlagwort Script Tag - Schlagwort Ask&Answer Tag - Schlagwort PHP

Ask & Answer - Tutorial

Hier moechte ich euch zeigen wie ihr ganz fix zu einem eigenen Ask & Answer Script kommt.

Was wird benoetigt?


- PHP / MySql Grundkenntnisse
- 1 MySql Datenbank
- Webspace der PHP unterstuetzt

Step 1


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` date NOT NULL default '0000-00-00',
`a_date` date NOT NULL default '0000-00-00',
`status` enum('B','U') NOT NULL default 'U',
`ip` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
);


Step 2


Die config.inc.php wird benoetigt um eine Verbindung zur Datenbank herzustellen,
die Dateiendung inc.php wird hier verwendet, damit die Php Datei von aussen nicht ausgelesen werden kann ...

Die Datei wird mittels include Befehl in die anderen Dateien eingebunden,
dies erspart es einem die Verbindungsdaten mehrmals anzugeben.
<?php
// config.inc.php
//---------------------------
$host = "localhost";        // Adresse des Datenbankservers, fast immer localhost
$user = "Benutzername";    // Dein MySQL Benutzername
$pass = "deinPasswort";    // Dein MySQL Passwort
$dbase = "Datenbankname";  // 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."); 

?>

Hier muessen die Variablen $host, $user, $pass sowie $dbase angepasst werden!
$connection baut die Verbindung zur Datenbank auf, $db waehlt die in $dbase angegebene Datenbank aus.

Step 3


Das ganze Ask&Answare Skript packen wir in eine einzige Datei,
abgesehen von der config.inc.php

Zuerst einmal das komplette Skript, darunter folgt die Erklaerung.
<?php 

session_start(); // startet die Session 

//---------------------- Logindate --------------------------------- //
$grafixx_name = "USERNAME";				// Loginname angeben
$grafixx_pass = "PASSWORT";				// Loginpasswort angeben
//------------------------------------------------------------------ //

ob_start();	// startet den Ausgabepuffer
?>
<!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

include('config.inc.php'); 			// Bindet Datei fuer DB-Verbindung ein
$action = strip_tags($_GET['action']);

$pfad = $_SERVER['PHP_SELF'];      // generiert aktueller Pfad zur Datei 

// --- 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;
}
// -------------------------------- Logout --------------------------------------
if ($action == 'logout'){ 
session_unset();
session_destroy();

header("Location: $pfad");
}
// ------------------------------------ Login ---------------------------------------
if ($action == 'login'){ 

if(isset($_POST['admin_login'])) {

$login_name = strip_tags($_POST['admin_name']);
$login_pass = strip_tags($_POST['admin_pass']);

    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'];

			header("Location: $pfad#asks");
	}
	
	if($error == "1"){
		echo "<h1>Error ...</h1>\n <p>$message</p>";
	}

}
?>

<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:&nbsp; </label>
<input type="password" name="admin_pass" style="width: 250px" />
<br /><br />
<input type="submit" value=" Login " name="admin_login" />
</fieldset>

</form>
<?php 
}  //------------------------------------- Login ENDE -----------------

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
$un = "SELECT id, frage, ip FROM askme WHERE status='U'";
$result_u= mysql_query($un, $connection) or die (mysql_error()); 
$unbeantwortet = mysql_num_rows($result_u);

// ---------------------------------- 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";
			
		$q = "SELECT $show FROM askme WHERE status='B'";  
		$result= mysql_query($q, $connection) or die (mysql_error()); 
		
$beantwortete = mysql_num_rows($result); // beantwortete Fragen

// ---------------------------------- Wenn LOS gedrueckt --------------------------------------------

if (isset($_POST['go'])){
	
	$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
		
		// Cookie setzen => Spamschutz --------------------------
		$AktuellesDatum = date("d.m.Y H:i:s");
		$Gueltigkeit = time()+300;
       	setcookie ("askme", $AktuellesDatum, $Gueltigkeit);

  if(!isset($_COOKIE['askme'])) {  // Wenn IP noch nicht vorhanden
  		
		// Datenbankeintrag
		$askme = "INSERT INTO askme (id, ip, frage, f_date) 
				  VALUES ('','$visitorip','$ask',now())"; 
		$eintrag= mysql_query($askme) or die (mysql_error()); 
		
		// Wenn Frage erfolgreich in DB eingetragen
		if ($eintrag){
			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>Sie haben schon ein Frage in den letzten 5 Minuten gestellt ...<br /><br />\n";
		echo "Bitte versuchen sie es spaeter nochmal.<br /></p>\n </div>\n";	}	
	}// close empty

}// close isset submit

if ((!$eintrag) AND (!isset($_COOKIE['askme']))){

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 um Frage zu stellen
?>
<form method="post" action="">
<p>Frag auch du mich etwas ... <br />
<input type="text" name="frage" size="50"/>&nbsp; 
<input type="submit" value="Los!" name="go" /></p>
</form>
<?php } // close eintrag
?>

<h1>Frage &amp; Antwort ...</h1><br />
<?php


// ---------------------- 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

$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\">&laquo; Erste ...</a>\n";      
}      
if($go != 1){          
    $prev = $go-1;
    $links[] = "<a href=\"".$pfad."?go=$prev\" title=\"Zurueck zur letzen Seite\"> &laquo;</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\"> &raquo; </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 &raquo;</a>\n";
}      
 
$link_string = implode(" &nbsp; ", $links);  // Packt alles in einen String

$start = ($go-1) * $links_per_page; 

// ---------------------- 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 -----------------------------------------------
$que = "SELECT $show FROM askme WHERE status='B' ORDER BY id DESC LIMIT $start,$links_per_page";
$results = mysql_query($que, $connection) or die (mysql_error()); 

while ($row=mysql_fetch_array($results)) { 
extract($row); 

$frage_d=$row['f_datum']; // Datum der Frage
$antwort_d=$row['a_datum']; // Datum der Antwort

?>
<div class="line">
<strong>Frage:</strong><br />
<?php 
	echo $frage; // Frage ausgebn
?><br /><br />
<strong>Antwort:</strong><br />
<?php echo $antwort; // Antwort ausgeben
?>

<div align="right">
Gestellt am <strong><?php echo $frage_d; ?></strong> |
Beantwortet am <strong><?php echo $antwort_d; ?></strong></div>
</div>
<br />
<?php } // 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";  

//------------------- Wenn eingeloggt ------------------------------------------------
if(isset($_SESSION['login'])){

$ids = strip_tags($_GET['id']); 

// --------------------------------------- Frage beanworten --------------------------

if ($action == 'antwort'){
	// Abfrage der Daten
	$quer = "SELECT frage,ip FROM askme WHERE id='$ids'";
	$antwort= mysql_query($quer, $connection) or die (mysql_error()); 
	
	// Ausgabe der Daten		
	$ausgabe = mysql_fetch_array($antwort);
	$asks = $ausgabe['frage'];
	$who = $ausgabe['ip'];
	
	echo "<h1 id=\"doa\">Fragen Nummer $ids beantworten - IP $who</h1>
		  <p><strong>Frage:</strong> $asks</p>"; 
	
	if (isset($_POST['okay'])){ // Wenn auf absenden geklickt wurde

	$antwort = clean_it($_POST['antwort']);  
  	
  	if (empty($_POST['antwort'])) { 
		echo "<div class=\"error\"><h1>Error ...</h1>\n"; 
		echo "<p>Bitte Danke Antwort eingeben ...</p></div>\n";
	}else{
	
		// Datenbankeintrag
		$ask = "Update askme SET antwort ='$antwort', a_date = now(), status='B' WHERE id ='$ids'"; 
		$antworten= mysql_query($ask) or die (mysql_error()); 
		
		// Wenn Frage erfolgreich beantwortet wurde
		if ($antworten){

				header("Location: $pfad"); // Weiterleitung => Startseite

		}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 if $action
//-------------------- Auflisten der noch unbeantworteten Fragen --------------------------------
while ($rowa = mysql_fetch_array($result_u)) { 
extract($rowa); 
?><br /><br />
<h1 id="asks">Unbeantwortete Fragen</h1>
<?php	echo "<strong>Frage $id - von IP $ip</strong><br />\n";
		echo "<p>$frage </p>\n";
		echo "<div align=\"right\">
			  <a href=\"$pfad?action=antwort&amp;id=$id#doa\">[ beantworten ]</a> 
			  <a href=\"$pfad?action=loeschen&amp;id=$id#dol\" >[ loeschen ]</a></div>\n";
} //close while	 

// ------------------------------------------------- Frage loeschen --------------------------

if ($action == 'loeschen'){ 

	// nichtbeantworten der frage
		$quer = "DELETE FROM askme WHERE id='$ids'";
		$antworten= mysql_query($quer) or die (mysql_error());
	
	if ($antwort){
	
	echo "<div class=\"error\"><h1 id=\"dol\">Prima ...</h1>\n
		  <p>Frage <strong>$ids</strong> erfolgreich geloescht</p>\n</div>\n"; 
	}
  	
} // close Post sub
	
}// close eingeloggt

ob_end_flush(); // leert/beendet den Ausgabepuffer
?>
<h3>Grafixx - Askme © <a href="http://alice-grafixx.de">Alice-Grafixx.de</a> <?php echo date('Y'); ?> | 
<?php 
// Admin Login / Logout
if(isset($_SESSION['login'])){ 
	echo "<a href=\"$pfad?action=logout\">logout</a>";
}else{
	echo "<a href=\"$pfad?action=login\">Admin</a>\n";
} ?>
</h3>

</div>
</body>
</html>


Zuerst starten wie eine Session, mittels session_start();, die benoetigen wir fuer den Login. Danach werden die Daten fuer den Login definiert, diese muessen angepasst werden!

Als naechstes starten wir den Ausgabepuffer, die ermoeglicht uns auch mittendrin Cookies zu setzen und nur am Anfag des Skriptes.

Es folgt die Doctype-Angabe und der Headbereich der Seite.
Hier ist eine externe CSS-Datei angegeben, die kann man selbst erstellen oder einfach weglassen,
oder man laed sich das fertige Skript hier herunter, dies enthaelt bereits eine CSS-Datei...

Mit dem include() Befehl binden wir die config.inc.php zur DB verbindung ein.
Die Variable $pfad wird benoetigt, fuer die Seitennavigation.

Als naechstes kommt eine Funktion clean_it(),
die unser Skript vor SQL-Injektions bewahrt.

Die if-Klausel if ($action == 'logout') ist fuer den Logout zustaendig,
hier wird mittels session_destroy();, die beim Login gesetzte Session zerstoert.

Die if-Klausel if ($action == 'login') ist fuer den Login zustaendig.
Die Variablen $login_name und $login_pass definieren die per Login-Formular uebergebenen Daten.

Es folgt eine Pruefung ob alle Felder, des Formular, ausgefuellt wurden,
sollte dies der Fall sein, so wird die Session[login] gestartet und man wird auf den Seitenabschnitt mit den unbenatworteten Fragen mittels header("Location: $pfad#asks") weitergeleitet.
Sollten die Formularfelder nicht korrekt ausgefuellt werden,
so gibt if($error == "1") eine Fehlermeldung aus.

Es folgt das Login-Formular.

Dann kommt die Abfrage der DB, die alle Fragen zaehlt,
darauf folgt eine DB-Abfrage die nur die unbeantworteten Fragen zaehlt.
Anschliessen werden die Fragen aus der DB ausgelesen.

if (isset($_POST['go'])) prueft ob beim Ask-Formular auf den Button geklickt wurde.
if (empty($_POST['frage'])) prueft ob ueberhaupt eine Frage eingegeben wurde,
wenn nicht, wird eine Fehlermeldung ausgegeben.
Sollte das input Feld['frage'] nicht leer geblieben sein, dann wird erstmal ein Cookie gesetzt, damit man nicht mehrmals innerhalb von ein paar Minuten tausende Fragen stellen kann.

Die Variable $askme ist fuer den Eintrag der Frage in die DB zustaendig.

if ($eintrag) prueft ob der Eintrag erfolgreich war, oder nicht ...

Dann kommt die Ausgabe des Formulars zur Fragestellung.
Anschliessend wird die Seitennavigation generiert.

Danach folgt nochmals eine Abfrage der DB, die anschliessende while-Schleife gibt die beantworteten Fragen der Reiche nach aus, danach wird die Seitennavigation ausgegeben.

Nun kommt der Abschnitt, wenn man eingelogt ist.

if ($action == 'antwort') ist fuer das Beantworten der Frage zustaendig.
Die Frage wird zuerst ausgelesen, danach wird diese ausgegeben.


if (isset($_POST['okay'])) prueft ob auf absenden geklickt wurde, beim benatworten Formular. Sollte dies der Fall sein und das Inputfeld[antwort] nicht leer geblieben sein, so traegt die Variable $ask die Antwort in die DB ein und man wird wieder auf die Startseite geleitet. Wenn nicht, gibt es eine Fehlermeldung.

Anschliessend kommt dann das Formular zum Beantworten der Frage.

Die While-Schleife while ($rowa = mysql_fetch_array($result_u)) listet alle unbeantworteten Fragen der Reihe nach auf, es werden jeweils ein Link zum beantworten und loeschen der Frage ausgegeben.

Der Abschnitt if ($action == 'loeschen') ist fuer das Loeschen einer Frage zustaendig.
Mittels $quer = "DELETE FROM askme WHERE id='$ids'"; wird die Frage aus der DB geloescht.
Sofern dies nicht korrekt abgelaufen ist, wird eine Fehlermeldung ausgegeben.

bob_end_flush(); leer/beendet den Ausgabepuffer, den wir ganz zu Anfangs gestartet hatten.

Und zum SChluss wird jeh nach dem ob man nun ein oder ausgeloggt ist,
entweder ein Link zum einloggen angezeigt, oder zum Ausloggen.

Das waer also nun das komplette Skript im Grossen und Ganzen erklaert.

Viel Spass damit.

Tutorialdateien herunterladen

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 ...


Affiliates:   Colorful Gfx  •   Blue-Graphics  •   Gallery Yuri  •   The Seduction  •   Design Grafixx  •   Chibi Graphics  •   Pat DG  • Show all ...
designenlassen.de - Der Design-Marktplatz für Webdesign, Logo-Design, Flyerdesign u.v.m.        ALL-INKL.COM - Webhosting Server Hosting Domain Provider