将变量从 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_encode
和 javascript 中的 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 成功函数的主要内容,如果未能解决你的问题,请参考以下文章