【问题标题】:Calling a PHP class method and getting the return value using jQuery and AJAX使用 jQuery 和 AJAX 调用 PHP 类方法并获取返回值
【发布时间】:2025-12-22 19:05:12
【问题描述】:

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

尽管如此,仍然没有任何东西可以显示。我在这里做错了什么?

【问题讨论】:

  • 通常每个“动作”都会有一个 PHP 文件,因为每个请求地址应该只执行一个操作。然后,您只需根据要调用的函数更改请求 URL。
  • 这些 PHP 文件是如何形成的?我想这几乎是我问题的核心:)
  • SetTitle.php, GetTitle.php, SetDescription.php... 你懂的:)
  • 哈哈,是的 :) 但是内容是什么,如何让他们退回东西? :)
  • 通过 URL 查询字符串参数或发布的数据发送内容,并处理返回的数据(本例中最简单的字符串)...如果你要去,你需要知道如何从 PHP 返回数据使用 PHP :)

标签: javascript php jquery html ajax


【解决方案1】:

从关于这个问题的长评论列表来看,只有一件事可能会破坏 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>

【讨论】:

  • 感谢您的信息。虽然仍然一无所获:/ 编辑了对原始问题的建议更正。
【解决方案2】:

最后一个问题出在AJAX请求上,由于格式的原因,浏览器认为它是跨域的。实际上它在同一个域中工作。

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

只要我改成just

url: "taskHandler.php"

它开始工作了。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您复制了 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-&gt;SetTitle($_POST['title']);

      【讨论】:

        最近更新 更多