Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有反垃圾邮件字段、PHP或JS问题的联系表单_Javascript_Php_Jquery_Twitter Bootstrap - Fatal编程技术网

Javascript 带有反垃圾邮件字段、PHP或JS问题的联系表单

Javascript 带有反垃圾邮件字段、PHP或JS问题的联系表单,javascript,php,jquery,twitter-bootstrap,Javascript,Php,Jquery,Twitter Bootstrap,我有一个bootstrap联系人表单,我添加了一个简单的数学公式来防止垃圾邮件。表单使用contact_me.js来处理表单,并调用contact_me.php文件来验证和发送电子邮件。它还使用jqBootstrapValidation.js验证表单。我使用了一个基本的引导模板并修改了我站点的模板,所以我没有创建实际的表单或php(或js) 表单发送电子邮件很好,但是我添加的“人类”数学等式字段不起作用,因为不管数学答案是否正确,它都会发送电子邮件。我对PHP或JS知之甚少,但我对HTML和CS

我有一个bootstrap联系人表单,我添加了一个简单的数学公式来防止垃圾邮件。表单使用contact_me.js来处理表单,并调用contact_me.php文件来验证和发送电子邮件。它还使用jqBootstrapValidation.js验证表单。我使用了一个基本的引导模板并修改了我站点的模板,所以我没有创建实际的表单或php(或js)

表单发送电子邮件很好,但是我添加的“人类”数学等式字段不起作用,因为不管数学答案是否正确,它都会发送电子邮件。我对PHP或JS知之甚少,但我对HTML和CSS非常了解——因此我知道问题在于PHP或JS。有人能帮我解决问题所需的更新吗

HTML表单代码:

<div class="form-group col-xs-12 floating-label-form-group controls">
        <label>Email Address</label>
        <input type="email" class="form-control" placeholder="Email Address" id="email" required data-validation-required-message="Please enter your email address.">
        <p class="help-block text-danger"></p>
    </div>
</div>
<div class="row control-group">
    <div class="form-group col-xs-12 floating-label-form-group controls">
        <label>Phone Number</label>
        <input type="tel" class="form-control" placeholder="Phone Number" id="phone" required data-validation-required-message="Please enter your phone number.">
        <p class="help-block text-danger"></p>
    </div>
</div>
<div class="row control-group">
    <div class="form-group col-xs-12 floating-label-form-group controls">
        <label>Message</label>
        <textarea rows="5" class="form-control" placeholder="Message" id="message" required data-validation-required-message="Please enter a message."></textarea>
        <p class="help-block text-danger"></p>
    </div>
</div>
<div class="row control-group">
    <div class="form-group col-xs-12 floating-label-form-group controls">
        <label>Human</label>
        <input type="text" class="form-control" placeholder="2 + 3 = ?" id="human" required data-validation-required-message="Please solve math equation to prove you are human">
        <p class="help-block text-danger"></p>
    </div>
</div>
 <br>
<div id="success"></div>
<div class="row">
    <div class="form-group col-xs-12">
        <button type="submit" class="btn btn-success btn-lg">Send</button>
    </div>
</div>
</form>

电子邮件地址

电话号码

消息

人类


发送
联系_Me.php代码:

<?php
// Check for empty fields
if(empty($_POST['name'])        ||
empty($_POST['email'])      ||
empty($_POST['phone'])      ||
empty($_POST['message'])    ||
empty($_POST['human'])  ||
!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
{
echo "No arguments Provided!";
return false;
}

//Check if simple anti-bot test is correct
if ($human !== 5) {
   $errHuman = 'Your anti-spam is incorrect';
}   

$name = $_POST['name'];
$email_address = $_POST['email'];
$phone = $_POST['phone'];
$message = $_POST['message'];
$message = $_POST['human'];

// Create the email and send the message
$to = 'info@mysite.com'; // Add your email address inbetween the '' replacing yourname@yourdomain.com - This is where the form will send a message to.
$email_subject = "Portfolio Website Message:  $name";
$email_body = "You have received a new message from your portfolio website contact form.\n\n"."Here are the details:\n\nName: $name\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message";
$headers = "From: noreply@mysite.com\n"; // This is the email address the generated message will be from. We recommend using something like noreply@yourdomain.com.
$headers .= "Reply-To: $email_address"; 
mail($to,$email_subject,$email_body,$headers);
return true;            
?>

联系_me.js代码:

$(function() {

$("input,textarea").jqBootstrapValidation({
    preventSubmit: true,
    submitError: function($form, event, errors) {
        // additional error messages or events
    },
    submitSuccess: function($form, event) {
        // Prevent spam click and default submit behaviour
        $("#btnSubmit").attr("disabled", true);
        event.preventDefault();

        // get values from FORM
        var name = $("input#name").val();
        var email = $("input#email").val();
        var phone = $("input#phone").val();
        var message = $("textarea#message").val();
        var human = $("textarea#human").val();
        var firstName = name; // For Success/Failure Message
        // Check for white space in name for Success/Fail message
        if (firstName.indexOf(' ') >= 0) {
            firstName = name.split(' ').slice(0, -1).join(' ');
        }
        $.ajax({
            url: "././mail/contact_me.php",
            type: "POST",
            data: {
                name: name,
                phone: phone,
                email: email,
                message: message,
                human: human
            },
            cache: false,
            success: function() {
                // Enable button & show success message
                $("#btnSubmit").attr("disabled", false);
                $('#success').html("<div class='alert alert-success'>");
                $('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
                    .append("</button>");
                $('#success > .alert-success')
                    .append("<strong>Your message has been sent. </strong>");
                $('#success > .alert-success')
                    .append('</div>');

                //clear all fields
                $('#contactForm').trigger("reset");
            },
            error: function() {
                // Fail message
                $('#success').html("<div class='alert alert-danger'>");
                $('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
                    .append("</button>");
                $('#success > .alert-danger').append("<strong>Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!");
                $('#success > .alert-danger').append('</div>');
                //clear all fields
                $('#contactForm').trigger("reset");
            },
        })
    },
    filter: function() {
        return $(this).is(":visible");
    },
});

$("a[data-toggle=\"tab\"]").click(function(e) {
    e.preventDefault();
    $(this).tab("show");
});
});

// When clicking on Full hide fail/success boxes
$('#name').focus(function() {
$('#success').html('');
});
$(函数(){
$(“输入,文本区域”).jqBootstrapValidation({
对,,
submitError:函数($form、event、errors){
//其他错误消息或事件
},
submitSuccess:函数($form,event){
//防止垃圾邮件点击和默认提交行为
$(“#btnSubmit”).attr(“禁用”,真);
event.preventDefault();
//从表单中获取值
变量名称=$(“输入名称”).val();
var email=$(“输入电子邮件”).val();
var phone=$(“输入电话”).val();
var message=$(“textarea#message”).val();
var human=$(“textarea#human”).val();
var firstName=name;//对于成功/失败消息
//检查名称中是否有空格以显示成功/失败消息
if(firstName.indexOf(“”)>=0){
firstName=name.split(“”).slice(0,-1).join(“”);
}
$.ajax({
url:“.//邮件/联系_me.php”,
类型:“POST”,
数据:{
姓名:姓名,,
电话:电话,,
电邮:电邮,,
讯息:讯息,,
人类:人类
},
cache:false,
成功:函数(){
//启用按钮并显示成功消息
$(“#btnSubmit”).attr(“禁用”,false);
$('#success').html(“”);
$('#success>.alert success').html(“×;”)
.附加(“”);
$(“#success>.alert success”)
.append(“您的邮件已发送。”;
$(“#success>.alert success”)
.附加(“”);
//清除所有字段
$('#contactForm')。触发器(“重置”);
},
错误:函数(){
//失败消息
$('#success').html(“”);
$('#success>.alert danger').html(“×;”)
.附加(“”);
$(“#success>.alert danger”).append(“对不起”+firstName+”,我的邮件服务器似乎没有响应。请稍后再试!”);
$(“#success>.alert danger”).append(“”);
//清除所有字段
$('#contactForm')。触发器(“重置”);
},
})
},
过滤器:函数(){
return$(this).is(“:可见”);
},
});
$(“a[数据切换=\”选项卡\“])。单击(函数(e){
e、 预防默认值();
$(此).tab(“显示”);
});
});
//单击完全隐藏失败/成功框时
$('#name')。焦点(函数(){
$('#success').html('');
});

jqBootstrapValidation.js是一个用于自动验证引导表单的插件,位于:

以防止PHP发送邮件,您需要在调用脚本之前退出脚本。从代码中可以看出

if ($human !== 5) {
    $errHuman = 'Your anti-spam is incorrect';
}  
就是告诉你数学答案是否正确的地方。因此,您需要将其替换为:

if ($_POST['human'] != 5) {
    $errHuman = 'Your anti-spam is incorrect';
    return false;
}

编辑 首先添加
die($_POST['human'])到您的php(无论在哪里)

然后在jquery中向
success
error
函数中添加
data
参数。后跟console.log(数据);比如:

请分别更改
“成功:


完成这些编辑后,运行脚本并查看日志。

要防止PHP发送邮件,需要在调用脚本之前退出脚本。从代码中可以看出

if ($human !== 5) {
    $errHuman = 'Your anti-spam is incorrect';
}  
就是告诉你数学答案是否正确的地方。因此,您需要将其替换为:

if ($_POST['human'] != 5) {
    $errHuman = 'Your anti-spam is incorrect';
    return false;
}

编辑 首先添加
die($_POST['human'])到您的php(无论在哪里)

然后在jquery中向
success
error
函数中添加
data
参数。后跟console.log(数据);比如:

请分别更改
“成功:


完成这些编辑后,运行它并查看日志。

在html表单中,我看不到名称字段,但它在php代码和javascript中都被引用。为了进行测试,我将此字段添加到我的表单版本中。下面的代码基于您的原始邮件,除了发送实际邮件(没有本地邮件服务器!),它会按预期处理提交。但是,在一些地方,您会回显消息,然后返回false——javascript是否使用这种回显内容

<?php

    session_start();/* required if using session based captcha image */

    /* If the page is accessed by GET etc then display error, otherwise process form input */
    if( $_SERVER['REQUEST_METHOD']=='POST' ){


        function message( $message=false, $errors=array() ){
            if( $message ) return json_encode( array( 'message' => $message, 'errors'=>$errors ) );
        }

        $errors=array();
        $options = array( 'flags' => FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_ENCODE_HIGH );


        /* Filter all submitted fields */
        foreach( $_POST as $field => $value ){
            switch( $field ){
                case 'name': $name=filter_input( INPUT_POST, $field, FILTER_SANITIZE_SPECIAL_CHARS, $options ); break;
                case 'email': $email=filter_input( INPUT_POST, $field, FILTER_VALIDATE_EMAIL ); break;
                case 'phone': $phone=filter_var( filter_input( INPUT_POST, $field, FILTER_SANITIZE_NUMBER_FLOAT ), FILTER_VALIDATE_FLOAT ); break;
                case 'message': $message=filter_input( INPUT_POST, $field, FILTER_SANITIZE_SPECIAL_CHARS, $options ); break;
                case 'human': $human=filter_var( filter_input( INPUT_POST, $field, FILTER_SANITIZE_NUMBER_INT ), FILTER_VALIDATE_INT ); break;
                default:
                    $errors[]='Unknown field: '.$field;
                break;
            }
        }

        /* check each value is acceptable / has a value */
        $variables=array($name,$email,$phone,$message,$human);
        foreach( $variables as $value ){
            if( !isset( $value ) or empty( $value ) ){
                $errors[]='Missing parameter';
            }
        }

        /* Integer test */
        if( floatval( $human )!==floatval( $_SESSION['simple_maths_captcha'] ) ) {
            $errors[]='Anti-Spam verification failed';
        }

        if( !empty( $errors ) ) exit( message( 'Unable to send email', $errors ) );


        $to = 'info@mysite.com';
        $email_subject = "Portfolio Website Message: " . $name;
        $email_body = "You have received a new message from your portfolio website contact form.\n\n
            Here are the details:\n\n
            Name: ".$name."\n\n
            Email: ".$email_address."\n\n
            Phone:".$phone."\n\n
            Message:\n".$message;
        $headers = "From: noreply@mysite.com\n";
        $headers .= "Reply-To: ".$email_address; 

        /* should return either true or false */
        $result = @mail( $to, $email_subject, $email_body, $headers );


        exit( message( 'Your message has been sent: '.$result, $errors ) );


    } else {
        header( 'HTTP/1.0 405 Method Not Allowed', TRUE, 405 );
        $errors[]='Incorrect method';
        exit( message( 'Method not allowed', $errors ) );
    }         
?>
由于输入类型是一个标准文本字段,我不知道它是否会有任何区别,但这应该是:-

var human = $("input#human").val();
至于实际的验证码挑战,除非该数字发生变化,否则它对垃圾邮件发送者几乎没有保护作用。通常情况下,人们会(或至少会)
<?php
    /* captcha.php */
    session_start();
    header('Content-type: image/png');



    function challenge( $full=false, $low1=1, $high1=20, $low2=1, $high2=20 ){
        /* Generate an arithmetic challenge with random numbers and a random method */
        $ops=array( '+','-' );
        if( $full==true ) $ops=array_merge( $ops, array( '/', 'x' ) );

        $numbers=array( rand( $low1, $high1 ), rand( $low2, $high2 ) );
        rsort( $numbers, SORT_NUMERIC );
        $key=rand( 0, count( $ops )-1 );

        $question="{$numbers[0]} {$ops[ $key ]} {$numbers[1]}";

        switch( $ops[ $key ] ){
            case '+': $answer=( $numbers[0] + $numbers[1] ); break;
            case '-': $answer=( $numbers[0] - $numbers[1] ); break;
            case '/': $answer=( $numbers[0] / $numbers[1] ); break;
            case 'x': $answer=( $numbers[0] * $numbers[1] ); break;
        }
        $obj=new stdClass;
        $obj->question=$question;
        $obj->answer=$answer;

        return $obj;
    }

    /* Calculate question and answer */
    $captcha=call_user_func( 'challenge', false, 1, 50, 1, 30 );
    $question=$captcha->question;
    $answer=$captcha->answer;

    /* Set the session variable that will be tested for */
    $_SESSION['simple_maths_captcha']=$answer;

    /* Render an image with this challenge */
    $oImg = @imagecreate( 80, 30 ) or die("unable to create image");
    $background = imagecolorallocate( $oImg, 255, 255, 255 );
    $colour = imagecolorallocate( $oImg, 0, 0, 0 );

    imagestring( $oImg, 4, 5, 5,  $question, $colour );
    imagepng( $oImg );
    imagedestroy( $oImg );
?>
<img src='captcha.php' alt='' width=80 height=30 />
htaccess rewrite
----------------
RewriteRule ^images/maths\.png$ /captcha.php [NC,L]

<img src='/images/maths.png' alt='' width=80 height=30 />
    if( intval( $human )!==5 ) {
        echo 'Anti-Spam verification failed';
        return false;
    }
    if( floatval( $human )!==floatval( $_SESSION['simple_maths_captcha'] ) ) {
        echo 'Anti-Spam verification failed';
        return false;
    }