网站上的表格是......
<form action="" method="POST">
<input style="width:30%;background-color:#e2e2e2;border:#000;color:#000;" type="text" name="userName" placeholder="Enter a username" required="">
<br>
<input type="submit" name="userBtn" value="get Username">
</form>
在name="userName"
中填写一个值并点击name="userBtn"
后,页面会刷新,并将name="userName"
的值更改为我想要的信息。
我如何提交表单然后检索它所写的数据?
答案 0 :(得分:9)
请参阅此详细示例,首先创建新连接。
$curl_connection =
curl_init('http://www.domainname.com/target_url.php');
使用curl_init()函数创建新连接,该函数将目标URL作为参数(我们要发布数据的URL)。目标URL与普通表单的“action”参数相同,如下所示:
<form method="post" action="http://www.domainname.com/target_url.php">
现在让我们为我们的连接设置一些选项。我们可以使用curl_setopt()函数完成此操作。有关curl_setopt()的更多信息以及完整的选项列表,请转至curl_setopt()参考页。
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
我们在此设置了哪些选项?
首先,我们将连接超时设置为30秒,因此如果远程服务器无法响应,我们的脚本无法无限期地等待。
然后我们设置cURL如何向远程服务器标识自己。有些服务器会为不同的浏览器(或代理商,例如搜索引擎的蜘蛛)返回不同的内容,因此我们希望我们的请求看起来像来自流行的浏览器。
CURLOPT_RETURNTRANSFER设置为true会强制cURL不显示请求的输出,而是将其作为字符串返回。
然后我们将CURLOPT_SSL_VERIFYPEER选项设置为false,因此在无效,过期或未签名的SSL证书的情况下,请求不会触发错误。
最后,我们将CURLOPT_FOLLOWLOCATION设置为1,以指示cURL遵循远程站点发送的标题中的“Location:”重定向。
现在我们必须准备要发布的数据。我们可以先将它存储在一个数组中,元素的键与常规表单的输入名称相同,值是我们要为该字段发布的值。
例如,如果是常规形式,我们会:
<input type="text" name="firstName" value="Name">
<input type="hidden" name="action" value="Register">
我们将这个添加到我们的数组中:
$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register'
对每个表单字段执行相同操作。
数据将以以下格式发布: 键1 =值&安培;键2 =值
为了格式化这样的数据,我们将为每个键值对创建字符串(例如key1 = value1),将它们放在另一个数组($ post_items)中,然后使用PHP函数将它们组合在一个字符串中implode()。
foreach ( $post_data as $key => $value)
{
$post_items[] = $key . '=' . $value;
}
$post_string = implode ('&', $post_items);
接下来,我们需要告诉cURL我们要发布哪个字符串。为此,我们使用CURLOPT_POSTFIELDS选项。
curl_setopt($ curl_connection,CURLOPT_POSTFIELDS,$ post_string); 最后,我们执行帖子,然后关闭连接。
$result = curl_exec($curl_connection);
curl_close($curl_connection);
到目前为止,数据应该已发布到远程URL。去检查一下,如果它不能正常工作,请使用curl_getinfo()函数查看可能发生的任何错误。
print_r(curl_getinfo($curl_connection));
此行显示有关转移的一系列信息。必须在使用curl_close();
关闭连接之前使用此方法您还可以通过输出curl_errno($ curl_connection)和curl_error($ curl_connection)来查看错误的编号和描述。
所以让我们把所有东西放在一起。这是我们的代码:
<?php
//create array of data to be posted
$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register';
//traverse array and prepare data for posting (key1=value1)
foreach ( $post_data as $key => $value) {
$post_items[] = $key . '=' . $value;
}
//create the final string to be posted using implode()
$post_string = implode ('&', $post_items);
//create cURL connection
$curl_connection =
curl_init('http://www.domainname.com/target_url.php');
//set options
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
//set data to be posted
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);
//perform our request
$result = curl_exec($curl_connection);
//show information regarding the request
print_r(curl_getinfo($curl_connection));
echo curl_errno($curl_connection) . '-' .
curl_error($curl_connection);
//close the connection
curl_close($curl_connection);
?>