<?php
require_once('core/classes/system.class.php');
system::start(false);
$CAPTCHA_LENGTH = 5; // Länge der Captcha-Zeichenfolge, hier fünf Zeichen
$FONT_SIZE = 11; // Schriftgröße der Zeichen in Punkt
$IMG_WIDTH = 278; // Breite des Bild-Captchas in Pixel
$IMG_HEIGHT = 38; // Höhe des Bild-Captchas in Pixel
// Liste aller verwendeten Fonts
$FONTS[] = 'fonts/actionj.ttf';
$FONTS[] = 'fonts/minya.ttf';
// Unser Zeichenalphabet
$ALPHABET = array('A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'Q', 'J', 'K', 'L', 'M', 'N',
'P', 'R', 'S', 'T', 'U', 'V', 'Y',
'X', 'Z', '9', 'W', '2', '3', '4',
'5', '6', '7');
// Wir teilen dem Browser mit, dass er es hier mit einem JPEG-Bild zu tun hat.
header('Content-Type: image/jpeg', true);
// Wir erzeugen ein leeres JPEG-Bild von der Breite IMG_WIDTH und Höhe IMG_HEIGHT
$img = imagecreatetruecolor($IMG_WIDTH, $IMG_HEIGHT);
// Wir definieren eine Farbe mit Zufallszahlen
// Die Farbwerte sind durchgehend und absichtlich hoch (200 - 256) gewählt,
// um eine "leichte" Farbe zu erhalten
$col = imagecolorallocate($img, rand(200, 255), rand(200, 255), rand(200, 255));
// Wir füllen das komplette Bild mit der zuvor definierten Farbe
imagefill($img, 0, 0, $col);
$captcha = ''; // Enthält später den Captcha-Code als String
$x = 15; // x-Koordinate des ersten Zeichens, vom linken Rand
for ($i = 0; $i < $CAPTCHA_LENGTH; $i++) {
$chr = $ALPHABET[rand(0, count($ALPHABET) - 1)]; // ein zufälliges Zeichen aus dem definierten Alphabet ermitteln
$captcha .= $chr; // Der Zeichenfolge $captcha das ermittelte Zeichen anfügen
$col = imagecolorallocate($img, rand(0, 199), rand(0, 199), rand(0, 199)); // einen zufälligen Farbwert definieren
$font = $FONTS[rand(0, count($FONTS) - 1)]; // einen zufälligen Font aus der Fontliste FONTS auswählen
$y = 25 + rand(0, 10); // die y-Koordinate mit einem Mindestabstand plus einem zufälligen Wert festlegen
if((bool)rand(0,1)){
$angle = rand(0, 30); // ein zufälliger Winkel zwischen 0 und 30 Grad
}else{
$angle = rand(330, 360); // ein zufälliger Winkel zwischen 330 und 360 Grad
}
/*
* Diese Funktion zeichnet die Zeichenkette mit den
* gegeben Parametern (Schriftgröße, Winkel, Farbe, TTF-Font, usw.)
* in das Bild.
*/
imagettftext($img, $FONT_SIZE, $angle, $x, $y, $col, $font, $chr);
$dim = imagettfbbox($FONT_SIZE, $angle, $font, $chr); // ermittelt den Platzverbrauch des Zeichens
$x += $dim[4] + abs($dim[6]) + 15; // Versucht aus den zuvor ermittelten Werten einen geeigneten Zeichenabstand zu ermitteln
}
imagejpeg($img); // Ausgabe des Bildes an den Browser
imagedestroy($img); // Freigeben von Speicher
$result = system::$db->select("*","captcha","captcha_phpsessid = '".$_GET['PHPSESSID']."'","","1");
if(system::$db->getTableRows($result) > 0) {
system::$db->update("captcha","captcha_time = '".time()."', captcha_captcha = '".$captcha."'","captcha_phpsessid = '".$_GET['PHPSESSID']."'");
} else {
system::$db->insert("captcha","captcha_phpsessid, captcha_time, captcha_captcha","'".$_GET['PHPSESSID']."','".time()."','".$captcha."'");
}
system::$db->delete("captcha","captcha_time <= '".(time() - 900)."'");
?>
Alles anzeigen
Dieses Script hab ich schon oft verwendet um das Bild des Captchas zu generieren. Fast jedes mal gab es irgendwelche Probleme. Diesmal gibt es wieder einen^^ Ich bin jetzt schon eine geschlagene Stunde am probieren aber ich überseh den Fehler. Das Einzige was ich an dem Script geändert habe ist die Objektorientierte Datenbankverbindung. (Diese funktioniert auch)
Meinen Tests zufolge muss irgendwas in der For-Schleife nicht stimmen. Wenn ich das Bild vorher ausgebe funktioniert es (ich bekomme dann halt nur den Hintergrund angezigt^^)