创建一个jQuery $ .post()到一个PHP控制器,然后在它的中间回到View,然后使用$ .get()继续控制器

时间:2011-08-16 21:59:19

标签: php jquery html json

我正在处理网页的视图和控制器,我正在试图弄清楚它是如何工作的:

  1. 控制器最初会定义页面加载时在视图中使用的变量。
  2. 用户提交表单后,会执行一个onclick jQuery函数,该函数会回发给控制器。
  3. 控制器返回视图true或false,具体取决于投票是否已成功插入数据库。
  4. View的jquery函数继续,确定下一步做什么:如果成功,执行另一个jQuery函数。
  5. 下一个jQuery函数执行$ .get返回控制器,该控制器确定要在视图中使用的相关变量。
  6. 现在,我的工作就是提交投票。但是,当我运行它时,我从未看到警报弹出窗口,这让我担心我的设置无法正常运行。

    以下是我的PHP网站控制器的代码:

    if(!isset($_POST['poll'])) //UPON PAGE LOAD
    {
        //define relevant variables to be put into the view
    }
    if(isset($_POST['poll'])) //UPON jQuery $.Post() back to controller
    {
        if($_POST['poll']=='done')
            $vote = 2;
        if($_POST['poll']=='no')
            $vote = 1;
        $id = $_POST['id'];
    
        $result = vote($user_id, $id, $vote); //inserts vote into Database
        if( !$res )
            echo json_encode(array('success'=>true, 'text'=>'success'));
        else
            echo json_encode(array('success'=>false, 'text'=>'fail'));
        //I want ^this json data to be sent back to the jQuery of my view 
    
    }
    if(isset($_GET['newListing']))
    {
        //code that would redifine relevant variables to be put into view
    }
    
    if(isset($_GET['newListing']) || !isset($_POST['poll']))
    {
       //code that does something--both upon page load and when needing to retrieve
       //and define variables to put into view.
    }
    include('view.php');
    

    以下是我的HTML / jQuery网站视图中的代码:

    <html> 
    <body>   
    <form name='poll' id='poll' >
    <INPUT TYPE="radio" name='poll'  value='done'checked/>Done it.<br/>
    <INPUT TYPE="radio" name='poll'  value='no'/>No.</br>
    <button id='submit-vote' onclick="postVote();">Submit</button>
    <INPUT TYPE='hidden' name='id' value='<?php echo $id; ?>'/>
    </form>
    </body>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
    function loadListing(){
       $.get('controller.php?newListing=yes',function(data){
           if(data.response == 'success'){
               //something}
            else{
               return false;}
       });
     }
     function postVote(){
       $.post('controller.php', { poll: $('input:radio[name=poll]:checked').val(), id: $('input:hidden[name=id]').val()} , function(data){
           if(data.success){
              alert('data.text');
              loadListing();
              return true;}
           else{ 
              alert(data.text);
              return false;}
                        }, 
                        "json");
       }
                </script>
    </html>
    

    任何帮助/建议表示赞赏!

    修改: 从我的查看代码: HTML:

    <fieldset id='poll'>
     <INPUT TYPE="radio" name='poll'  value='yes' checked/>Yes!<br/>
     <INPUT TYPE="radio" name='poll'  value='done'/>Done it.<br/>
     <INPUT TYPE="radio" name='poll'  value='no'/>No.</br>
     <button id='submit-vote'>Submit</button>
     <INPUT TYPE='hidden' name='id' value='<?php echo $id; ?>'/>
     </fieldset>
    

    jquery:

     jQuery(function($){
    
                    $("#submit-vote").click(
                        function(){ 
                            alert("HELLO");
                            $.post('controller.php', { poll: $('input:radio[name=poll]:checked').val(), id: $('input:hidden[name=id]').val()} , 
                            function(data)
                            {
                                alert("THIS FUNCTION WORKS");
    
                            }, "json"); 
                        }
                    );
                });
    

    控制器几乎一样。当我现在点击提交按钮时,alert("HELLO");被执行,根据Firefox的Firebug,$.post()确实会发生。但是,alert("THIS FUNCTION WORKS");不会被执行。 我需要帮助找出可能的原因......

    谢谢!

2 个答案:

答案 0 :(得分:2)

问题是json_encode创建了一个字符串。但是,在您的Javascript中,您尝试访问它,就像它是一个对象(data.success)一样。您需要先使用window.JSON.parse()将其转换为对象:

var dataObj = window.JSON.parse(data);

执行此操作后,您应该能够访问dataObj.success。

说实话,我不确定你为什么要把它变得那么复杂。为什么不返回一个简单的字符串,例如&#34; success&#34;或者&#34;失败&#34;?那么你不需要在php中编码对象或用JavaScript解码它。你只需这样做:

<强> PHP

if( !$res )
        echo 'success';
else
        echo 'failure';

<强>的JavaScript

if(data === 'success'){
    //do your stuff
}else{ 
    //do other stuff
}

根据OP对此答案的第一条评论进行编辑 一旦PHP脚本结束,您的JavaScript将重新获得控制权。在您发布的代码中,您在PHP脚本的末尾包含一个view.php文件。我不知道view.php里面有什么内容,包含这个文件很可能导致你的JS alert()仍然不会触发,即使你做了我上面描述的更改。这是因为如果在view.php文件中运行任何输出(即echo,print等),那么它将附加到json_encode创建的字符串中。结果将是window.JSON.parse()无法解析的字符串。

如果您希望脚本在回显后成功结束&#34;成功&#34;或者&#34;失败&#34; (或你的json_encoded版本),只需将return;放在echo语句之后:

if( !$res ){
    echo 'success';
else
    echo 'failure';
}
return;

答案 1 :(得分:0)

只应将include('view.php');放入if(!isset($_POST['poll'])) //UPON PAGE LOAD代码中。