Hallo Ihr,
versuche grad ein Captcha in ein bestehendes Gästebuch zu intergrieren.
Leider bekomme ich folgende Fehlermeldungen:
---
Notice: A session had already been started - ignoring session_start() in C:\xampp\htdocs\guestbook\captcha\captcha.php on line 2
( bei eingeschaltenem error_reporting(E_ALL); )
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\guestbook\captcha\captcha.php:2) in C:\xampp\htdocs\guestbook\captcha\captcha.php on line 24
( bei eingeschaltenem error_reporting(E_ALL); )
Warning: imagettftext() [function.imagettftext]: Invalid font filename in C:\xampp\htdocs\guestbook\captcha\captcha.php on line 32
�PNG IHDR�(�/���IDATx���1 �@���_�OߧF��6TE4�6���m����H�5���[�s�spI"� R�H"� R�H"� R�H"� R�H"� R�H"� R�H"� R�H"� R�H����sI"z���*�"IEND�B`�
( auch ohne error_reporting(E_ALL); )
---
Desweiteren werden zwar Bild und Text angezeigt, aber selbst bei korrekter Eingabe des Sicherheitscodes kommt die von mir definierte Fehlerausgabe.
(config.php des GB : 'spamschutz' => 'Captcha ungültig<br>Session:'.$_SESSION['captcha_spam'].'<br>Eingabe:'.$_POST["sicherheitscode"].'<br>')
Beispiel:
Captcha ungültig
Session:qHrhs
Eingabe:qHrhs
Nachfolgend die dazugehörigen Listings:
captcha.php
PHP-Code:
<?php
session_start();
unset($_SESSION['captcha_spam']);
function randomString($len) {
function make_seed(){
list($usec , $sec) = explode (' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
srand(make_seed());
//Der String $possible enthält alle Zeichen, die verwendet werden sollen
$possible="ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
$str="";
while(strlen($str)<$len) {
$str.=substr($possible,(rand()%(strlen($possible))),1);
}
return($str);
}
$text = randomString(5); //Die Zahl bestimmt die Anzahl stellen
$_SESSION['captcha_spam'] = $text;
header('Content-type: image/png');
$img = ImageCreateFromPNG($_SERVER['DOCUMENT_ROOT'].'/guestbook/captcha/captcha.png'); //Backgroundimage
$color = ImageColorAllocate($img, 0, 0, 0); //Farbe
$ttf = "xfiles.ttf"; //Schriftart
$ttfsize = 20; //Schriftgrösse
$angle = rand(0,5);
$t_x = rand(5,30);
$t_y = 35;
imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text);
imagepng($img);
imagedestroy($img);
?>
add.php
PHP-Code:
<?php
error_reporting(E_ALL);
#
# patShaping Guestbook 1.6 - add.php
#
# Speichern eines Eintrags und Anzeigen der 'Neuer Eintrag'-Seite
#
# Autor: Patrick Canterino <patrick@patshaping.de>
# Letzte Aenderung: 5.11.2005
#
require('shared.php');
require('bbcode.php');
require('captcha/captcha.php');
$name = formdata('name');
$email = formdata('email');
$www = formdata('www');
$message = formdata('message');
$preview = formdata('preview');
$sicherheitscode = formdata('sicherheitscode');
$sess = $_SESSION['captcha_spam'];
if(get_config_var('readonly'))
{
$tpl = new Template;
$tpl->read_file(get_config_var('tpl_add'));
$tpl->fillin('SCRIPT',$_SERVER['SCRIPT_NAME']);
$tpl->parse_if_block('readonly',1);
print $tpl->get_template();
}
else
{
if(!$name && !$email && !$www && !$message)
{
$tpl = new Template;
$tpl->read_file(get_config_var('tpl_add'));
$tpl->fillin('SCRIPT',$_SERVER['SCRIPT_NAME']);
$tpl->parse_if_block('readonly',0);
print $tpl->get_template();
}
else
{
if($www == 'http://') $wwwurl = '';
else $wwwurl = $www;
## Captcha Abfrage
if(!isset($_SESSION['captcha_spam'])){
$lala = 'lala';
};
if(isset($_SESSION['captcha_spam']) && ($sicherheitscode != $sess)){
show_error(get_config_var('spamschutz'));
unset($_SESSION['captcha_spam']);
};
if(isset($_SESSION['captcha_spam']) && ($sicherheitscode == $sess)){
unset($_SESSION['captcha_spam']);
};
## Captcha Ende
if(strlen($name) < get_config_var('name_minlen')) show_error(get_config_var('name_too_short'));
if(strlen($message) < get_config_var('msg_minlen')) show_error(get_config_var('msg_too_short'));
if(get_config_var('name_maxlen') && strlen($name) > get_config_var('name_maxlen')) show_error(get_config_var('name_too_long'));
if(get_config_var('msg_maxlen') && strlen($message) > get_config_var('msg_maxlen')) show_error(get_config_var('msg_too_long'));
# Pruefen, ob eingegebene E-Mail-Adresse (im Internet) gueltig ist
if(!check_email($email) && $email != '') show_error(get_config_var('email_invalid'));
# Pruefen ob URL gueltig ist
if(!check_url($wwwurl) && $wwwurl != '') show_error(get_config_var('wwwurl_invalid'));
# Erzeugen einer eindeutigen ID
$id = uniqid(dechex(rand(0,255)).dechex(rand(0,255)));
$name = htmlentities($name);
$email = htmlentities($email);
$wwwurl = htmlentities($wwwurl);
$message = htmlentities($message);
# Ersetzen der Zeilenumbrueche in Name, E-Mail- und Homepage-Adresse
# durch Leerzeichen
$name = preg_replace("/\015\012|\012|\015/",' ',$name);
$email = preg_replace("/\015\012|\012|\015/",' ',$email);
$wwwurl = preg_replace("/\015\012|\012|\015/",' ',$wwwurl);
# Ersetzen der Zeilenumbrueche im Text durch <br />
$message = preg_replace("/\015\012|\012|\015/",'<br />',$message);
# Schraegstriche durch | ersetzen, um Probleme zu vermeiden
$name = str_replace('|','|',$name);
$wwwurl = str_replace('|','|',$wwwurl);
$message = str_replace('|','|',$message);
# Mehr als ein Leerzeichen zu
# Grundidee stammt aus dem Modul Encode::Plain des selfforum
# Vorschlaege fuer eine elegantere Umsetzung werden gerne entgegengenommen!
for($x=0;$x<strlen($message);$x++)
{
if($message{$x} == ' ' && $message{$x+1} == ' ') $message{$x} = "\240";
}
$message = str_replace("\240",' ',$message);
# Ein Leerzeichen nach einem <br /> ebenfalls zu
# Grundidee ebenfalls entnommen aus Encode::Plain des selfforum
$message = str_replace('<br /> ','<br /> ',$message);
# Je nach Konfiguration den BBCode parsen
if(get_config_var('allow_bbcode')) $message = parse_bbcode($message);
# Alles in Ordnung, CSV-String erzeugen
$line = "$id|$name|$email|$wwwurl|".time()."|$message";
if($preview)
{
# Vorschau
$tpl = new Template;
$tpl->read_file(get_config_var('tpl_preview'));
$tpl->fillin('SCRIPT',$_SERVER['SCRIPT_NAME']);
set_tpl_form_values($tpl);
$tpl->fillin('ENTRY',make_entry($line));
print $tpl->get_template();
}
else
{
# Daten speichern
$datafile = get_config_var('datafile');
if(!file_exists($datafile)) $openmode = 'w';
else $openmode = 'r+';
$df = fopen($datafile,$openmode);
if(!$df) die;
flock($df,LOCK_EX);
if($openmode == 'r+' && filesize($datafile) > 0)
{
# Pruefen, ob Datendatei am Ende einen Zeilenumbruch hat
# Wenn nicht, wird ein zusaetzlicher eingefuegt
$data = fread($df,filesize($datafile));
if(!preg_match("/\n$/",$data) && $data != '') fwrite($df,"\n");
unset($data);
}
# Daten in die Datei schreiben
fwrite($df,"$line\n");
flock($df,LOCK_UN);
fclose($df);
$tpl = new Template;
$tpl->read_file(get_config_var('tpl_saved'));
$tpl->fillin('SCRIPT',$_SERVER['SCRIPT_NAME']);
$tpl->fillin('ENTRY',make_entry($line));
print $tpl->get_template();
}
}
}
# show_error()
#
# Funktion liest die Vorlagendatei fuer Fehler ein,
# parst sie, zeigt sie an und beendet das Script
#
# Parameter: Fehlermeldung
function show_error(&$errmsg)
{
global $name, $email, $www, $message, $sicherheitscode;
$etpl = new Template;
$etpl->read_file(get_config_var('tpl_add_error'));
$etpl->fillin('SCRIPT',$_SERVER['SCRIPT_NAME']);
$etpl->fillin('ERRMSG',$errmsg);
set_tpl_form_values($etpl);
print $etpl->get_template();
exit;
}
# set_tpl_form_values()
#
# Fuegt die vom Benutzer eingegeben Daten in ein
# Template-Objekt ein
#
# Die Formulardaten werden erneut mit formdata()
# eingelesen!
#
# Parameter: Template-Objekt
#
# Rueckgabe: -nichts- (Template-Objekt wird veraendert)
function set_tpl_form_values(&$tpl)
{
$tpl->fillin('NAME',htmlentities(formdata('name')));
$tpl->fillin('EMAIL',htmlentities(formdata('email')));
$tpl->fillin('WWW',htmlentities(formdata('www')));
$tpl->fillin('MESSAGE',htmlentities(formdata('message')));
}
#
### Ende ###
?>
Hat jemand zufällig eine Idee, wie ich dies lösen könnte? Vielen Dank, schon mal.
Gruß, Alex