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

时间:2016-01-06 16:06:49

标签: javascript php jquery html 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;
但是,仍然没有得到任何东西。我在这里做错了什么?

4 个答案:

答案 0 :(得分:2)

关于这个问题的长评论列表,只有一件事可能搞乱了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>

答案 1 :(得分:2)

最后一个问题在于AJAX请求,因为格式化,Web浏览器将其视为跨域。实际上它在同一个领域工作。

url: "http://www.example.com/taskHandler.php",

我一改为

url: "taskHandler.php"

它开始工作了。

感谢大家的投入!我在这里学到了很多东西,试图解决这个问题。

答案 2 :(得分:0)

执行以下步骤:
如果您希望每个请求只调用一个后端方法,请考虑只允许其中一个字段进行输入:'title''description'
*** js part:

<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;
    }
}

答案 3 :(得分:0)

您复制了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']);