繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM