【问题标题】:How To ? Form Post to Multiple Locations如何 ?表格邮寄到多个地点
【发布时间】:2009-10-18 16:24:07
【问题描述】:

我有一个需要发布到多个脚本的表单。我怎样才能以最简单的方式做到这一点?

我知道这可以用 Javascript、Curl 或 Snoopy 类来完成,但实际上这是最简单和最好的方法。

其中一个脚本发送电子邮件,它是一个 php 文件,另一个托管在其他地方。

需要收集两个脚本的数据。

【问题讨论】:

    标签: php forms


    【解决方案1】:

    最好的方法是首先将表单提交到本地脚本,然后使用 CURL 将收到的(过滤的)数据发布到远程脚本。然后只看响应。

    然后只需发送电子邮件并在本地脚本中处理来自远程脚本的响应。

    【讨论】:

    • 我同意这一点,我会先发送到本地脚本,清理/等。然后发送到远程。
    【解决方案2】:

    最简单的方法是使用 jQuery 将 $.ajax(或 $.post 或 $.get)发送到每个脚本,从每个脚本中检索结果并根据结果执行您的操作。

    $(document).ready( function(){
        $('#mySubmitButton').click(function(){
            //Send data to the email script
            $.post( 'send-email.php', $('form').serialize(), function(data, textStatus) {
                //data is the result from the script
                alert(data);
            });
    
            //Send data to the other script
            $.post( 'my-other-script.php', $('form').serialize(), function(data, textStatus) {
                //data is the result from the script
                alert(data);
            });
        });
    });
    

    更新: 序列化命令是正在发送的数据。看一下 jQuery 序列化函数。它基本上只是接受表单中的各种输入、选择、文本区域、复选框等,并将它们放入这样的字符串中:

    myNameInput=john&active=on&whateverSelected=3

    这只是表单元素名称及其值的字符串。这就是通过 ajax 命令发送到外部脚本的内容。

    附带说明,在进行序列化时,请确保所有表单元素都具有 name 属性,而不仅仅是 id。序列化不关注它们的id。只有他们的名字

    【讨论】:

    • 其中一个帖子脚本可以是 https 位置吗?我看不到您将值传递给脚本的位置。是序列化吗?
    【解决方案3】:

    这就是最终使用一个操作将表单提交给多个主机的工作。

    我发布了通常的邮件脚本,然后包含使用 Curl 发布到第二台主机的代码。

    以下是经过一些小调整的实际代码,例如不必使用“提取”。

    在 (http://php.dzone.com/news/execute-http-post-using-php-cu) 找到:

    //extract data from the post
    extract($_POST);
    
    //set POST variables
    $url = 'http://domain.com/get-post.php';
    $fields = array(
                            'lname'=>urlencode($last_name),
                            'fname'=>urlencode($first_name),
                            'title'=>urlencode($title),
                            'company'=>urlencode($institution),
                            'age'=>urlencode($age),
                            'email'=>urlencode($email),
                            'phone'=>urlencode($phone)
                    );
    
    //url-ify the data for the POST
    foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
    rtrim($fields_string,'&');
    
    //open connection
    $ch = curl_init();
    
    //set the url, number of POST vars, POST data
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_POST,count($fields));
    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
    
    //execute post
    $result = curl_exec($ch);
    
    //close connection
    curl_close($ch);
    

    【讨论】:

      【解决方案4】:

      我只需要用 ASP 来做这件事。我想将表单发布到一个域上的电子邮件处理脚本,并通过单击按钮记录另一个域上的 MySQL 数据库上的操作。这在许多其他情况下也很有用。

      没有办法在一个 HTML 表单定义上有多个操作。因此,只需将其发送到一个位置,处理表单,然后将表单“重新发布”到另一个位置。您可以在任何长度的脚本“链”中执行此操作。

      首先将这个 ASP 子程序添加到您的脚本中。如果您使用的是 PHP 或其他语言,您只需将此代码翻译成您自己的语言,这个概念就可以工作。

      sub RePost( Destination )
          RePostString = "<HTML><BODY>" & vbCRLF
          if( (Trim(Destination) <> "") and (Request.ServerVariables("REQUEST_METHOD") = "POST") ) then
              RePostString = RePostString & "<FORM METHOD=POST NAME=""RePostForm"" ACTION=""" & Destination & """>" & vbCRLF
              for each Item in request.form
                  if( not len(item) <= 0 ) Then
                      RePostString = RePostString & "<INPUT TYPE=HIDDEN NAME=""" & item & """ VALUE=""" & Request.form( item ) & """>" & vbCRLF
                  end if
              next
              RePostString = RePostString & "</FORM>" & vbCRLF & _
                             "<script language=""JavaScript"" type=""text/javascript""> window.onLoad = document.RePostForm.submit(); </script>"
          else
              RePostString = "<CENTER><H1><BR><BR>Sorry! Internal Scripting Error Encountered!</H1></CENTER>" & vbCRLF
          end if
          RePostString = RePostString & "</BODY></HTML>"
          Response.Write( RePostString )
      end sub
      

      然后,在您的流程结束时,只需像这样调用 sub 即可:

       RePost "http://www.SomeOtherDomain.com/SomeOtherScript.asp"
      

      如果需要,请在所有脚本上重复链接过程,然后最后您可能希望重定向到原始域(表单来自)上的页面或执行某些操作以向用户显示成功消息.

      【讨论】:

        猜你喜欢
        • 2016-02-16
        • 2013-04-26
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 2020-07-21
        • 1970-01-01
        相关资源
        最近更新 更多