0

问题

我如何实现通过 AJAX 传递的 PHP 回调,而 PHP 回调由 AJAX 请求的页面调用?

设置

评论通过 AJAX 发布,参数通过序列化和加密传递(因此它们不能在传输过程中更改或精心设计的 AJAX 请求以滥用评论系统)。问题是,我需要新的总评论量来更新不同 mysql 表中的字段(在使用评论的每个地方都会改变)而不是评论本身。

例子

有人在论坛主题上发表评论,该主题需要知道总评论数(无需每次都查询评论表)。问题是,当通过 AJAX 发布评论时,我们不知道要更新什么表、哪些字段等,以及必须执行附加代码(例如还记录所有留下评论的成员)关于特定主题)。

解决方案

在声明评论小部件时,我考虑过使用闭包添加两个 PHP 回调。这两个回调 (onSuccess() onFailure()) 将能够执行所需的任何工作,例如计算总评论数和更新特定论坛主题的总评论数。然后序列化,加密,通过ajax作为参数传递,然后PHP解密和反序列化回调并执行它们。

为什么解决方案会失败

因为闭包不能序列化!另外,在有人建议之前我没有使用 eval 。

又是一个问题

我如何实现通过 AJAX 传递的 PHP 回调,而 PHP 回调由 AJAX 请求的页面调用?

更新

看起来你们中的一些人没有阅读整个问题并理解回调将在 PHP 中完成 - 而不是 javascript(使用 AJAX 回调)。AJAX 仅用于传输已发布的评论 - 不处理它(这就是 PHP 所做的,这就是问题所在的回调所在)。

4

4 回答 4

1

创建一个作为回调的函数,然后通过 ajax 传递函数名,并像这样调用它:

$callback = 'callback_function_name'; $callback($params...);
于 2012-10-31T13:41:43.710 回答
0

也许我不明白你想要做什么,但你能做类似的事情:

window.myappstuff={}

window.myappstuff.onSuccess=function(){
   //Do some stuff here.
}

window.myappstuff.onFailure=function(){
   //Do some different stuff here.
}

然后您的 php 回调可以调用window.myappstuff.onSuccesswindow.myappstuff.onFailure。您也可以改用随机函数名称。

于 2012-10-31T13:43:39.953 回答
0

总的来说,我不得不建议重新考虑。出于安全原因,通过 ajax 发送任何类似远程代码的东西都被认为是不好的做法。例如,我可以使用 firebug 或其他东西“拦截”回复,对我的代码进行任何更改。
如果您发送函数名称和参数,我可以更改它们。假设您的脚本验证了用户输入,我可以让 ajax 调用返回一个不存在的函数。您的脚本将失败,并且所有形式的输入验证都将消失。
如果您将完整的函数定义作为字符串发送,我可以走得更远。

你可能已经看到人们做这样的事情:

echo 'function(argument){ console.log(argument);}("something"));';

这只是纯文本,没有 JSON。然后,在 JS 中,他们会做一些应该被视为危害人类罪的事情:

//readystatechange callback:
if (this.readyState === 4 && this.status === 200)
{
    return eval(this.responseText);//<=== EVIL - EVIL - EVIL
}

这太疯狂了,它是邪恶的,甚至不看这个
你可以做什么作为某种快速修复是编写一个通用onreadystatechange函数:

//readystatechange
if (this.readyState === 4 && this.status === 200)
{
    var returnObj = JSON.parse(this.responseText);
    switch(returnObj.actionType)
    {
        case 'DomAction':
            return domSwitch(returnObject.data);//<-- based on data domSwitch will decide what to do
        case 'setVar':
            return varSwitch(returnObjcet.data);
        default:
            return educatedGuess(returnObject);//<-- desperate
    }
}

但是同样,当你发送一个请求时,你通常对你会得到什么样的数据以及你想用它做什么有一定的期望,所以你可以readystatechange为每个 ajax 请求动态创建一个处理程序,处理该特定呼叫。

于 2012-10-31T14:00:12.493 回答
0

不要传递回调,而是提前在服务器上创建函数并传递要执行的函数的名称,以及要传递的参数列表。


Besides, here is the place where you start using angular.js. This way you'll have a client side model of the forum topic with a field of posts_count which you'll update on on the client side and angluar's bindings will update the view wherever you use data from this model.

于 2012-11-21T11:50:02.717 回答