php - 调试 AJAX 表单
问题描述
我有一个.php
带有 HTML 代码的文件,在其中我用 AJAX 调用另一个带有 html 文件的 php。表单。显然,这种形式的某些东西是错误的,或者是它之后的查询。问题是:
- 当我提交它时,页面重新加载,我无法调试我的表单。
- 当我
preventDefault
在我的代码上使用并阻止表单提交时,我无法调试,因为查询尚未执行。 - 无法编写显示变量的 html 消息,因为重新加载 php 后表单消失了。
在这种情况下如何调试我的代码?
文件1.php
$(".edit-post").click(function(){
var postid = $(this).attr("id");
$.ajax({
type: "GET",
url: "/admin/EditProductForm.php/",
dataType: "html",
data: {
ajaxpostid: postid
},
success: function(data){
$('#post').html(data);
}
});
$("#post").show();
});
编辑ProductForm.php
<?php
$ID = $_GET["ajaxpostid"];
$post = GetProduct($ID);
if(!empty($_POST)){
...query
}
?>
<html>
<form>
.
.
.
</form>
</html>
解决方案
首先要了解的是,虽然您的 HTML 和 Javascript 可能已经通过 PHP 传送到工作站,但它现在运行在一个完全独立的环境中,根本无法访问 PHP。
您在服务器上运行的 PHP 正在服务器环境中运行,并且无法访问在浏览器中运行的 HTML 和 JavaScript。
应用程序的两个部分通过在提交表单时将数据作为 aGET
或POST
请求的一部分发送,或者通过 AJAX 发送和接收消息来进行通信。在一个页面中使用这两种方法是不寻常的。
因此,您可以分别调试这两个部分。
转向您的代码:
单击按钮时会触发您的 AJAX 代码。在没有任何其他属性的情况下,按钮也会触发一个submit
. 这就是导致页面重新加载的原因。由于您使用 AJAX 更新您的页面,您不希望它重新加载,所以停止它preventDefault();
$(".edit-post").click(function(event){ // add the event parameter here
event.preventDefault(); // Prevent the default action - the submit.
var postid = $(this).attr("id");
...
完成此操作后,您可以使用浏览器工具的“网络”选项卡来查看消息、查看正在发送的内容以及收到的响应。
事情的服务器端有点尴尬,但echo
在适当的地方添加语句可以在调试时提供有用的输出。请注意,您不需要 AJAX 脚本来调试服务器端 - 一个带有正确字段的简单 HTML 表单就可以了。如果您正在使用GET
,您甚至可以在命令行上手动键入 URL 和查询字符串并观察结果。
但是,在您的代码中存在一个基本缺陷。
在您的 AJAX 代码中,您将请求类型设置为GET
( type: "GET",
)。在您的 PHP 脚本中,您正在寻找$_GET["ajaxpostid"];
,这没关系,但随后您开始查看$_POST
数组,该数组将为空,因为您的 AJAX 调用使用了GET
。
现在在这一点上,没有足够的代码来清楚你想要实现的目标。如果您的 SQL 查询只是检索数据以填充编辑表单,那么GET is an appropriate method, and you shouldn't be looking at the
$_POST` 数组。
但是,您发布的代码表明该EditProductForm.php
代码正在生成 HTML 以执行编辑。如果是这种情况,您根本不需要 AJAX,您可以只submit
使用File1.php
. 另一方面,如果您希望页面在不刷新的情况下转换为编辑表单,则File1.php
需要创建编辑表单并合并服务器发送的数据,您EditProductForm.php
不应该这样做。
推荐阅读
- c# - 将结构数组从 C#(.NET Core) 传递到 C++(未管理)
- r - 箱线图和散点图并排
- angular - Angular 6 - 使用 @Input 运算符获取字符串。价值未知
- javascript - addEventListener 到链接不起作用
- javascript - 在我的模板垂直菜单栏中,我希望它在页面加载时隐藏
- javascript - 将参数传递给控制器 JS(剑道数据源)
- c++ - 如何使用boost属性树使用boost解析json字符串中的数组元素?
- bash - dig linux 脚本显示来自 txt 文件的结果
- java - 如何从 ValueEventListener Firebase 中检索数据
- android - 在 android studio 中使用语音识别器