将变量从 PHP 传递到 AJAX 成功函数

Posted

技术标签:

【中文标题】将变量从 PHP 传递到 AJAX 成功函数【英文标题】:Passing variables from PHP to AJAX success function 【发布时间】: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 中的成功函数。

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

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

【问题讨论】:

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

【讨论】:

你的甚至没有回答他的问题。为什么要批评。它让 *** 成为我生活中的一大烦恼。 问题是:“我想修改我的成功函数来做这样的事情:” 堆栈溢出并不是要提供 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,他正在传递一个简单的字符串。我的功能有效,你们都在不假思索地点击。你的也可以,但它会使代码膨胀。说这个答案是不正确的,你就限制了试图正确的可能性。

以上是关于将变量从 PHP 传递到 AJAX 成功函数的主要内容,如果未能解决你的问题,请参考以下文章

将全局变量传递给ajax函数,发布到php,保存到数据库

$.ajax 成功函数返回 null

从arraylist返回值到ajax成功函数

使用 ajax 从 php 脚本返回成功/失败变量

jQuery $.ajax(),将成功数据传递给单独的函数

通过 ajax 将 Javascript 变量传递给 PHP