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

3

我是一个帮助翻译的助手。

我为自己创建了一个小项目。由于我不是很有经验的程序员,所以我开始使用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/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;

尽管如此,仍未看到任何内容显示出来。我在这里做错了什么?


2
通常情况下,每个“操作”都应该有一个PHP文件,因为每个请求地址只能执行一个操作。然后,您只需根据要调用的函数更改请求URL即可。 - iCollect.it Ltd
这些PHP文件将会如何形成?我想这基本上是我的问题的核心 :) - JKase
SetTitle.php, GetTitle.php, SetDescription.php... 你懂的 :) - iCollect.it Ltd
通过URL查询字符串参数或发布的数据发送内容,并处理返回的数据(在此示例中最简单的方式是作为字符串)...如果您要使用PHP,则需要知道如何从PHP返回数据 :) - iCollect.it Ltd
@RajdeepPaul 我想这就是我的问题所在。我该如何在PHP中处理AJAX查询并发送回复?另外,似乎我把PHP和JavaScript的语法与那个var t混淆了 :) - JKase
显示剩余8条评论
4个回答

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>

提交按钮通常会提交整个表单。由于提供了空的action参数,post操作将转到当前页面。这将立即重新加载,并中断可能已经发出但未完全发送的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>

谢谢提供的信息。不过还是没有得到任何结果 :/ 我已经将建议的更正编辑到原始问题中了。 - JKase

2

最后的问题在于AJAX请求,因为格式问题导致浏览器认为它是跨域的。实际上它是在同一域名下工作。

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

一旦我改为仅使用
url: "taskHandler.php"

它开始工作了。

感谢大家的贡献!我在这里尝试排除故障时学到了很多。


1
请按照以下步骤进行:
如果您希望每个请求仅调用一个后端方法,则考虑只允许其中一个字段进行输入:'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;
    }
}

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']);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接