【问题标题】:Passing variables from PHP to AJAX success function将变量从 PHP 传递到 AJAX 成功函数
【发布时间】:2014-01-25 09:20:51
【问题描述】:

我的目标是使用 AJAX 更新 WordPress 帖子。到目前为止我的代码:

脚本:

$.ajax({
    type: 'POST',
    url: ajax_url,
    data: {
        'action': 'wp_post',
        'ID': post_id,
        'post_title': post_title
},
success: function( data ) {
        $( '.message' )
        .addClass( 'success' )
        .html( data );
},
error: function() {
        $( '.message' )
        .addClass( 'error' )
        .html( data );
    }       
});

PHP:

function wp_post() {

    $post['ID'] = $_POST['ID'];
    $post['post_title'] = $_POST['post_title'];
    $post['post_status'] = 'publish';

    $id = wp_update_post( $post, true );

    if ( $id == 0 ) {
        $error = 'true';
        $response = 'This failed';
        echo $response;
    } else {
        $error = 'false';
        $response = 'This was successful';
        echo $response;
    }

}

如您所见,我的 PHP 函数中的 $response 变量正在传递给脚本中的成功函数,并且页面上显示了 $response 的值。

我想修改我的成功函数来做这样的事情:

success: function( data ) {
    if( $error == 'true' ) {
        // do something
    } else {
        // do something else
    }
},

问题是,我无法将 PHP 函数中的 $response$error 变量传递给我的 scipt 中的成功函数。

  1. 谁能告诉我如何将$response $error 传递给脚本的成功函数?
  2. 我应该采取更好的方法吗?

我是 AJAX 新手,如果问题非常基本,请见谅。

【问题讨论】:

  • 为什么不使用标准的 http 结果代码,而不是在协议之上重新发明一个协议?
  • 感谢 njzk2 - 正如我所说,我对 AJAX 很陌生。你有没有机会提供一个例子来说明如何做到这一点?
  • 将响应编码为 JSON 对象。查看 PHP 中的 json_encode 和 JavaScript 中的 JSON.parse
  • 使用php.net/manual/en/function.http-response-code.php设置失败码,进入ajax报错功能。
  • njzk - 谢谢,我去看看

标签: javascript php jquery ajax wordpress


【解决方案1】:

你应该将php脚本的响应编码为json,如下:

function wp_post() {

    $post['ID'] = $_POST['ID'];
    $post['post_title'] = $_POST['post_title'];
    $post['post_status'] = 'publish';

    $id = wp_update_post( $post, true );

    $response = array();

    if ( $id == 0 ) {
        $response['status'] = 'error';
        $response['message'] = 'This failed';
    } else {
        $response['status'] = 'success';
        $response['message'] = 'This was successful';
    }

    echo json_encode($response);

}

然后,在您的 javascript 代码中:

success: function( data ) {
    if( data.status == 'error' ) {
        // error handling, show data.message or what you want.
    } else {
        // same as above but with success
    }
},

【讨论】:

  • 感谢 taxicala - 我需要在 $.ajax() 中添加数据类型吗?
  • 如果你这样做会更好 :) 很高兴我能帮助你!
  • 如果不添加数据类型,jquery将不知道是不是json。您也可以在 php 脚本的顶部使用 header('content-type: text/json'); 执行此操作
【解决方案2】:

您可以在后端创建一个像这样的JSON 数组:

$arr = array('error' => true, 'something' => 'foo');
echo json_encode($arr);

然后解析json数组获取返回值,像这样:

success: function( data ) {
    var error = '';
    var something = '';
    for(var i = 0; i < data.length ; i++)
    {
        error = data[i].error;
        something = data[i].something;
    }
    if( error ) {
        // do something
    } else {
        // do something else
    }
},

虽然您将数组从后端回显到前端,但您不能简单地访问 JavaScript 中的 PHP 变量。

请注意,可能存在语法错误,因为我没有测试它。

【讨论】:

  • 如果您在 php 中传回单个字符串,只要您的 javascript ajax 函数要求在 html 中返回数据,就完全没有必要遍历整个 json 过程。
  • pathfinder - 我正在尝试传递 2 个字符串。 $response 和 $error
  • 他只需要一个,它是好是坏。为什么膨胀代码?但是你们可以有积分。我现在要回去用我的紧凑代码赚钱了。我真的很讨厌堆栈溢出变成了什么。现在就像一个电子游戏。
  • 探路者 - 不,我需要 2。我需要“它的好坏”和“信息”
  • 你可以发送任意数量的变量,亨利,有什么问题?
【解决方案3】:

你要找的是json_encode()

这会将 PHP 数组转换为 JSON。

例如:

$dataArray = array( 'message' => 'Error', 'data' => data);
echo json_encode($dataArray);   

【讨论】:

  • 你的甚至没有回答他的问题。为什么要批评。它让 stackoverflow 成为我生活中的一大烦恼。
  • 问题是:“我想修改我的成功函数来做这样的事情:”
  • 堆栈溢出并不是要提供 100% 的工作代码,即使它在可能的情况下很好,这就是 OP 正在寻找的,如果他必须对已经发生的事情进行一些研究,这没什么大不了的给他小费。
  • 你和菲尔告诉他做一些不必要的步骤。
【解决方案4】:

您不能在 JavaScript 中直接使用 PHP 变量。您能做的最好的事情就是在您的 JavaScript 代码中操作 PHP 输出。

例如,您可以将 $response 打印为 'error' 或 'no_error' - 在 AJAX 回调中,检查 var data 是否不等于 'error'(例如)。

【讨论】:

    【解决方案5】:

    如果你使用:

    echo json_encode($response);
    

    在你的 .php 函数上,记得使用:

    var data = $.parseJSON(data);
    

    关于你的 ajax 成功。

    例子:

    function php_ajax_function() {
    
        // whatever you want to do...
    
        $response = array();
    
        if ( $id == 0 ) {
            $response['status'] = 'error';
            $response['message'] = 'This failed';
        } else {
            $response['status'] = 'success';
            $response['message'] = 'This was successful';
        }
    
        echo json_encode($response);
    }
    

    然后,在您的 javascript 代码中:

    success: function( data ) {
    
        console.log(data);
    
        var data = $.parseJSON(data);
    
        if( data.status == 'error' ) {
            // do something
        } else {
            // do other thing
        }
    }
    

    【讨论】:

      【解决方案6】:

      javascript 变量数据包含您回显的 $response 变量。所以使用你的例子,它会是这样的。确保您还要求 html 作为 ajax 函数中的返回数据。以下是相关文档:http://api.jquery.com/jquery.ajax/

      success: function( data ) {
          if( data == 'This failed' ) {
              // do something
          } else {
              // do something else
          }
      },
      

      【讨论】:

      • 非常适合我,我一直使用这种方法。然后因为我有它在 html 中,我不必使用 json 或任何东西,我只需从 php 传递一条语句,它就很好用。
      • 您好探路者 - 感谢您的帮助。当我只需要一个变量时,我会记住你的方法。很好很简单。
      • 数据是一个对象,而不是一个字符串。
      • 数据是一个字符串,如果你想要的话。如果您查看原始 php,他正在传递一个简单的字符串。我的功能有效,你们都在不假思索地点击。你的也可以,但它会使代码膨胀。说这个答案是不正确的,你就限制了试图正确的可能性。
      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多