Captcha in class.php einbinden

ogrish

Grünschnabel
Hallo,
Wie der Titel schon sagt, habe ich ein Problem mit dem einbinden des Captchas in die "comment.class.php"

comment.class.php:

PHP:
<?php

class Comment
{
	private $data = array();
	
	public function __construct($row)
	{
		/*
		/	The constructor
		*/
		
		$this->data = $row;
	}
	
	public function markup()
	{
		/*
		/	This method outputs the XHTML markup of the comment
		*/
		
		// Setting up an alias, so we don't have to write $this->data every time:
		$d = &$this->data;
		
		$link_open = '';
		$link_close = '';
		
		if($d['url']){
			
			// If the person has entered a URL when adding a comment,
			// define opening and closing hyperlink tags
			
			$link_open = '<a href="'.$d['url'].'">';
			$link_close =  '</a>';
		}
		
		// Converting the time to a UNIX timestamp:
		$d['dt'] = strtotime($d['dt']);
		
		// Needed for the default gravatar image:
		$url = 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]).'/img/default_avatar.gif';
		
		return '
		
			<div class="comment">
				<div class="avatar">
					'.$link_open.'
					<img src="http://www.gravatar.com/avatar/'.md5($d['email']).'?size=50&amp;default='.urlencode($url).'" />
					'.$link_close.'
				</div>
				
				<div class="name">'.$link_open.$d['name'].$link_close.'</div>
				<div class="date" title="Added at '.date('H:i \o\n d M Y',$d['dt']).'">'.date('d M Y',$d['dt']).'</div>
				<p>'.$d['body'].'</p>
			</div>
		';
	}
	
	public static function validate(&$arr)
	{
		/*
		/	This method is used to validate the data sent via AJAX.
		/
		/	It return true/false depending on whether the data is valid, and populates
		/	the $arr array passed as a paremter (notice the ampersand above) with
		/	either the valid input data, or the error messages.
		*/
		
		$errors = array();
		$data	= array();
		
		// Using the filter_input function introduced in PHP 5.2.0
		
		if(!($data['email'] = filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)))
		{
			$errors['email'] = 'Please enter a valid Email.';
		}
		
		if(!($data['url'] = filter_input(INPUT_POST,'url',FILTER_VALIDATE_URL)))
		{
			// If the URL field was not populated with a valid URL,
			// act as if no URL was entered at all:
			
			$url = '';
		}
		
		// Using the filter with a custom callback function:
		
		if(!($data['body'] = filter_input(INPUT_POST,'body',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
		{
			$errors['body'] = 'Please enter a comment body.';
		}
		
		if(!($data['name'] = filter_input(INPUT_POST,'name',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
		{
			$errors['name'] = 'Please enter a name.';
		}
		
		if(!empty($errors)){
			
			// If there are errors, copy the $errors array to $arr:
			
			$arr = $errors;
			return false;
		}
		
		// If the data is valid, sanitize all the data and copy it to $arr:
		
		foreach($data as $k=>$v){
			$arr[$k] = mysql_real_escape_string($v);
		}
		
		// Ensure that the email is lower case:
		
		$arr['email'] = strtolower(trim($arr['email']));
		
		return true;
		
	}

	private static function validate_text($str)
	{
		/*
		/	This method is used internally as a FILTER_CALLBACK
		*/
		
		if(mb_strlen($str,'utf8')<1)
			return false;
		
		// Encode all html special characters (<, >, ", & .. etc) and convert
		// the new line characters to <br> tags:
		
		$str = nl2br(htmlspecialchars($str));
		
		// Remove the new line characters that are left
		$str = str_replace(array(chr(10),chr(13)),'',$str);
		
		return $str;
	}

}

?>

und hiermit überprüfe ich die Captchaeingabe:

PHP:
if ( md5($income['captcha']) == $_SESSION['captcha'] ) 
{
// Skript...
}

Als leztes wird dann , wenn alles richtig war, mit:

submit.php
PHP:
<?php

// Error reporting:
error_reporting(E_ALL^E_NOTICE);

include "connect.php";
include "comment.class.php";

/*
/	This array is going to be populated with either
/	the data that was sent to the script, or the
/	error messages.
/*/

$arr = array();
$validates = Comment::validate($arr);

if($validates)
{
	/* Everything is OK, insert to database: */
	
	mysql_query("	INSERT INTO comments(name,url,email,body,ip)
					VALUES (
						'".$arr['name']."',
						'".$arr['url']."',
						'".$arr['email']."',
						'".$arr['body']."',
                                                '".$_SERVER['REMOTE_ADDR']."'
					)");
	
	$arr['dt'] = date('r',time());
	$arr['id'] = mysql_insert_id();
	
	/*
	/	The data in $arr is escaped for the mysql query,
	/	but we need the unescaped variables, so we apply,
	/	stripslashes to all the elements in the array:
	/*/
	
	$arr = array_map('stripslashes',$arr);
	
	$insertedComment = new Comment($arr);

	/* Outputting the markup of the just-inserted comment: */

	echo json_encode(array('status'=>1,'html'=>$insertedComment->markup()));

}
else
{
	/* Outputtng the error messages */
	echo '{"status":0,"errors":'.json_encode($arr).'}';
}
?>

in die MySQL DB gespeichert. Daher dachte ich, dass ich die Captcha überprüfung bei der "comment.class.php" erledige.

Wer eine Idee hat bitte melden :-)


Anhang noch "script.php":

PHP:
$(document).ready(function(){
	/* The following code is executed once the DOM is loaded */
	
	/* This flag will prevent multiple comment submits: */
	var working = false;
	
	/* Listening for the submit event of the form: */
	$('#addCommentForm').submit(function(e){

 		e.preventDefault();
		if(working) return false;
		
		working = true;
		$('#submit').val('Working..');
		$('span.error').remove();
		
		/* Sending the form fileds to submit.php: */
		$.post('submit.php',$(this).serialize(),function(msg){

			working = false;
			$('#submit').val('Submit');
			
			if(msg.status){

				/* 
				/	If the insert was successful, add the comment
				/	below the last one on the page with a slideDown effect
				/*/

				$(msg.html).hide().insertBefore('#addCommentContainer').slideDown();
				$('#body').val('');
			}
			else {

				/*
				/	If there were errors, loop through the
				/	msg.errors object and display them on the page 
				/*/
				
				$.each(msg.errors,function(k,v){
					$('label[for='+k+']').append('<span class="error">'+v+'</span>');
				});
			}
		},'json');

	});
	
});


Achja wundert euch nicht ist jQuery + MySQL + PHP zusammen darum manchmal so "kompliziert".

Wenn ihr noch fragen habt oder welche fehler gesehen habt, bitte melden!


Mein erster Post Mein erster Thread hiermit möchte ich mich noch vorstellen ;).




PS: Ich erwarte nicht, dass ihr hellsehen könnt also müsst/könnt ihr mir villeicht nur Tipps geben danke :p.


Gruss 0grish

EDIT: hier die Quelle alle codes:


http://tutorialzine.com/2010/06/simple-ajax-commenting-system/
 
Zuletzt bearbeitet:
@saftmeister: Hier ist ein Zitat (aber was er wirklich will, weiß ich auch nicht;))
...in die MySQL DB gespeichert. Daher dachte ich, dass ich die Captcha überprüfung bei der "comment.class.php" erledige.

Wer eine Idee hat bitte melden :-)

(Ist es überhaupt erlaubt, vollständigen Code von anderen Websites hier zu posten?)
 
Hi.
(Ist es überhaupt erlaubt, vollständigen Code von anderen Websites hier zu posten?)
Das ist von Fall zu Fall unterschiedlich, eine allgemeingültige / pauschale Aussage gibt's daher nicht.

Um Gewißheit zu haben, was zulässig ist, und was hierbei zu beachten ist, wirft man ganz einfach einen Blick in die Lizenzbestimmungen des Anbieters.

http://tutorialzine.com/license/ hat gesagt.:
The source code and techniques, covered in our tutorials, are free for use in your personal and commercial projects. The text and images of our articles, however, are copyrighted and may not be used or copied without written permission (this includes translation of the articles in different languages).

You can use, modify and build upon our code for your (or your clients’) personal and commercial projects with no attribution necessary.

You are not allowed to redistribute our demo files directly (you are encouraged to share a link to the tutorials instead).

If you plan to include our source code in site templates or to package it with other forms of digital content, meant for direct selling on online marketplaces (such as ThemeForest, ActiveDen etc.), you are required to include a back-link to the article in question on Tutorialzine.com.

Den erforderlichen "Back-Link" zum Artikel hat ogrish in seinem Beitrag gesetzt, also spricht auch nichts dagegen, den Quellcode hier zu posten.

Ich glaube das muss wohl mit der anderen Website ausgemacht werden ;)
Glauben heißt nicht wissen.

Wie gesagt, ein kurzer Blick in die Lizenzbestimmungen klärt die Frage eindeutig, anstatt hier weitere Mutmaßungen zu streuen.

mfg Maik
 
Irgendwie hätte ich mir denken können, dass man unter Lizenzbestiimungen gucken muss. Aber danke für die ausführliche Erklärung!
 
Kurz und einfach: Ich möchte einen "Sicherheitscode" einbinden und die eingabe überprüfen.

Ich habe es schon so versucht:

bei submit.php:

PHP:
/* ................. */
if ( md5($income['captcha']) == $_SESSION['captcha'] ) 
{
elseif($validates)
{
	/* Everything is OK, insert to database: */
	
/*......................*/

else
{
	/* Outputtng the error messages */
	echo '{"status":0,"errors":'.json_encode($arr).'}';
}
}

, aber das erkennt sogar ein blinder ohne Stock, dass das nicht stimmen kann.

Dann noch die Form:

HTML:
<div id="addCommentContainer">
	<p>Add a Comment</p>
	<form id="addCommentForm" method="post" action="">
    	<div>
        	<label for="name">Your Name</label>
        	<input type="text" name="name" id="name" />
            
            <label for="email">Your Email</label>
            <input type="text" name="email" id="email" />
            
            <label for="url">Website (not required)</label>
            <input type="text" name="url" id="url" />
            
            <label for="body">Comment Body</label>
            <textarea name="body" id="body" cols="20" rows="5"></textarea>

            <label for="captcha">Captchacode</label><br>
            <img src="captcha/captcha.php" border="0" alt="captcha"><br>
            <input name="captcha" size="5" type="text">
            
            <input type="submit" id="submit" value="Submit" />
        </div>
    </form>
</div>

Gruss ogrish
 
Du hast auch einen Fehler bei den IF-Struktueren:
PHP:
/* ................. */
if ( md5($income['captcha']) == $_SESSION['captcha'] ) 
{
  elseif($validates)
  {
      /* Everything is OK, insert to database: */
      
      /*......................*/

      else
      {
        /* Outputtng the error messages */
        echo '{"status":0,"errors":'.json_encode($arr).'}';
      }
   }
Irgendwie hast du kein IF zu ELSEIF und eine schließende Klammer fehlt!
 
Du hast auch einen Fehler bei den IF-Struktueren:
PHP:
/* ................. */
if ( md5($income['captcha']) == $_SESSION['captcha'] ) 
{
  elseif($validates)
  {
      /* Everything is OK, insert to database: */
      
      /*......................*/

      else
      {
        /* Outputtng the error messages */
        echo '{"status":0,"errors":'.json_encode($arr).'}';
      }
   }
Irgendwie hast du kein IF zu ELSEIF und eine schließende Klammer fehlt!

Sorry hier der ganze code ab IF:

PHP:
if ( md5($income['captcha']) == $_SESSION['captcha'] ) 
{
elseif($validates)
{
	/* Everything is OK, insert to database: */
	
	mysql_query("	INSERT INTO comments(name,url,email,body,ip)
					VALUES (
						'".$arr['name']."',
						'".$arr['url']."',
						'".$arr['email']."',
						'".$arr['body']."',
                                                '".$_SERVER['REMOTE_ADDR']."'
					)");
	
	$arr['dt'] = date('r',time());
	$arr['id'] = mysql_insert_id();
	
	/*
	/	The data in $arr is escaped for the mysql query,
	/	but we need the unescaped variables, so we apply,
	/	stripslashes to all the elements in the array:
	/*/
	
	$arr = array_map('stripslashes',$arr);
	
	$insertedComment = new Comment($arr);

	/* Outputting the markup of the just-inserted comment: */

	echo json_encode(array('status'=>1,'html'=>$insertedComment->markup()));

}
else
{
	/* Outputtng the error messages */
	echo '{"status":0,"errors":'.json_encode($arr).'}';
}
}

Ich schau es mir kurz an.
 
Alternativ kannst du auch diese doppelte IF abfrage durch eine AND verknüpfung lösen, also:

PHP:
if ( md5($income['captcha']) == $_SESSION['captcha']  && $validates == true) {
// Code...
} 
else {
 //anderer Code bzgl des errors
}
 
Zuletzt bearbeitet:
Zurück