PHP,尝试将captcha添加到现有表单

时间:2011-12-20 19:49:57

标签: php forms captcha

我不是PHP程序员,但是使用了它,足以放入联系表单。但是,我正在尝试添加一个验证码字段,现在可以使用,但表单不会对其进行验证 - 所以无论什么都提交

有人可以帮忙吗?对不起,如果代码很乱,并提前感谢

我页面顶部的代码

        <?php session_start() ?> 
<?php  
      //If the form is submitted  
    if(isset($_POST['submit'])) {  

    //Check to make sure that the name field is not empty  
     if(trim($_POST['name']) == '') {  
         $hasError = true;  
     } else {  
         $name = trim($_POST['name']);  
     }  

       //Check to make sure that the subject field is not empty  
    if(trim($_POST['subject']) == '') {  
         $hasError = true;  
     } else {  
         $subject = trim($_POST['subject']);  
     }  

    //Check to make sure sure that a valid email address is submitted  
     if(trim($_POST['email']) == '')  {  
         $hasError = true;  
     } else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST['email']))) 
     {  
         $hasError = true;  
     } else {  
         $email = trim($_POST['email']);  
     }  

    //Check to make sure comments were entered  
    if(trim($_POST['message']) == '') {  
         $hasError = true;  
     } else {  
    if(function_exists('stripslashes')) {  
         $message = stripslashes(trim($_POST['message']));  
     } else {  
         $message = trim($_POST['message']);  
     } 

     /*captcha 2*/ 

    if(isset($_POST["captcha"])) {
        $hasError = true;
    } else {
    if($_SESSION["captcha"]==$_POST["captcha"]) {
    }
    }
    //CAPTHCA is valid; proceed the message: save to database, send by e-mail ...

    //If there is no error, send the email  
     if(!isset($hasError)) {  
         $emailTo = 'email address'; //Put your own email address here  
         $emailTo = 'email address'; //Put your own email address here  
         $body = "Name: $name \n\nEmail: $email \n\nSubject: $subject \n\nMessage:\n $message";  
         $headers = 'From: website form <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' .         
         $email;  

    mail($emailTo, $subject, $body, $headers);  
         $emailSent = true;  
     }
     }
?> 

   Code in the form:

    [php]<?php if(isset($hasError)) { //If errors are found ?>  

        <p class="error">Please check if you've filled all the fields with valid information.           Thank    you.</p>  
  <?php } ?>  

  <?php if(isset($emailSent) && $emailSent == true) { //If email is sent ?>  
      <p><strong>Email Successfully Sent!</strong></p>  
      <p>Thank you <strong><?php echo $name;?></strong> for contacting us. Your email was successfully sent and we will be in touch with you soon.</p>  
      <?php } ?>  

 <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" id="contactform">  
     <div>  

         <p>
         <label for="name">Name</label><br />
         <input type="text" name="name" value="" id="name" class="required">
         </p> 
     </div>  

     <div>  

         <p>
         <label for="email">Email</label><br />
         <input type="text" name="email" value="" id="email" class="required">
         </p> 
     </div>  

     <div>  

         <p>
         <label for="subject">Subject</label><br />
         <input type="text" name="subject" value="" id="subject" class="required">
         </p> 

     </div>  

     <div style="margin-bottom:25px;">  

         <p>
         <label for="message">Message</label><br />
         <textarea rows="5" name="message" value="" id="message" class="required"></textarea>
         </p> 

     </div>  
     <div style="margin-bottom:25px;">  


         <img src="captcha.php" alt="captcha image">
         <p>
         <label for="captcha">(antispam code, 3 black symbols)</label><br />
         <input type="text" name="captcha" maxlength="3" id="captcha" class="required">
         </p> 

     </div>  
     <input type="submit" value="Send Message" name="submit" />  
 </form>
 [/php]

2 个答案:

答案 0 :(得分:0)

if(isset($ _ POST [“captcha”]))

你错过了一个括号。

编辑显示整个代码....为缺少的验证码条件添加了括号。因此,您的代码没有检查验证码是否通过post设置。它只是根据post变量检查会话变量。如果两者都是空白的,表单将邮寄。您可能仍然遇到captcha.php或会话变量的问题。

<?php  
      //If the form is submitted  
    if(isset($_POST['submit'])) {  

    //Check to make sure that the name field is not empty  
     if(trim($_POST['name']) == '') {  
         $hasError = true;  
     } else {  
         $name = trim($_POST['name']);  
     }  

       //Check to make sure that the subject field is not empty  
    if(trim($_POST['subject']) == '') {  
         $hasError = true;  
     } else {  
         $subject = trim($_POST['subject']);  
     }  

    //Check to make sure sure that a valid email address is submitted  
     if(trim($_POST['email']) == '')  {  
         $hasError = true;  
     } else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST['email']))) 
     {  
         $hasError = true;  
     } else {  
         $email = trim($_POST['email']);  
     }  

    //Check to make sure comments were entered  
    if(trim($_POST['message']) == '') {  
         $hasError = true;  
     } else {  
    if(function_exists('stripslashes')) {  
         $message = stripslashes(trim($_POST['message']));  
     } else {  
         $message = trim($_POST['message']);  
     }  
     }

     /*captcha 2*/ 


    if(isset($_POST["captcha"])) {
    if($_SESSION["captcha"]==$_POST["captcha"])
    {
    //CAPTHCA is valid; proceed the message: save to database, send by e-mail ...

    //If there is no error, send the email  
     if(!isset($hasError)) {  
         $emailTo = 'enquiries@sjbprojects.com'; //Put your own email address here  
         $emailTo = 'sjbullen@gmail.com'; //Put your own email address here  
         $body = "Name: $name \n\nEmail: $email \n\nSubject: $subject \n\nMessage:\n $message";  
         $headers = 'From: SJB Projects website form <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' .          $email;  

    mail($emailTo, $subject, $body, $headers);  
         $emailSent = true;  
    }
   else
    {
    echo 'CAPTHCA is not valid; ignore submission';
    }
    }  


    } else {

     ///message here if CAPTCHA is not set (via post)

    }

    }  
     ?> 

  <?php if(isset($hasError)) { //If errors are found ?>  

        <p class="error">Please check if you've filled all the fields with valid information.           Thank    you.</p>  
  <?php } ?>  

  <?php if(isset($emailSent) && $emailSent == true) { //If email is sent ?>  
      <p><strong>Email Successfully Sent!</strong></p>  
      <p>Thank you <strong><?php echo $name;?></strong> for contacting SJB Projects. Your email was successfully sent and we will be in touch with you soon.</p>  
      <?php } ?>  

 <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" id="contactform">  
     <div>  

         <p>
         <label for="name">Name</label><br />
         <input type="text" name="name" value="" id="name" class="required">
         </p> 
     </div>  

     <div>  

         <p>
         <label for="email">Email</label><br />
         <input type="text" name="email" value="" id="email" class="required">
         </p> 
     </div>  

     <div>  

         <p>
         <label for="subject">Subject</label><br />
         <input type="text" name="subject" value="" id="subject" class="required">
         </p> 

     </div>  

     <div style="margin-bottom:25px;">  

         <p>
         <label for="message">Message</label><br />
         <textarea rows="5" name="message" value="" id="message" class="required"></textarea>
         </p> 

     </div>  
     <div style="margin-bottom:25px;">  


         <img src="captcha.php" alt="captcha image">
         <p>
         <label for="captcha">(antispam code, 3 black symbols)</label><br />
         <input type="text" name="captcha" maxlength="3" id="captcha" class="required">
         </p> 

     </div>  
     <input type="submit" value="Send Message" name="submit" />  
 </form>

答案 1 :(得分:0)

[edit] 2011-12-20 8:22 pm CST - 使用OP正在使用的最终代码更新了第二个代码块 - 基于异地聊天。

有一种更好的方法来编写代码。我在下面举一个例子。提出问题,我会用评论解释更新代码。我修改了你对验证码的if语句,因此它不需要双if。在||语句中使用if(或)会导致PHP在测试第一个条件后停止(如果第一个条件的计算结果为true)。因此,如果未设置变量,则永远不会继续进行POST与SESSION的比较。

另外,我将你的hasError变量默认为false,并测试了boolean值。这是更好的因为它有意义。想想那些会追随你的程序员。如果它有意义,它将更容易使用。 你可能是那个程序员:)

[已编辑以添加session_start();]

<?php
session_start();

// default value
$hasError = false;

//If the form is submitted
if(isset($_POST['submit'])) {
    //Check to make sure that the name field is not empty
    if(trim($_POST['name']) == '') {
        $hasError = true;
    } else {
        $name = trim($_POST['name']);
    }

    //Check to make sure that the subject field is not empty
    if(trim($_POST['subject']) == '') {
        $hasError = true;
    } else {
        $subject = trim($_POST['subject']);
    }

    //Check to make sure sure that a valid email address is submitted
    if(trim($_POST['email']) == '')  {
        $hasError = true;
    } else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST['email']))) {
        $hasError = true;
    } else {
        $email = trim($_POST['email']);
    }

    //Check to make sure comments were entered
    if( trim($_POST['message']) == '') {
        $hasError = true;
    } else {
        if(function_exists('stripslashes')) {
            $message = stripslashes(trim($_POST['message']));
        } else {
            $message = trim($_POST['message']);
        }  
    }

    if( ! isset( $_POST["captcha"] ) || $_SESSION["captcha"] != $_POST["captcha"] ) {
        $hasError = true;
        echo 'CAPTHCA is not valid; ignore submission<br>';
        echo $_POST['captcha' . ' != ' . $_SESSION['captcha'] . '<br>';
    }

    //If there is no error, send the email  
    if( $hasError == false ) {  
        $emailTo = 'email@email.com'; //Put your own email address here  
        $emailTo = 'email@email.com'; //Put your own email address here  
        $body = "Name: $name \n\nEmail: $email \n\nSubject: $subject \n\nMessage:\n $message";  

        // !!!!!!!!!!!!!!!! REMOVE \r\n from $emailTo or your form will be hacked !!!!!!!!!!!!!!!!!!!!!!
        $headers = 'From: website form <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;  

        mail($emailTo, $subject, $body, $headers);  
        $emailSent = true;  
    } else {

    }
}

[编辑 - 完整代码,编辑和(希望)改进]

    <?php
session_start();

function clean_for_email( $inbound )
{
   return str_replace( array( "\n", "\r" ), "", $inbound );
}
// I really like the name of this function. :D
function outputInput( $name, $required )
{
    $attribs[] = "name=\"{$name}\"";
    $attribs[] = "id=\"{$name}\"";
    $attribs[] = $required?'class="required"':'';
    $attribs[] = 'type="text"';


    if ( count( $_POST ) && array_key_exists( $name, $_POST ) )
    {
        $attribs[] = 'value="' . htmlspecialchars( $_POST[$name] ) . '"';
    }

    echo '<input ' . implode( ' ', $attribs ) . '>';
}
//------------------------------------------------------------------------
function outputTextarea( $name, $required, $rows = 5 )
{
    $attribs[] = "name=\"{$name}\"";
    $attribs[] = "id=\"{$name}\"";
    $attribs[] = $required?'class="required"':'';
    $attribs[] = 'rows="5"';
    $value = '';

    if ( count( $_POST ) && array_key_exists( $name, $_POST ) )
    {
        $value = htmlspecialchars( $_POST[$name] );
    }

    echo '<textarea ' . implode( ' ', $attribs ) . '>' . $value . '</textarea>';
}

// default value
$hasError = false;
$emailSent = false;

//If the form is submitted
if( count( $_POST ) && isset($_POST['submit'] ) ) {
    //Check to make sure that the name field is not empty
    if(trim($_POST['name']) == '') {
        $hasError = true;
    } else {
        $name = trim($_POST['name']);
    }

    //Check to make sure that the subject field is not empty
    if(trim($_POST['subject']) == '') {
        $hasError = true;
    } else {
        $subject = trim($_POST['subject']);
    }

    //Check to make sure sure that a valid email address is submitted
    if(trim($_POST['email']) == '')  {
        $hasError = true;
    } else if ( ! preg_match( '/^.+@.+$/i', trim( $_POST['email'] ) ) ) {
        $hasError = true;
    } else {
        $email = trim($_POST['email']);
    }

    //Check to make sure comments were entered
    if( trim($_POST['message']) == '') {
        $hasError = true;
    } else {
        if(function_exists('stripslashes')) {
            $message = stripslashes(trim($_POST['message']));
        } else {
            $message = trim($_POST['message']);
        }  
    }

    if ( ! array_key_exists( 'captcha', $_POST ) || $_SESSION['captcha'] != $_POST["captcha"] ) {
        $hasError = true;
    }

    if( ! $hasError )
    {
        $captchaValid = true;
        //If there is no error, send the email
        if( $hasError == false ) {
            $emailTo = 'xxx'; //Put your own email address here
            $body = "Name: $name \n\nEmail: $email \n\nSubject: $subject \n\nMessage:\n $message";
            $headers = 'From: website form <'.clean_for_email( $emailTo ).'>' . "\r\n" . 'Reply-To: ' . clean_for_email( $email );
            mail($emailTo, $subject, $body, $headers);
            $emailSent = true;
        } else {

        }
    }
}
?>

<? if( $hasError ) : ?>
    <p class="error">Please check if you've filled all the fields with valid information Thank you.</p>  
<? endif; ?>

<? if( $emailSent == true) : ?>
    <p><strong>Email Successfully Sent!</strong></p>  
    <p>Thank you <strong><?php echo $name;?></strong> for contacting us. Your email was successfully sent and we will be in touch with you soon.</p>  
<? endif; ?>  

 <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" id="contactform">  
    <div>  
        <p>
        <label for="name">Name</label><br />
        <? outputInput( 'name', true ); ?>
        </p> 
    </div>  

    <div>  
        <p>
        <label for="email">Email</label><br />
        <? outputInput( 'email', true ); ?>
        </p> 
    </div>  

    <div>  
        <p>
        <label for="subject">Subject</label><br />
        <? outputInput( 'subject', true ); ?>
        </p> 
    </div>  

    <div style="margin-bottom:25px;">  
        <p>
        <label for="message">Message</label><br />
        <? outputTextarea( 'message', true ); ?>
        </p> 
    </div>  
    <div style="margin-bottom:25px;">  
        <img src="captcha.php" alt="captcha image">
        <p>
        <label for="captcha">(antispam code, 3 black symbols)</label><br />
        <? outputInput( 'captcha', true ); ?>
        </p> 
    </div>  
    <input type="submit" value="Send Message" name="submit" />  
</form>