Gästebuch mit MySQL / Session

SiMpLy

Mitglied
Hallo, ich habe ein Problem.
Ich wollte bei meinem Gästebuch ein CAPTCHA rein tun, damit keine Bots mehr Spam einträge machen können. Nur leider will das irgendwie nicht so ganz funktionieren. Und nun geht überhaupt nichts mehr. :(
Ich finde nicht einmal mehr den fehler.

Kann mir jemand helfen? Ich wäre echt super froh und wenn das mit dem Captcha auch gehen würde, wäre ich auch noch froh. :)


guestbook.php
PHP:
<!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">
<?PHP
function UF_ConvDate($ldDatum="",$lcFormat="D",$lcModus="R")
{
$ldRetVal = "";
if (!empty($ldDatum)) {
	if ($lcModus == "R") {
		// Lesen eines Feldwertes aus MySQL-Datums- oder Datums/Zeitfeld
		if ($lcFormat == "D") {
			// Datumsfeld
			list ($lcJahr, $lcMonat, $lcTag) =  explode("-", $ldDatum);
			$ldRetVal = $lcTag . '.' . $lcMonat . '.' .$lcJahr;
		}
		if ($lcFormat == "DT") {
			// Datums-Zeitfeld
			$lcZeit = substr($ldDatum,strpos($ldDatum," "),10);
			$ldDatum = substr($ldDatum,0,strpos($ldDatum," "));
			list ($lcJahr, $lcMonat, $lcTag) =  explode("-", $ldDatum);
			$ldRetVal = $lcTag. '.' . $lcMonat . '.' . $lcJahr .$lcZeit;
		}
	}
	if ($lcModus == "W") {
		// Schreiben eines Feldwertes in MySQL-Datums- oder Datums/Zeitfeld
		if ($lcFormat == "D") {
			// Datumsfeld
			list ($lcTag, $lcMonat, $lcJahr) =  explode(".", $ldDatum);
			$ldRetVal = "'".$lcJahr . '-' . $lcMonat . '-' .$lcTag."'";
		}
		if ($lcFormat == "DT") {
			// Datums-Zeitfeld
			$lcZeit = substr($ldDatum,strpos($ldDatum," "),10);
			$ldDatum = substr($ldDatum,0,strpos($ldDatum," "));
			list ($lcTag, $lcMonat, $lcJahr) =  explode(".", $ldDatum);
			$ldRetVal = "'".$lcJahr . '-' . $lcMonat . '-' .$lcTag.$lcZeit."'";
		}
	}
}
return $ldRetVal;
}

function UF_Hyperlink($lcString="",$llDoHyperlink=true,$llDoLinebreak=false,$lcTarget="_blank")
{
	if ($llDoHyperlink) {
		$lcSearch = array ("/([\w\.\/\&\=\?\-]+)@([\w\.\/\&\=\?\-]+)\b/i",
                 		  "/((ftp(7?):\/\/)|(ftp\.))([\w\.\/\&\~\=\?\-]+)\b/i",
                    	  "/((http(s?):\/\/)|(www\.))([\w\.\/\&\~\=\?\-]+)\b/i");
  		$lcReplace = array ("<a href='mailto:$1@$2'>$1@$2</a>",
                    	   "<a href='ftp$3://$4$5' target='$lcTarget'>$4$5</a>",
                    	   "<a href='http$3://$4$5' target='$lcTarget'>$4$5</a>");
   		$lcString = preg_replace ($lcSearch, $lcReplace, $lcString);
	}

	if ($llDoLinebreak) {
		$lcString = str_replace("\r\n", "<br>", $lcString);
	}

	return $lcString;
}

$link = mysql_connect("localhost","BENUTZER","PWD");
mysql_select_db("DATENBANK",$link);

$page = $_GET['page'];
$maxItems = 5;
$page = (integer)$page;
if(!is_int($page))
$page = 0;
$countQuery = "SELECT COUNT(*) FROM guestbook;";
$countResult = mysql_query($countQuery,$link);
$elements = mysql_result($countResult,0);
mysql_free_result($countResult);
$startIndex = $page * $maxItems;
 if($startIndex > $elements)
   $startIndex = 0;
$query = "SELECT * FROM guestbook ORDER BY id DESC LIMIT $startIndex, $maxItems";
$result = mysql_query($query,$link);
$num = mysql_num_rows($result);
?>
<html>
<head>

<?PHP include '_meta/meta.html'; ?>
<link href="_style/markus_force.css" rel="stylesheet" type="text/css">

</head>

<body bgcolor="#FFFFFF" style="margin: 0" onLoad="document.guestbook.name.focus();">
<table border="0" cellpadding="0" cellspacing="0" class="main_background">
  <tr>
    <td align="left" valign="top" class="navigation">&nbsp;</td>
    <td align="left" valign="top" class="content"><p class="title">Guestbook</p>
      <form name="guestbook" method="post" action="guestbook_erg.php">
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="20%" valign="top">Name:</td>
            <td><input type="text" name="name" id="textfield" size="30"></td>
          </tr>
          <tr>
            <td valign="top">E-Mail:</td>
            <td><input type="text" name="email" id="textfield" size="30"></td>
          </tr>
          <tr>
            <td valign="top">Homepage:</td>
            <td><input type="text" name="homepage" id="textfield" size="30"></td>
          </tr>
          <tr>
            <td valign="top">Message:</td>
            <td><textarea name="message" cols="25"></textarea></td>
          </tr>
          <tr>
            <td valign="top">&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td valign="top"><img src="_captcha/captcha.php" border="0" title="Sicherheitscode"></td>
            <td><input type="text" name="sicherheitscode" size="5"></td>
          </tr>
          <tr>
            <td valign="top">&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td><input type="submit" name="button" id="button" value="Senden" /></td>
          </tr>
        </table>
      </form>
      <br><br>
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
<?PHP
for ($i=0;$i < $num;$i++) {
	    $row = mysql_fetch_array($result); {
?>
          <tr>
            <td>
            <table width="100%" border="0" cellspacing="0" cellpadding="0">
              <tr>
                <td height="25" bgcolor="#666666" style="padding-left: 5px; color: #FFFFFF;"><strong>Von</strong> <?PHP echo $row['name']; ?></td>
                <td width="30%" bgcolor="#666666"><strong>am</strong> <?PHP echo substr(UF_ConvDate($row['datum'],"D","R"),0,10); ?></td>
              </tr>
            </table>
            </td>
          </tr>
          <tr>
            <td style="padding-left: 5px;"><?PHP echo (UF_Hyperlink(nl2br($row['message']))); ?></td>
          </tr>
          <tr>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td height="25" bgcolor="#666666" style="padding-left: 5px; color: #FFFFFF;"><strong>Comment:</strong><br><em><?PHP echo (UF_Hyperlink(nl2br($row['comment']))); ?></em></td>
          </tr>
<?PHP }} ?>
      </table>
      <br><br>
<?PHP
$startIndex = (integer)$startIndex;
if($startIndex != 0)
{
  $tmpPage = $page - 1;
  echo "<a href=\"guestbook.php?page=0\">&lt;</a>";
}
else
{
  echo "&lt; ";
}
$tmpPage = $page + 1;
echo "Seite $tmpPage";
if(($startIndex + $maxItems) >= $elements)
{
echo " &gt;";
}
else
{
$mod = $elements % $maxItems;
$tmpElements = $elements - $mod;
$tmpPage = $tmpElements / $maxItems;
if($mod == 0)
$tmpPage--;
$nextPage = $page + 1;
if($nextPage > $tmpPage)
$nextPage = $tmpPage;

echo "<a href=\"guestbook.php?page=$nextPage\">&gt;</a>";

}
?>
      </td>
  </tr>
</table>
</body>
</html>


guestbook_erg.php
PHP:
<?PHP
extract($_POST);
extract($HTTP_SERVER_VARS);
$id = $_POST['id'];
$name = $_POST['name'];
$email = $_POST['email'];
$homepage = $_POST['homepage'];
$message = $_POST['message'];
$datum = $_POST['datum'];
$datum = date('Y-m-d'); 

if (empty($name)) {
$status .= 'Bitte <strong>Namen</strong> eingeben!<br><br>';
}
if (empty($email)) {
$status .= 'Bitte <strong>E-Mail</strong> eingeben!<br><br>';
}
if (empty($message)) {
$status .= 'Bitte <strong>Mitteilung</strong> eingeben!';
}

if(!empty($name) && !empty($email) && !empty($usertext))
{

function mysql_die() {
echo 'Fehler: ';
echo mysql_error();
exit;
} 

$link = mysql_connect("localhost","BENUTZER","PWD");
mysql_select_db("DATENBANK",$link);
$query = "INSERT INTO guestbook (id,name,email,homepage,message,datum) values('$id','$name','$email','$homepage','$message','$datum')";
$result = mysql_query($query) or mysql_die();
echo "
<html>
<head>
<meta http-equiv='refresh' content='0; URL=guestbook.php'>
</head>

<body>

</body>
</html>
";
}
if(empty($name) || empty($email) || empty($message)) {
?>
<!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">
<html>
<head>

<?PHP include '_meta/meta.html'; ?>
<link href='_style/markus_force.css' rel='stylesheet' type='text/css'>

</head>

<body bgcolor="#FFFFFF" style="margin: 0">
<table border="0" cellpadding="0" cellspacing="0" class="main_background">
  <tr>
    <td align="left" valign="top" class="navigation">&nbsp;</td>
        <td align="left" valign="top" class="content"><p class="title">Guestbook Fehler</p><?PHP echo $status ?><br><br><a href="javascript:history.back()";>zurück</a></td>
  </tr>
</table>
</body>
</html>
<?PHP
}
?>


captcha.php
PHP:
<?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('captcha.PNG'); //Backgroundimage
   $color = ImageColorAllocate($img, 0, 0, 0); //Farbe
   $ttf = $_SERVER['DOCUMENT_ROOT']."/captcha/XFILESF"; //Schriftart
   $ttfsize = 25; //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);
?>


Und das weiss ich nicht, wo das hinkommt
PHP:
<?php
session_start();
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);
}
else{
   die ("Der Sicherheitscode ist falsch!");
}
?>
 
Zuletzt bearbeitet:
niemand hier, der mir helfen kann :confused:

ich wäre wirklich echt froh, den ich müsste mal mein Gästebuch fertig kriegen, sonst hänge ich da noch tage drann..


mfg SiMpLy
 
Also das letzte gehört zu der function wo der text eingetragen wird weil da vorher der
bestätigungscode geprüft wird.
 
naja, brauch nun keine Hilfe mehr.. obwohl, es hat ja sowieso niemand geholfen..
ich habe es unterdessen selbst hinbekommen


mfg SiMpLy

ps.: thema kann geschlossen/gelöscht werden!!
 
Traktandum 1 - Fehlermeldungen
Enorm Hilfreich für potentielle Helfer ist es, wenn sie wissen, was schief läuft. Beliebte aber völlig unnütze Phrasen sind hierbei:
- "Es funktioniert nicht (mehr)" optional mit einem angehängten "aber ich habe nichts gemacht"
- "Hilfe, wo ist der Fehler?" ohne nähere Angaben, was über den Fehler bekannt ist
- "Was mache ich falsch?" ohne nähere Angaben, was man überhaupt macht

Beschreib doch wenigstens WAS nicht geht, wenn möglich WO der Fehler auftritt und WIE sich das äussert. Das hilft schon viel.

Traktandum 2 - Code pasten
Wenn einer 200 Zeilen Code pastet, der grösstenteils aus einem heruntergeladenen Script stammt, ohne nähere Angaben zu machen, wo sich der Fehler befinden könnte, wirkt das für potentielle Helfer eher abschreckend. Ich denke nicht, dass jemand ohne weiteres die Zeit findet, geschweige denn Lust dazu hat, eine Stunde lang Reverse-Engineering zu betreiben, um eine vage Spur zu finden.

Traktandum 3 - Ungeduld
Nur langsam mit den jungen Pferden. Post um 20:16, dann wird er gelesen und es kann gut und gerne ein paar Minuten (sagen wir 17 Minuten und 34 Sekunden) dauern, bis der Post von jemandem gelesen wird, der a) es sich zutraut dir zu helfen und b) die Zeit und Lust dazu hat. Dann liest er sich erstmals die vielen Codezeilen durch. Das geht auch gut und gerne ein paar Minuten (sagen wir 47 Minuten und die fehlenden 26 Sekunden). Huch nun ist es bereits 21:16.
Oi in der Zwischenzeit hast du wieder einen Post gemacht. Der Helfer schaut sich also die Seite an, liest was über das Script. Nur ganz kurz. Schon sind wieder 10 Minuten um. Jetzt ist 21:26. Nun macht sich der joviale Coderkumpel an die Arbeit und sucht den Fehler. Das passiert nicht zwingend in 12 Minuten, denn da kam schon dein nächster Post. Also üb dich doch ein bisschen in Geduld.
Ausserdem hat sich Napofis anscheinend die Mühe gemacht, sich mit deinem Post näher zu befassen. Also war der Wille durchaus da, was du ja auch lobend hättest erwähnen können. Aber scheinbar ist Napofis ja "niemand". Und der hat laut deiner Aussage ja geholfen ;)

Traktandum 4 - Debugging
Die Verlockung ist gross, gleich ins Forum zu rennen und die "Cracks" die eigene Arbeit machen zu lassen (will ich dir hier jetzt nicht unterstellen, aber ich kenn die Gefahr aus meinen eigenen Anfängerzeiten). Ein bisschen Vorarbeit auf Seiten des Fragenstellers kann aber nicht schaden.

- Aktivieren von error_reporting(E_ALL | E_STRICT); (einfach oben ins Script einfügen)
- Kontrollausgaben zum Überprüfen von Zuständen von Variablen in fehlerhaften Blöcken
- PHP 5 hat wunderbare erweiterte Funktionalitäten zu Exeptionhandling. Nutzt ein paar davon

Traktandum 5 - Diverses
Nett wär auch, wenn du bei gefundener Lösung andeuten könntest, wo das Problem lag. Das hier ist im Endeffekt eine Wissensdatenbank und User mit ähnlichen Problemen wollen nicht lesen, dass es das Problem schon einmal gab, sondern dass es schon einmal gelöst wurde. Und wenn sie beruhigt sind und wissen, dass es eine Lösung gibt, möchten sie diese Lösung gerne sehen ;)

So das wars. Wer sich an dem Post hier stösst, darf gerne auch eine PM schreiben. Aber das musste jetzt raus, da mich die Erwartungshaltung einiger User doch teilweise etwas frustriert.

Grüsse an Simply und an die #fun-zone

De Igäl
 
Zurück