使用PHP提交Ajax表单

3
我正在构建一个PHP程序,从网站获取3个变量并计算它们,然后发布结果。我可以读取变量、进行计算,但是发布部分对我来说很困难,因为它使用了一个Ajax表单(我认为)。使用XMLhttprequest,PHP是否可以进行发布?
这是提交按钮:
<a href="#" class="formSubmit" tabindex="3">

这是一个消息框:

<textarea name="message" id="messageContent" rows="18" wrap="virtual" tabindex="2"></textarea>

我尝试像处理普通表单一样处理它,但不起作用,我跟踪了用于提交的ajax函数:

function formSubmitFunction(e,action, target){
    e.stopPropagation();
    e.preventDefault();
    if ($("#messageContent").attr("value") == undefined || $("#messageContent").attr("value").length < 2){
        alert("A mensagem precisa ter no mínimo 2 caracteres.");
        $("#messageContent").focus();
        return false;
    }else {
        $("#formSubmit").html('<img src="http://website.com/'+desTheme+'/images/send_post.gif');
        if(action == "post"){
            $("#formAjax").append('<div id="carregando"></div>');
            PostFunctions.insertPost(topicId,$("#messageContent").val(), callbackInsertPost);
        } else {
            var postId = target.replace("#","");
            $("#formAjax").append('<div id="carregando"></div>');           
            PostFunctions.editPost(postId,$("#messageContent").val(), callbackEditPost);
        }
        return false;
    }
}

帮助

@编辑:

找到了另一个insertPost函数

function callbackInsertPost(response){
        var result = eval("("+response+")");
        if($("#popup").length){
            $("#popup").remove();
        }
        if(!result.error){
            var returnMessage = "";
            if(result.isForumModerated){
                returnMessage = '<div id="popup" class="autoClear simple">'
                                    +'Sua mensagem está aguardando a aprovação da moderação.'
                                    +'</div>';
                $("#carregando").remove();
                $(actualPostId).prepend(returnMessage);
                window.setTimeout(function(){
                    $("#popup").fadeOut("slow", function(){
                        $("#popup").remove();
                    });
                },5000);
            $("#formAjax").remove();
            } else {
                //console.log(result);
                window.setTimeout(function(){
                    document.location = "_t_lastpost_"+topicId+"_"+forumId+"?postId="+result.postId;
                },1500);
                /*returnMessage = '<div id="popup" class="autoClear simple">'
                                    +'Mensagem enviada com sucesso! Clique neste <a href="_t_lastpost_'+topicId+'_'+forumId+'">link</a> para ver sua mensagem'
                                    +'</div>';*/
            }
        } else {
            if(result.nickname_reproved){
                document.location = "changenickname.jbb";
            } else {
                $("#carregando").remove();
                for(i = 0; i < result.messages.length; i++){
                    $("#formAjax").prepend('<div id="popup" class="autoClear error-post">'
                                        +result.messages[i]+'<br/>'
                                        +'</div>'); 
                    }
                $.scrollTo("#popup",500);
                $("#formSubmit").html('<a href="#" class="formSubmit" tabindex="3"><img src="'+baseImages+'/themes/'+desTheme+'/images/pm_send.gif"/></a>');
                $(".formSubmit").bind("click",function(e){
                    formSubmitFunction(e,"post")
                });
            }
        }
}

@编辑2:

PostFunctions.insertPost = function(p0, p1, callback) {
    DWREngine._execute(PostFunctions._path, 'PostFunctions', 'insertPost', p0, p1, callback);
}

看起来你正在使用jQuery,但实际的“post”函数位于“PostFunctions”对象中。你需要展示该部分的代码并解释问题的具体所在。 - jeroen
找到了,在主贴上编辑了一下。问题是:由于提交按钮使用了ajax,所以我无法使用curl发布新消息。我能用PHP实现这个吗? - André Cardoso
@André Cardoso,你完全可以使用 cURL 进行发布。 AJAX 没有什么特别的... 它只是像任何其他东西一样的正常 HTTP。 - Brad
不,你只是添加了一个回调函数,在成功提交后被调用。 - jeroen
这是我在源代码中能够追踪到的最后一个函数,添加于@edit2。 - André Cardoso
1个回答

0

忘掉你看到的所有JavaScript的东西。当模拟浏览器时,您只需重新创建发送到服务器的请求即可。

  1. 打开Fiddler或Firebug的网络面板。
  2. 在浏览器中进行Post操作。
  3. 在Fiddler / Firebug中查找Ajax Post。
  4. 使用PHP curl创建常规Post,使用与Fiddler中看到的相同的参数。

请确保检查标头以防JavaScript设置了某些cookie。

编辑

  • Cookie文件是由curl创建的,其格式与fiddler不同。删除它并让curl重新创建。

  • c0-id是一个隐藏的表单字段吗?查看源代码。如果在另一个浏览器中查看时它发生了变化,则需要抓取表单,然后根据该值执行您编写的POST请求。

    • 将其发布到显示表单的页面上。使用CURL_OPT_COOKIEJAR

    • CURL_OPT_COOKIEJAR对于发布到两个不同页面很有用,因为它会记住上次请求设置的cookie,就像浏览器一样。

  • 确保您的用户代理是真正的浏览器。

  • 通过fiddler观察浏览器和脚本同时访问服务器。您希望您的脚本的行为与浏览器完全相同。因此,请继续调整您的脚本以使其更接近。最终它会起作用。

  • 最初抓取网站可能非常令人沮丧和耗时。只需坚持不懈即可。

    • 将您的代码组织成函数和类。这样做多次发布将更容易。

找到了这个:callCount=1 c0-scriptName=PostFunctions c0-methodName=insertPost c0-id=6001_1310347486332 c0-param0=number:1576140 c0-param1=string:fiddler%20hehe%20haha%20searchme xml=true我会尝试这样做,但是JavaScript设置了一些cookies,我该怎么处理它们? - André Cardoso
你必须自己设置它们。查看curl的cookie处理方式。并查看我在这里发布的帖子https://dev59.com/iFDTa4cB1Zd3GeqPHDK2。 - Byron Whitlock
谢谢,但有一个问题:我发布了两次,设置的 cookie 不同,我该怎么办?在源代码中找到它们是如何生成的吗?我能找到吗? - André Cardoso
在执行GET表单(在提交之前)时,请查看是否找到Set-Cookie:头。服务器可能正在设置cookie。否则,您需要在源代码中搜索jquery cookie设置或纯javascript(document.cookie)代码。然后弄清楚它在做什么并在php中复制它。 - Byron Whitlock
抱歉,显然我用另一个账户发送了下一个答案,因为我在另一台电脑上,你能看到它吗?非常感谢,Byron。 - André Cardoso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接