2016-01-06 126 views
3

我正在为自己创建一个小项目。我不是一个非常有经验的程序员,所以我开始用PHP创建项目。很快,很明显,通过HTML按钮点击运行PHP函数和类方法并不是最直接的任务。调用PHP类方法并使用jQuery和AJAX获取返回值

我有一些测试代码设置。首先,我创建了一个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; 

还没有得到任何东西展现出来,虽然。我在这里做错了什么?

+2

正常情况下,每个“操作”都会有一个PHP文件,因为每个请求地址应该只执行一个操作*。然后,您只需根据您希望调用的功能更改请求URL。 –

+0

这些PHP文件将如何形成?我想这几乎是我的问题的核心:) – JKase

+0

'SetTitle.php','GetTitle.php','SetDescription.php' ...你的想法:) –

回答

0

经过以下几个步骤:
如果你希望调用只有一个每个请求后端方法,然后再考虑只允许输入这些字段之一:'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; 
    } 
} 
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> 
+0

感谢您的信息。尽管如此,仍然没有任何结果:/编辑了原来的问题的建议更正。 – JKase

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)来看看你发送了什么。

如果一切工作,你做的AJAX请求,其网络浏览器视为跨域因为格式的$t->SetTitle($_POST['title']);

2

的最后一个问题撒谎。其实它在同一个领域工作。

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

只要我改变只是

url: "taskHandler.php" 

它开始工作。

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