6x bewertet

Eigenes Ask&Answer Skript (Teil 1)

von Isa_G  |  07.12.2009 um 19:02 h
PHP Anwendungen
Typ: PHP Anwendungen
Stufe:Mittel
Wichtig!:
In diesem Tutorial erkläre ich euch Schritt für Schritt wie ein Askme Skript eigentlich funktioniert und wie ihr es euch selber programmieren könnt.

Da viele Delites Loginreihe/ACP verwenden, habe ich versucht das Askme auch daran anzupassen. (Als evtl. Alternative zu ihrem Askus auf Webvids.de).

Die Code-Ausschnitte im Tutorial dienen lediglich den Erklärungen und dem besseren Verständnis, einen Datei-Download findet ihr am Ende des Tutorials.


Zu aller erst ist es eine Überlegung wert, wie man die Fragen und dazugehörigen Antworten speichern möchte:
  • In PHP gibt es die Möglichkeit Texte in ein .txt-Dokument auf dem Server zu schreiben. Einzelne Kompontenten kann man dort durch bestimmte Sonderzeichen trennen und auch so auslesen.
  • Ebenso kann man dies mit einer Datenbank(DB) lösen. Man legt eine Tabelle an und füllt sie Stück für Stück mit Inhalten.

In diesem Tutorial beschäftigen wir uns mit der 2. Variante, da dies verbreiteter und schlichtweg auch einfacher zu handhaben ist. Datensätze lassen sich im Gegensatz zu denen in einem .txt-Dokument einzeln löschen und ausgeben. Ebenso ist es bei der 2. Variante möglich, Antworten auf Fragen erst im Nachhinein zu geben und einfacher zu zu ordnen.

Tipp: Wer mehr über .txt-Handling über PHP wissen will, kann sich hier informieren:
Webmaster-Resource.de (Extern) (Tolle Tuts, nur zu empfehlen!)

1. Tabelle
Wir beginnen mit der Tabelle in der Datenbank:
My-SQL Code:
CREATE TABLE IF NOT EXISTS askme (
id int(100) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
ip varchar(255) NOT NULL,
email varchar(255) NOT NULL,
hp varchar(255) NOT NULL,
time varchar(255) NOT NULL,
frage text NOT NULL,
antwort text NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Einfach kopieren und in eurer Datenbank über den Reiter "SQL" einfügen.

2. Sicherheitb verschaffen
Da wir später nicht haufenweise Spam in unserer Tabelle stehen haben wollen, erstellen wir uns mit folgendem Tut ein Captcha-Skript und ein passendes kleines Bildchen + Textart, die wir später verwenden wollen:
Captcha von Neontrauma (Intern - Giatu)


3. Answer aus User-Sicht - Formular
Nun beginnen wir das Formular für die User zu basteln, über das sie Fragen stellen dürfen.
Wir benötigen folgende Felder:
  • Name
  • Email
  • Homepage
  • Text/Frage

Als Code schaut dies mit einer hübschen Tabelle wie folgt aus, askme.php:
 <h1>Frage stellen</h1> 
<form action="askme.php" method="POST">
<table>
<tr>
<td>Name*:</td>
<td><input type="text" name="name" value="<?php echo $_POST['name'];
?>"></td>
</tr>
<tr>
<td>E-Mail:</td>
<td><input type="text" name="email" value="<?php echo $_POST['email'];
?>"></td>
</tr>
<tr>
<td>URL (mit http):</td>
<td><input type="text" name="hp" value="<?php echo $_POST['hp'];
?>"></td>
</tr>
<tr>
<td>Deine Frage*:</td>
<td><textarea rows=4 cols=20 name="frage"><?php echo $_POST['frage'];
?></textarea></td>
</tr>
<tr>           
<td><img src="sicher.php" name="capt" alt=""></td>
<td><input type="text" name="captcha" size="5" value=""
maxlength="5"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="entragen" value="Neue Frage"></td>
</tr>
</table> 
</form>
<b>* =</b> Pflichtfelder<br><br>


Erklärung dazu:
  • Das Captcha habe ich euch gleich mal miteingebaut.
  • Die Post-Angaben bei den Value-Werten sorgen dafür, dass bei falsche Captchaeingabe die zuvor verfassten Texte noch immer in den Feldern stehen. So erleichtert ihr euren Besuchern das Frageschreiben und ihr werdet mit Sicherheit mehr ergattern! :)
  • Name und Frage haben wir mal als Pflichtfelder gesetzt ( mit * gekennzeichnet).

Im Firefox schaut dies nu so aus:
Bild


3. Answer aus User-Sicht - Auswertung/Abfragen des Formulars
Als nächsten Schritt bauen wir über(!) dem Formular dessen Auswertung etc. ein.
Wir starten wie immer erst mit dem Starten der Session, der Einbindung der header.php, db.php und der function.inc.hp (falls die letzten 2 nicht schon in der heade.php einbunden). Anschließend refreshen wir die Session, wenn man die User-Ansicht als Eingelogter ansieht, damit unsere Session nich verfliegt:
<? //askme.php
session_start();
include(
'functions.inc.php'); 
include(
'db.php');
include(
'header.php');

if(isset(
$_SESSION["login"])) { // Wenn eingeloggt...
refresh($_SESSION["login"]);
}
?>



Jetzt fangen wir mit der eigentlichen Auswertung an und fragen ab ob das Fomular abgeschickt wurde und was dann passieren soll
<? //askme.php
if (isset($_POST["eintragen"])) {
if(isset(
$_SESSION["captchax"]) && $_SESSION["captchax"] ==
$_POST["captcha"]){
unset(
$_SESSION["captchax"]);
if(isset(
$_POST["name"]) && isset($_POST["frage"])) {
 
$eintrag "INSERT INTO askme (name, ip, email, hp, time, frage,
antwort) 
VALUES (
'"
.mysql_real_escape_string($_POST['name'])."',
'"
.getenv("REMOTE_ADDR")."',
'"
.mysql_real_escape_string($_POST['email'])."',
'"
.mysql_real_escape_string($_POST['hp'])."',
'"
.time()."', 
'"
.mysql_real_escape_string($_POST['frage'])."',
'Noch nicht beantwortet'
)"
;
$eintragen mysql_query($eintrag);
if (
mysql_errno() == 0) {
echo 
"Frage ist eingetragen.<br /><br />";
}
else { 
// Wenn MySQL Fehler..
echo "Es ist leider ein Fehler aufgetreten "mysql_errno() .":".
mysql_error();
}
}
}
else{
echo 
"Der Sicherheitscode ist falsch!";
}
}
?>

Erklärung dazu:
  • Wir fragen ob das Formular abgeschickt wurde, wenn ja...
  • ...überprüfen ob ein Captcha erzeugt wurde und ob die Angabe im dazu gehörigen Inputfeld damit übereinstimmt, wenn nicht geben wir eine Fehlermeldung aus, wenn aber ja ...
  • löschen wir den Zufallscode und generieren einen anderen für das Formular
  • dann pberprüfen wir ob ein Name und eine Frage eingegeben wurde (Pflichtfelder), wenn ja...
  • dann tragen wir in die DB-Tabelle die Frage ein und setze als provisorische Antwort "Noch nicht beantwortet"
  • wenn kein Fehler auftritt, geben wir aus: "Frage ist eingetragen"
  • Ansonsten "Es ist ein Fehler aufgetreten"

3. Answer aus User-Sicht - Bisherige Fragen ausgeben
An dieser Stelle ist euch natürlich überlassen ob ihr die bisherigen Fragen unter oder über das Formular für neue Fragen setzen möchtet. Der Code dafür ist folgender:
<?php //askme.php
echo "<h1>Bisherige Fragen</h1>";   
$abfrage "SELECT * FROM askme ORDER BY time DESC";
$ergebnis mysql_query($abfrage); 
while(
$row mysql_fetch_object($ergebnis)){
echo 
"<table>";
echo 
"<tr>";
echo 
"<td>von <b>".$row->name."</b></td>";  
echo 
"<td>am".date('d.m.Y',$row->time)."</td>"
echo 
"<td'>";
if(
$row->email != ""){
echo 
"<a href="mailto:".$row->email.""><img src="webicons/mail2.png"
border= "
0"></a> ";
}     
if(
$row->hp != ""){
echo 
"<a href="".$row->hp."" target="_blank"><img
src="
webicons/hp3.png" border="0"</a>";
}       
echo 
"</td>";
echo 
"</tr><tr>";
echo 
"<td colspan='3'>";
echo 
"Frage: ".$row->frage."<br>";
echo 
"<br>Antwort: <i>".$row->antwort."</i><br></td>";
echo 
"</tr>";
echo 
"</table>";
}
?>


Erklärung dazu:
  • Wir lesen die Datensätze aus der Tabelle
  • Wir erstellen eine Tabelle und setzen die einzelnen Tabellenfelder ein
  • Das colspan=3 steht dafür, dass der Inhalt über 3 td (table data) gehen soll


Gesamter Code - askme.php
Hier das gesamte Skript "askme.php" zum Herunterladen:
Askme.php herunterladen

Die askmebeantworten.php folgt in dem Teil 2 dieses Tutorials.



11 Kommentare




SmaX

Echt geiles Tutorial!

am 07.12.2009 um 20:01 Uhr


jeffreecyde

Gutes Tutorial Isa! Smilie
am 07.12.2009 um 21:53 Uhr


CrazyMoFu

Eine Frage habe ich noch.... man soll ja ne Tabelle machen muss die in bestimmten namen haben oder einfach Askme oder was?!
am 08.12.2009 um 15:20 Uhr


Isa_G

@ Crazymofu: Wenn du den SQL-Befehl da oben in dein PHPmyAdmin unter dem Reiter SQL einfügst und abschickst, wird die Tabelle automatisch benannt :)
My-SQL Code:
CREATE TABLE IF NOT EXISTS askme

<--- askme heißt sie dannˆˆ

@ Smax und Jeff: danke euch 2en :)
am 08.12.2009 um 15:42 Uhr


CrazyMoFu

hähä ups bin doof aber habs doch noch selbst rausbekommen xD
Ich bin halt blond xDDD

Aber echt cooles Tutiˆˆ
am 08.12.2009 um 15:49 Uhr


Porzelaine

oh super Smilie
so viel und so gut erklärt
+fav
am 08.12.2009 um 16:01 Uhr


CrazyMoFu

Einige fehler habe ich schon selbst behoben aber den versteh nun wieder nicht

Parse error: syntax error, unexpected T_STRING, expecting ′,′ or ′;′ in /data/multiserv/users/208478/projects/245321/www/login/askme.php on line 47
wie muss ich das jetzt ändern das steht in der zeile 46-50:

}
echo "<h1>Bisherige Fragen</h1>";
$abfrage = "SELECT * FROM askme ORDER BY time DESC";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis)){
am 05.01.2010 um 14:53 Uhr


Isa_G

Da sind Fehler drin? O.o also eigentlich hab ich es getestet, es läuft genauso(!) auf meinem Passion-Server - kann höhstens durchs Kopieren in Giatu oder beim Kopieren von Giatu passiert sein...

kann deinen Text nicht wirklich gut lesen xD hab mir deinen Text deshalb mal in meinen Editor kopiert:
Er sagt da sei ein Komma oder Simikolon falsch gesetzt - seh da aber keinen Fehler.

Jemand eine Idee?
am 06.01.2010 um 07:57 Uhr


CrazyMoFu

Ja ist iwie voll riesig aber da sind ganz viele fehler drin das ist nur einer von öhm vllt. 10-15, kp einige habe ich schon weg gemacht aber jetzt habe ich keine lust mehr xD
am 06.01.2010 um 10:32 Uhr


Isa_G

Welche Fehler genau waren das denn?O.o
ich werd mir das von hier nochmal kopieren und anschauen.
am 06.01.2010 um 18:24 Uhr


CrazyMoFu

öhm ich weiss gar nicht mehr ich habe ja schon alles ausgebessert aber dann wieder gelöscht weils nicht ging... Smilie
aber das waren glaub ich kleinigkeiten das kommentare in den code gerutscht sind und so oder ne klammer zu wenig
am 06.01.2010 um 18:41 Uhr