AJAX与PHP自提交表单和验证

AJAX与PHP自提交表单和验证,php,jquery,ajax,forms,Php,Jquery,Ajax,Forms,我一直在通过David Powers的《PHP解决方案》一书学习PHP,这本书有一个带有基本验证/错误处理和输入清理的联系表单,我希望在不刷新页面的情况下使用它 我正在用XAMPP在本地进行测试,并且使用php表单本身工作得非常完美:错误消息显示正确,如果表单成功提交,将显示一个感谢页面,表单将作为电子邮件发送到我的测试电子邮件地址 现在我需要表单来提交和显示带有AJAX的错误消息。我读过很多关于实现这一点的帖子,但我没有成功地实现这一点。我已经尝试了jQuery$.ajax和$.post方法-

我一直在通过David Powers的《PHP解决方案》一书学习PHP,这本书有一个带有基本验证/错误处理和输入清理的联系表单,我希望在不刷新页面的情况下使用它

我正在用XAMPP在本地进行测试,并且使用php表单本身工作得非常完美:错误消息显示正确,如果表单成功提交,将显示一个感谢页面,表单将作为电子邮件发送到我的测试电子邮件地址

现在我需要表单来提交和显示带有AJAX的错误消息。我读过很多关于实现这一点的帖子,但我没有成功地实现这一点。我已经尝试了jQuery$.ajax和$.post方法-如果字段都已填充,则会显示成功消息,但消息不会发送

我的猜测是javascript和php数组的结构不同,但不知道如何协调这一点。我甚至不确定php处理脚本得到/发送了什么。如何在不刷新页面的情况下提交此表单,但仍然使用php脚本进行服务器端验证

为了简化,我已经从页面中删除了所有内容(并将所有文件放在同一个文件夹中),除了表单:php、html和我无法理解的jQuery/AJAX

希望这是有意义的。我的4个文件:

mySite.js(我遇到麻烦的jQuery/AJAX…):

mySite={
jsFormSubmission:function(){
$(“#反馈”)。提交(功能(事件){
event.preventDefault();
var errorMsg=“

请修复指示的项目。

”; var successsg=“

感谢您的提交,您的邮件已发送。

”; 变量myObject={ 名称:$(“#名称”).val(), 电子邮件:$(“#电子邮件”).val(), 备注:$(“#备注”).val() }; var ajaxData=JSON.stringify(myObject); $.ajax({ 键入:“POST”, url:'form.php', 数据:ajaxData, 成功:功能(数据){ $(“.formResult”).html(successsg); }, 错误:函数(http){ $(“.formResult”).html(errorMsg); 警报(http.responseText); } }); }); } };
表单(contact.php):


$(文档).ready(函数(){
jsFormSubmission();
});

很抱歉,无法发送您的邮件。请稍后再试。 请修复所示的项目。

姓名: 请输入您的姓名 请输入您的电子邮件地址 无效的电子邮件地址 请输入您的信息

php(包含在contact.php顶部):


processmail.php(验证脚本-包含在form.php中):


有几种方法可以从PHP端显示错误。您可以抛出一个我不推荐的异常,或者使用一个标题:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
在AJAX调用中,使用jQuery错误回调:

$.ajax({ 
    url: //url,
    data: //data,
    success: function (data) { //show success },
    error: function () { //display code here } 
});
您还可以从PHP端返回错误消息正文中的错误,并在错误回调中从正文中删除该错误

PHP:

JavaScript:

error: function(http) {
   // show http.responseText;
}
此外,对于表单提交,请将数据打包到对象中,然后对其进行序列化。因此:

var myObject = {
    property1 : 'string',
    property2 : [ 'array' ]
};

var ajaxData = JSON.stringify(myObject);

有几种方法可以从PHP端显示错误。您可以抛出一个我不推荐的异常,或者使用一个标题:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
在AJAX调用中,使用jQuery错误回调:

$.ajax({ 
    url: //url,
    data: //data,
    success: function (data) { //show success },
    error: function () { //display code here } 
});
您还可以从PHP端返回错误消息正文中的错误,并在错误回调中从正文中删除该错误

PHP:

JavaScript:

error: function(http) {
   // show http.responseText;
}
此外,对于表单提交,请将数据打包到对象中,然后对其进行序列化。因此:

var myObject = {
    property1 : 'string',
    property2 : [ 'array' ]
};

var ajaxData = JSON.stringify(myObject);

数据:'$(“#反馈”).serializeArray();'不正确。这将以字符串的形式提交JS代码,而不是序列化调用的输出-除了字符串之外,代码永远不会被视为任何东西。你在那一行的上方还有一个流浪的
,把其他的都抛在脑后了。啊,是的,当我发布这篇文章时,我不小心删除了这个。谢谢你指出这一点。我明白你关于数据的观点:''是字符串。我替换了我用来缩短代码以便发布的变量。如果我删除撇号和分号,那么它将读取数据:$(“#反馈”).serializeArray(),我仍然无法使用ajax提交。
data:'$(“#反馈”).serializeArray()不正确。这将以字符串的形式提交JS代码,而不是序列化调用的输出-除了字符串之外,代码永远不会被视为任何东西。你在那一行的上方还有一个流浪的
,把其他的都抛在脑后了。啊,是的,当我发布这篇文章时,我不小心删除了这个。谢谢你指出这一点。我明白你关于数据的观点:''是字符串。我替换了我用来缩短代码以便发布的变量。如果我删除撇号和分号,那么它将读取数据:$(“#feedback”).serializeArray(),我仍然无法使用ajax提交。好的,在myObject中,我希望对每个字段使用此格式,然后将ajaxData变量传递给数据设置,如:$.ajax({data:ajaxData});?或者我还需要序列化ajaxData变量吗?我以前从未使用过json,
var myObject = {
    property1 : 'string',
    property2 : [ 'array' ]
};

var ajaxData = JSON.stringify(myObject);