[英]Calling a PHP class method and getting the return value using jQuery and AJAX
我正在为自己创建一个小项目。 我不是一个非常有经验的程序员,所以我开始用PHP创建项目。 很快,很明显通过HTML按钮点击运行PHP函数和类方法并不是最简单的任务。
我有一些测试代码设置。 首先,我创建了一个HTML表单,我想从中读取用户输入值:
<form name="form" action="" method="POST">
Title: <br> <input type="text" id="title"> <br>
Description: <br> <input type="text" id="description"> <br>
Priority: <br> <input type="number" id="priority"> <br> <br>
<input type="button" id="ajaxTest" value="Send>
</form>
现在,当单击id为#ajaxTest的按钮时,我想调用我创建的PHP文件中的一个类方法。 为此,我google了一下,最后得到了以下jQuery:
<script type="text/javascript">
$("#ajaxTest").click( function() {
$t = $("#title").val();
$.ajax({
type: "POST",
url: "http://www.example.com/task.php",
data: "t="+t
}).done(function(results) {
$("#results").html(results).hide().fadeIn();
})
});
</script>
HTML中还有一个id为#results的div元素,用于显示结果数据。
现在,被调用的task.php如下所示(为了可读性而简化):
<?php
class Task {
private $title;
private $description;
function SetTitle($t) {
$this->title = $t;
}
function GetTitle() {
return $this->title;
}
function SetDescription($d) {
$this->description = $d;
}
function GetDescription() {
return $this->description;
}
}
我将如何通过jQuery / AJAX调用此类的不同成员函数并获取其输入到DOM的返回值? 我认为我必须创建一个像TaskHandler这样的中间类来启动对象等等,但我完全失去了。 几乎整整一天都在这里,但我没有找到能够引导我找到合适解决方案的答案。 非常感谢你的帮助!
编辑:我现在编辑了jQuery,它看起来如下:
<script type="text/javascript">
$("#ajaxTest").click( function() {
var t = $("#title").val();
$.ajax({
type: "POST",
url: "http://www.example.com/taskHandler.php",
data: {"t": t},
success: function(response) {
$("#results").html(response);
}
});
});
</script>
和taskHandler.php在下面
<?php
require_once("task.php");
$t = new Task();
$t->SetTitle($_POST['t']);
$output = $t->GetTitle();
echo $output;
尽管如此,仍然没有得到任何东西。 我在这做错了什么?
关于这个问题的长评论列表,只有一件事可能搞乱了AJAX调用:
<form name="form" action="" method="POST">
Title: <br> <input type="text" id="title"> <br>
Description: <br> <input type="text" id="description"> <br>
Priority: <br> <input type="number" id="priority"> <br> <br>
<input type="submit" id="ajaxTest" value="Submit">
</form>
提交按钮通常会提交整个表单。 当提供空操作参数时,后置操作将转到当前页面。 这将立即重新加载,并中断可能已发出但未完全发送的AJAX请求。
更改:
<form name="form" action="" method="POST">
Title: <br> <input type="text" id="title"> <br>
Description: <br> <input type="text" id="description"> <br>
Priority: <br> <input type="number" id="priority"> <br> <br>
<input type="button" id="ajaxTest" value="Send">
</form>
最后一个问题出现在AJAX请求中,由于格式的原因,Web浏览器将其视为跨域。 实际上它在同一个领域工作。
url: "http://www.example.com/taskHandler.php",
我一改为刚刚
url: "taskHandler.php"
它开始工作了。
谢谢各位的意见! 我在这里学到了很多东西,试图解决这个问题。
完成以下步骤:
如果您希望每个请求只调用一个后端方法,那么请考虑只允许其中一个字段进行输入: 'title'
或'description'
。
*** js部分:
<script type="text/javascript">
$("#ajaxTest").click(function(e) {
e.preventDefaut();
var title, desc, type;
if (title = $("#title").val().trim()){
type = 'title';
} else if (desc = $("#description").val().trim()){
type = 'description';
}
$.ajax({
type: "POST",
url: "http://www.example.com/task.php",
data: {'action': type, 'value': title || desc} // 'value' is for setting certain property, to return an existing property send only 'action' param
}).done(function(results) {
$("#results").html(results).hide().fadeIn();
})
});
</script>
php部分: task.php
<?php
class Task {
private $title;
private $description;
function SetTitle($t) {
$this->title = $t;
}
function GetTitle() {
return $this->title;
}
function SetDescription($d) {
$this->description = $d;
}
function GetDescription() {
return $this->description;
}
}
if (isset($_POST['action']) && !empty($_POST['action'])){
$action = $_POST['action'];
$value = (isset($_POST['value']) && !empty($_POST['value']))? $_POST['value'] : null;
$task = new Task();
$method = (($value)? 'Set' : 'Get') . ucfirst($action);
if method_exists($task, $method){ // BTW - method name should start with a lowercase letter
$result = ($value)? $task->$method($value) : $task->$method();
echo ($result)? $result : "";
return;
}
}
你有重复的getTitle方法:
class Task {
private $title;
private $description;
function SetTitle($t) {
$this->title = $t;
}
function GetTitle() {
return $this->title;
}
function SetDescription($d) {
$this->description = $d;
}
function GetTitle() {
return $this->description;
}
}
我建议你将php文件作为单独的文件进行测试,例如:
$text = "test";
class Task {
private $title;
private $description;
function SetTitle($t) {
$this->title = $t;
}
function GetTitle() {
return $this->title;
}
function SetDescription($d) {
$this->description = $d;
}
function GetDescription() {
return $this->description;
}
}
$t = new Task();
$t->SetTitle($text);
$output = $t->GetTitle();
echo $output;
因此,您将确定php文件是否没有错误。 同样在html / javascript中放入一个console.log(inputValue)
来查看你发送的是什么。
如果一切正常,你可以执行$t->SetTitle($_POST['title']);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.