<?php
class antispam{
var $frage;
# Speichert die Frage
var $antwort;
# Speichert die ID der richtigen Antwort.
var $antwortmenge;
# Speichert die Menge an Antworten in der Datenbank.
function __construct(){
$this->datenbank(false, "DELETE FROM antispam_eintraege WHERE Zeitpunkt<".time());
# Alte Usereintraege loeschen (Frage und richtige Antwort fuer die User)
mysql_connect('server', 'user', 'passwort';
mysql_select_db('datenbank';
# Zur Datenbank verbinden
$abfrage = $this->datenbank(true, "SELECT COUNT(*) AS Wert FROM antispam_antworten"
if ($abfrage[0]['Wert'] > 2)
$this->antwortmenge = $abfrage[0]['Wert'];
else
die('<b>Nicht genug Fragen!</b>';
# Menge an Antworten abfragen, ueberpruefen und speichern
$abfrage = $this->datenbank(true, "SELECT COUNT(*) AS Wert FROM antispam_fragen"
srand(time());
$i = rand(1, $abfrage[0]['Wert']);
# Menge an Fragen in der Datenbank ermitteln und eine Zufaellig aussuchen
$abfrage = $this->datenbank(true, "SELECT Frage, Antwort FROM antispam_fragen WHERE ID=".$i);
$this->frage = $abfrage[0]['Frage'];
$this->antwort = $abfrage[0]['Antwort'];
# Gezielte Frage aus der Datenbank abrufen und mit der richtigen Antwort speichern
}
function datenbank($ausgabe = true, $query = ''{
# Zur Abfrage und Eingabe von Daten der Datenbank
$abfrage = mysql_query($query);
if ($ausgabe == true){
# Wenn $ausgabe == true ist, wird ein Array zurueckgeben, dass die Datensätze wie folgt beinhaltet:
# $daten[] beinhaltet die diversen abgefragten Zeilen der Datenbank
# Das Unterarray $daten[][] beinhaltet die Daten der Felder, wobei das Feld ID der ersten abgerufenen Zeile so ausgegeben werden kann: echo $daten[0]['ID'];
# Beginnt mit 0, statt mit 1!!!
#
# Ansonsten wird nur ein true zurückgegeben.
for($i=0;$i<mysql_num_rows($abfrage); $i++)
$daten[$i]=mysql_fetch_array($abfrage);
return $daten;
} else
return true;
}
function frage_stellen(){
$antworten[0] = $this->antwort;
$i = 1;
while ($i < 3) {
$antworten[$i]=rand(1, $this->antwortmenge);
if (($i == 1) AND ($antworten[1] <> $antworten[0]))
$i = 2;
elseif (($i == 2) AND ($antworten[2] <> $antworten[0]) AND ($antworten[2] <> $antworten[1]))
$i = 3;
}
# Das Script ermittelt drei Antworten (die IDs davon)
# Es darf in der Datenbank keine ID von der ersten bis zur letzten fehlen, da das Script davon ausgeht, wenn 9 Zeilen in der Datenbank gefunden werden, dann sind das die IDs 1 bis 9.
$abfrage = $this->datenbank(true, "SELECT ID, Antwort FROM antispam_antworten WHERE ((ID=".$antworten[0]." OR (ID=".$antworten[1]." OR (ID=".$antworten[2].")"
# Fragt die Antworten aus der DB ab
echo '<form action="antispam.php" method="POST"><b>'.$this->frage.'</b><br>';
$id = time()-rand(0,time());
# Legt eine ID zur Identifikation des Users an (fuer Formular und Datenbank)
echo '<input type="hidden" value="'.$id.'" name="id">';
foreach($abfrage as $t)
echo '<input type="radio" value="'.$t['ID'].'" name="antwort">'.$t['Antwort'].'<br>';
echo '<input type="submit" value="Antworten" name="senden"></form>';
# Ausgabe des Formulars
$this->datenbank(false, "INSERT INTO antispam_eintraege (ID, Zeitpunkt, Antwort) VALUES (".$id.", ".(time()+300).",".$this->antwort.""
# Speichert die Eintraege fuer das Antispamscript (Userwiedererkennung und Aufloesungsdaten fuer die Fragen)
}
function ueberpruefung($id, $antwort){
# $id und $antwort sind Variablen, die die Werte aus dem Formular speichern
$abfrage = $this->datenbank(true, "SELECT * FROM antispam_eintraege WHERE ID=".$id);
# Fragt die Userdaten ab (richtige Antwort auf die Frage)
if ($abfrage[0]['Antwort'] == $antwort){
echo 'In Ordnung!';
$this->datenbank(false, "DELETE FROM antispam_eintraege WHERE ID=".$id);
# Richtige Antwort; Eintrag fuer User kann sofort aus der Datenbank entfernt werden
} else
echo 'Gesperrt!';
# False Antwort.
}
}
$antispam = new antispam();
# Start des Scripts
if (isset($_POST['id']))
$antispam->ueberpruefung($_POST['id'], $_POST['antwort']);
else
$antispam->frage_stellen();
# Ist ein Formular uebergeben worden? Entsprechend wird aufgeloest oder eine Frage gestellt.
?>
<br><a href="antispam.php">neu laden</a>
Entsprechende Tabellen in der Datenbank:
antispam_fragen:
ID: Int(4)
Frage: Varchar (256)
Antwort: Int(3)
antispam_antworten:
ID: Int(3)
Antwort: Varchar(256)
antispam_eintraege:
ID: Int(12)
Zeitpunkt: Int(12)
Antwort: Int(4)
Habs getestet und es klappt.