使用PHP Curl提交表单并获得结果

时间:2015-01-12 06:32:49

标签: php forms post curl get

网站上的表格是......

<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"的值更改为我想要的信息。

我如何提交表单然后检索它所写的数据?

1 个答案:

答案 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);

?>