【发布时间】:2009-10-18 16:24:07
【问题描述】:
我有一个需要发布到多个脚本的表单。我怎样才能以最简单的方式做到这一点?
我知道这可以用 Javascript、Curl 或 Snoopy 类来完成,但实际上这是最简单和最好的方法。
其中一个脚本发送电子邮件,它是一个 php 文件,另一个托管在其他地方。
需要收集两个脚本的数据。
【问题讨论】:
我有一个需要发布到多个脚本的表单。我怎样才能以最简单的方式做到这一点?
我知道这可以用 Javascript、Curl 或 Snoopy 类来完成,但实际上这是最简单和最好的方法。
其中一个脚本发送电子邮件,它是一个 php 文件,另一个托管在其他地方。
需要收集两个脚本的数据。
【问题讨论】:
最好的方法是首先将表单提交到本地脚本,然后使用 CURL 将收到的(过滤的)数据发布到远程脚本。然后只看响应。
然后只需发送电子邮件并在本地脚本中处理来自远程脚本的响应。
【讨论】:
最简单的方法是使用 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。只有他们的名字。
【讨论】:
这就是最终使用一个操作将表单提交给多个主机的工作。
我发布了通常的邮件脚本,然后包含使用 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);
【讨论】:
我只需要用 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"
如果需要,请在所有脚本上重复链接过程,然后最后您可能希望重定向到原始域(表单来自)上的页面或执行某些操作以向用户显示成功消息.
【讨论】: