PDA

View Full Version : Adding in a PHP Captcha to existing Form



aejacks8
02-24-2010, 05:49 PM
Hi everyone, I was hoping someone could please shine some light on this problem I'm stuck on. I've found a free PHP Captcha setup at http://www.white-hat-web-design.co.uk/articles/php-captcha.php.

I already have a php form mailer that sends out the form submission and redirects either to a success page or back to the form page on failure. The first set of code is the existing mailer and the second set of code is the Captcha PHP code. I thought I could just combine the two, but I'm just getting a blank screen after submit.


<?php

// This block converts any HTML code in the text fields from the previous page to standard text and then the returns
// Do this for each thing they can type into the forum

$textbox = HTMLSpecialChars("$textbox", ENT_QUOTES);

// You would need to put your validation in at this point, check to see if the variables are good and if not, display an error page
// Javascript on the form would be the easiest way for you to do this without more PHP

// The system is now used to create email content


$to = "myemail@email.com";
$subject = "Website Information Request";
$name_field = $_POST['name'];
$company_field = $_POST['company'];
$city_field = $_POST['city'];
$state_field = $_POST['state'];
$zip_field = $_POST['zip'];
$phone_field = $_POST['phone'];
$email_field = $_POST['email'];
$comments_field = $_POST['comments'];

$body = "From: $name_field \n
Company: $company_field \n
City: $city_field \n
State: $state_field \n
Zip: $zip_field \n
Phone: $phone_field \n
E-Mail: $email_field\n
Message:$comments_field";

mail($to, $subject, $body);


if(mail($mail_to, $mail_subject, $mail_body, "From: $email\r\nReply-to: $email"))
{
header("Location: confirmation.shtml"); /* Redirect browser to thank you page */
exit;
}
else {
header("Location: contact.shtml"); /* Redirect browser to fail page */
exit;
}
?>



<?php
session_start();

if( isset($_POST['submit'])) {
if( $_SESSION['security_code'] == $_POST['security_code'] && !empty($_SESSION['security_code'] ) ) {
// Insert you code for processing the form here, e.g emailing the submission, entering it into a database.
echo 'Thank you. Your message said "'.$_POST['message'].'"';
unset($_SESSION['security_code']);
} else {
// Insert your code for showing an error message here
echo 'Sorry, you have provided an invalid security code';
}
} else {
?>

I tried copying/pasting the form code under the //Insert your code for processing the form here... portion of the PHP Captcha code, but thats where I'm getting the blank screen. Any advice is greatly appreciated!

Fou-Lu
02-24-2010, 06:21 PM
You can combine it, but you're second block is incomplete; it has an open else statement


<?php

session_start();

if( isset($_POST['submit']))
{
if(isset($_SESSION['security_code']) && $_SESSION['security_code'] == $_POST['security_code']) // This was incorrect, it could have still tossed
{
//echo 'Thank you. Your message said "'.$_POST['message'].'"';
unset($_SESSION['security_code']);

########## YOUR MAIL CODE HERE ##########
// This block converts any HTML code in the text fields from the previous page to standard text and then the returns
// Do this for each thing they can type into the forum

$textbox = HTMLSpecialChars("$textbox", ENT_QUOTES);

// You would need to put your validation in at this point, check to see if the variables are good and if not, display an error page
// Javascript on the form would be the easiest way for you to do this without more PHP

// The system is now used to create email content


$to = "myemail@email.com";
$subject = "Website Information Request";
$name_field = $_POST['name'];
$company_field = $_POST['company'];
$city_field = $_POST['city'];
$state_field = $_POST['state'];
$zip_field = $_POST['zip'];
$phone_field = $_POST['phone'];
$email_field = $_POST['email'];
$comments_field = $_POST['comments'];

$body = "From: $name_field \n
Company: $company_field \n
City: $city_field \n
State: $state_field \n
Zip: $zip_field \n
Phone: $phone_field \n
E-Mail: $email_field\n
Message:$comments_field";

mail($to, $subject, $body);


if(mail($mail_to, $mail_subject, $mail_body, "From: $email\r\nReply-to: $email"))
{
header("Location: confirmation.shtml"); /* Redirect browser to thank you page */
exit;
}
else {
header("Location: contact.shtml"); /* Redirect browser to fail page */
exit;
}


########## END YOUR MAIL CODE ##########
}
else
{
// Insert your code for showing an error message here
die ('Sorry, you have provided an invalid security code');
}
}
else
{
die('You cannot access this page directly!');
}


?>





I changed the location of the session unset call. Otherwise it will never occur given the location of the header/exit calls.

aejacks8
02-24-2010, 06:46 PM
Thanks so much for the reply. I tried using that code and after entering in a form, I get redirected to a page that says "You cannot access this page directly!"

I see that this is the last "die" on the PHP you added. Does that mean its not even checking the captcha?

Fou-Lu
02-24-2010, 06:54 PM
No, its a problem with the form.
Post the html for the form please.

aejacks8
02-24-2010, 07:01 PM
Thanks again! HTML below:


<form action="formail2.php" method="post" name="form2" onSubmit="return submitIt(this)"><!--Form Start-->

<table width="400" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#E9ECFB" class="blueborder">
<tr>
<td colspan="2" class="form1" style="padding:10px">Fields marked with a * are required. </td>
</tr>
<tr>
<td width="199" class="form1" align="right">*Name (First &amp; Last):</td>
<td width="201" class="form1">
<input type="text" name="name" size="20"></td><!--First Last Name-->
</tr>
<tr>
<td align="right" class="form1">Company:</td>
<td class="form1">
<input type="text" name="company" size="20"><!--Company-->
</td>
</tr>
<tr>
<td align="right" class="form1">City:</td>
<td class="form1">
<input type="text" name="city" size="20"><!--City-->
</td>
</tr>
<tr>
<td align="right" class="form1">
State: </td>
<td class="form1">
<select name="state"><!--State-->
<option value="" selected="selected">Choose a state:</option>
<option value="AL">AL</option>
<option value="AK">AK</option>
<option value="AR">AR</option>
<option value="AZ">AZ</option>
<option value="CA">CA</option>
<option value="CO">CO</option>
<option value="CT">CT</option>
<option value="DC">DC</option>
<option value="DE">DE</option>
<option value="FL">FL</option>
<option value="GA">GA</option>
<option value="HI">HI</option>
<option value="IA">IA</option>
<option value="ID">ID</option>
<option value="IL">IL</option>
<option value="IN">IN</option>
<option value="KS">KS</option>
<option value="KY">KY</option>
<option value="LA">LA</option>
<option value="MA">MA</option>
<option value="MD">MD</option>
<option value="ME">ME</option>
<option value="MI">MI</option>
<option value="MN">MN</option>
<option value="MO">MO</option>
<option value="MS">MS</option>
<option value="MT">MT</option>
<option value="NC">NC</option>
<option value="ND">ND</option>
<option value="NE">NE</option>
<option value="NH">NH</option>
<option value="NJ">NJ</option>
<option value="NM">NM</option>
<option value="NV">NV</option>
<option value="NY">NY</option>
<option value="OH">OH</option>
<option value="OK">OK</option>
<option value="OR">OR</option>
<option value="PA">PA</option>
<option value="RI">RI</option>
<option value="SC">SC</option>
<option value="SD">SD</option>
<option value="TN">TN</option>
<option value="TX">TX</option>
<option value="UT">UT</option>
<option value="VA">VA</option>
<option value="VT">VT</option>
<option value="WA">WA</option>
<option value="WI">WI</option>
<option value="WV">WV</option>
<option value="WY">WY</option>
</select>
</td>
</tr>
<tr>
<td align="right" class="form1">Zip Code: </td>
<td class="form1">
<input type="text" name="zip" size="20"><!--Zip Code-->
</td>
</tr>
<tr>
<td align="right" class="form1">Phone Number: </td>
<td class="form1">
<input type="text" name="phone" size="20"><!--Phone Number-->
</td>
</tr>
<tr>
<td align="right" class="form1">*Email:</td>
<td class="form1">
<input type="text" name="email" size="20"><!--Email Address-->
</td>
</tr>
<tr>
<td align="right" class="form1">Comments:</td>
<td class="form1">
<textarea name="comments" cols="20" rows="3" wrap="VIRTUAL"></textarea><!--Comments Main Textarea-->
</td>
</tr>

<tr>
<td class="form1">&nbsp;</td>
<td class="form1">&nbsp;</td>
</tr>


<tr>
<td align="right" class="form1"><img src="CaptchaSecurityImages.php" /></td>
<td class="form1">Security Code:
<input id="security_code" name="security_code" type="text" />
</td>
</tr>

<tr>
<td class="form1">&nbsp;</td>
<td class="form1">&nbsp;</td>
</tr>

<tr>
<td class="form1" colspan="2" align="center"><input type="submit" value="Submit" name="B1">
<input type="reset" value="Reset" name="B2"> </td>
</tr>
<tr>
<td class="form1" colspan="2" align="center">&nbsp;</td>
</tr>
</table></form>

Fou-Lu
02-24-2010, 07:12 PM
<input type="submit" value="Submit" name="B1">


The submit button as been named B1. You'll need to either change the html submit to be 'submit' for its name, or change the PHP code:


if( isset($_POST['submit']))
// would become:
if (isset($_POST['B1']))


One or the other, I'd rename the submit button name since that makes more sense to me.

aejacks8
02-24-2010, 07:52 PM
<input type="submit" value="Submit" name="B1">


The submit button as been named B1. You'll need to either change the html submit to be 'submit' for its name, or change the PHP code:


if( isset($_POST['submit']))
// would become:
if (isset($_POST['B1']))


One or the other, I'd rename the submit button name since that makes more sense to me.

That did it! Thank you so much!