我还是个新手。我已经读过如果你想从一个按钮调用一个php方法,你首先需要分配按钮的onclick
事件来调用一个javascript函数,这个函数又必须发布到php页面通过ajax。
目前,我的javascript如下:
function handle_qa_submit_comment(postId, parentPostId, elem){
//console.log(elem);
var ajaxUrl = './index.php';
var elem = encodeURIComponent(elem);
var data = {
action : 'add_comment',
data :
{
'postId' : postId,
'parentPostId' : parentPostId,
'elem' : elem
}
};
$.ajax({
url: ajaxUrl,
data: JSON.stringify(data),
contentType: 'application/json',
async: true,
}).always(function(jqxhr,textStatus){
console.log("jqxhr:");
console.log(jqxhr);
console.log("status:");
console.log(textStatus);
});
return false;
}
是的,我怀疑elem参数是错误的 - 在按钮的this
处理程序
onclick
这段代码中发生的事情是data
变量 - 作为json - 被发布到我的php页面 - index.php。我的php如下:
require 'asdf-include/app/csrf.class.php';
require 'asdf-include/app/csrf_handler.php';
session_start();
$GLOBALS['csrf'] = new csrf();
$GLOBALS['token_id'] = $csrf->get_token_id();
$GLOBALS['token_value'] = $csrf->get_token($token_id);
header('Content-Type: application/json');
$aResult = array();
$post = filter_input(INPUT_POST,'action');
if( !isset($post))
{
// Set base path here so this works with symbolic links for multiple installations
define('ASDF_BASE_DIR', dirname(empty($_SERVER['SCRIPT_FILENAME']) ? __FILE__ : $_SERVER['SCRIPT_FILENAME']).'/');
require 'asdf-include/asdf-index.php';
}
else
{
echo "'data found1234'" ; // I Never saw it even get to this point
}
首先要做的事情 - PHP对我来说仍然是全新的,闪亮的。我不确定如何检查$_POST
超全球的价值。重要的是,我从php得到的响应似乎是整个页面解析的html,而不是我回应的内容。
也许我会以错误的方式解决这个问题 - 但这里的目标是我想从ajax调用一个php函数。在我的例子中,我没有正确地转换JSON - 但除此之外,
为什么我的回复是解析后的html页面?
<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->
<!--[if IE 7]><html class="no-js lt-ie9 lt-ie8"><![endif]-->
<!--[if IE 8]><html class="no-js lt-ie9"><![endif]-->
<!--[if gt IE 8]><html class="no-js"><![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" >
...
答案 0 :(得分:0)
我找到了问题的根本原因。我们服务器上的PHP版本是5.4。
这是我带来的检查和“修复” - 其中包括使用已弃用的超级全球。
首先 - 我将ajax网址路由到一个“空”的php页面。我回复了一个简单的字符串 - 发现它正是控制台中打印的jqxhr
- 这意味着,我将始终在html
中获得页面的jqxhr
。
其次 - 我使用print_r($GLOBALS);
。 $POST
中没有存储任何内容 - 它打印array ()
。但是,超全局$HTTP_RAW_POST_DATA
包含我从ajax发送的json数据。有趣。
我将json从$HTTP_RAW_POST_DATA
转换为要使用的对象:
$params = json_decode($HTTP_RAW_POST_DATA);
print_r($params);
$action = $params->action;
$postId = $params->data->postId;
$parentPostId = $params->data->parentPostId;
-
我的重要观察结果是我没有使用最新的php(并将在我们的网络服务器上请求升级),而且我的ajax内容落在了一个已弃用的变量中。
使用Javascript:
var ajaxUrl = '../test/empty.php';
var data = {
action : 'add_comment',
data :
{
'postId' : postId,
'parentPostId' : parentPostId,
'elem' : $(elem).html()
}
};
$.ajax({
url: ajaxUrl,
data: JSON.stringify(data),
contentType: 'application/json',
async: true,
type: 'POST'
}).always(function(jqxhr,textStatus){
console.log("jqxhr:");
console.log(jqxhr);
console.log("status:");
console.log(textStatus);
}).error(function(){
//TODO uncomment when finished
//submit_logout('/Account/Logoff');
});
PHP:
print_r($GLOBALS);
// This has been deprecated in PHP 5.6.0 - We currently use 5.4
$params = json_decode($HTTP_RAW_POST_DATA);
print_r($params);
$action = $params->action;
$postId = $params->data->postId;
$parentPostId = $params->data->parentPostId;
$elem = $params->data->elem;
控制台输出:
Array
(
**[HTTP_RAW_POST_DATA] => {"action":"add_comment","data":{"postId":5,"parentPostId":6,"elem":""}}**
[_GET] => Array
(
)
[_POST] => Array
(
)
[_COOKIE] => Array
(
[SUPERSECRETSTUFF] => NOPE!
)
[_FILES] => Array
(
)
[GLOBALS] => Array
*RECURSION*
)
stdClass Object
(
[action] => add_comment
[data] => stdClass Object
(
[postId] => 5
[parentPostId] => 6
[elem] =>
)
)
empty.js:32 status:
empty.js:33 success