【问题标题】:Ajax contact form issue with string带有字符串的 Ajax 联系表单问题
【发布时间】:2013-12-28 17:00:06
【问题描述】:

我一直在尝试使用 PHP 设置一个简单的联系表单,但它不起作用,我使用了 this 教程,它在第一次尝试时有效,但是当我尝试自定义它并添加一些字段时惨败。当我发送数据时,我认为这是 Ajax 和 PHP 之间的事情,但老实说我不知道​​。

这是我正在使用的代码:

HTML

<form id="formulariocontacto">
        <fieldset>
            <input type="text" id="name" name="name" class="input-block-level" placeholder="Name">
            <input type="text" id="telefono" name="telefono" class="input-block-level" placeholder="Phone">
            <input type="text" id="email" name="email" class="input-block-level" placeholder="Email">
            <input type="text" id="direccion" name="direccion" class="input-block-level" placeholder="Adress">
            <textarea rows="14" id="comentario" name="comentario" class="input-block-level" placeholder="Comments"></textarea>
            <button type="submit" class="botonform" class="btn btn-warning pull-right">SEND</button>
        </fieldset>
    </form>  

jQuery

 $("#formulariocontacto").submit(function(e){
  e.preventDefault();
  var nombre = $("#name").val();
  var telefono = $("#telefono").val();
  var email = $("#email").val();
  var direccion = $("#direccion").val();
  var comentario = $("#comentario").val();
  var dataString = 'nombre=' + nombre + '&email=' + email + '&comentario=' + comentario + '&telefono' + telefono + '&direccion' + direccion;
  function isValidEmail(emailAddress) {
    var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
    return pattern.test(emailAddress);
  };

  if (isValidEmail(email) && (comentario.length > 100) && (nombre.length > 1)){
    $.ajax({
    type: "POST",
    url: "procesar.php",
    data: dataString,
    success: function(){
      $('.exito').fadeIn(1000);
    }
    });
  } else{
    $('.error').fadeIn(1000);
  }

  return false;
});

PHP

<?php
// Email Submit
// Note: filter_var() requires PHP >= 5.2.0
if ( isset($_POST['email']) && isset($_POST['nombre']) && isset($_POST['comentario'])  ) {
$name_field=$_POST['nombre'];
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
$telefono_field=$_POST['telefono'];
$direccion_field=$_POST['direccion'];
$mensaje_field=$_POST['comentario'];
$subject=.$_POST['nombre']" V&#237;a mysite.com";
$mensaje="Nombre: $name_field\n Email: $email_field\n Tel&#233;fono: $telefono_field\n Direcci&#243;n: $direccion_field\n Mensaje:\n $mensaje_field";
  // detect & prevent header injections
$test = "/(content-type|bcc:|cc:|to:)/i";
foreach ( $_POST as $key => $val ) {
if ( preg_match( $test, $val ) ) {
  exit;
}
}  
 //send email
 mail( "mymail@mysite.com", $subject, $mensaje, "From: " . $email );
}
?>

我试图通过添加一些额外的字段来制作更完整的消息,您可以在 PHP 中看到 var "$mensaje"

【问题讨论】:

  • 即使你得到了你想要的工作,我只是想让你知道你的 mail() 输入没有被清理,因此让垃圾邮件发送者能够劫持你的表单并发送大量垃圾邮件。
  • 是的,我知道,有没有关于如何解决这个问题的 cmets?
  • 验证进入标题的任何内容(在本例中,您的发件人电子邮件)。清理你的主题。清理用户可以输入的所有字段。 dreamincode.net/forums/topic/…

标签: php jquery ajax contact-form


【解决方案1】:

在不知道您遇到了什么错误或什么不起作用的情况下,我只能假设您没有收到所有正在提交的数据?

如果是这样,那是因为您没有在 dataString 中传递它。

 var nombre = $("#name").val();
 var telefono = $("#telefono").val();
 var email = $("#email").val();
 var direccion = $("#direccion").val();
 var comentario = $("#comentario").val();
 var dataString = 'nombre=' + nombre + '&email=' + email + '&comentario=' + comentario + '&telefono=' + telefono + '&direccion=' + direccion;

清理电子邮件输入:

$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

那么你的邮件功能可以是:

mail("mymail@mail.com",$subject,$mensaje,"From:" . $email);

更新

您的 ajax 调用应该是:

if (isValidEmail(email) && (comentario.length > 100) && (nombre.length > 1)){
e.preventDefault();
    $.ajax({
        type: "POST",
        url: "procesar.php",
        data: dataString,
        success: function(){
            $('.exito').fadeIn(1000);
        },
        error: function(){
            $('.error').fadeIn(1000);
        }
    });
}

更新 2

  $subject=.$_POST['nombre']" V&#237;a mysite.com";

应该是

  $subject=$_POST['nombre']." V&#237;a mysite.com";

这就是产生 500 内部服务器错误的原因

【讨论】:

  • 感谢您指出这一点,我更新了 dataString 行并添加了经过清理的电子邮件输入,但是我仍然弹出我的 ajax 错误
  • 如果“成功:function()”不起作用,我在 jquery 中声明的那个不是 jquery 控制台错误只是我的“else”
  • 我得到一个语法错误:Uncaught SyntaxError: Unexpected token return
  • 我已经复制了它,我没有收到任何错误。你有一个活生生的例子的链接吗?
  • veromonaco.com/contact
【解决方案2】:

你忘了相等。

改变这个

var dataString = 'nombre=' + nombre + '&email=' + email + '&comentario=' + comentario + '&telefono' + telefono + '&direccion' + direccion;

 var dataString = 'nombre=' + nombre + '&email=' + email + '&comentario=' + comentario + '&telefono=' + telefono + '&direccion=' + direccion;

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多