使用jQuery和AJAX调用PHP类方法并获取返回值


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文件中的一个类方法。为此,我在谷歌上搜索了一下,最后得到了以下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/AAJAX调用这个类的不同成员函数,并获取它们的返回值以输入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']);