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

Using PHP Curl to submit form and get results

网站上的表格是...

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

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

查看此详细示例,从创建新连接开始。

$curl_connection = 
  curl_init('http://www.domainname.com/target_url.php');

使用 curl_init() 函数创建了一个新连接,它将目标 URL 作为参数(URL 我们想要 post 我们的数据) .目标 URL 与普通形式的“动作”参数相同,看起来像这样:

<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 将如何向远程服务器标识自己。有些服务器会 return 针对不同的浏览器(或代理,例如搜索引擎的蜘蛛)提供不同的内容,因此我们希望我们的请求看起来像是来自流行的浏览器。

CURLOPT_RETURNTRANSFER 设置为 true 强制 cURL 不显示请求的输出,但 return 它作为字符串。

然后我们将 CURLOPT_SSL_VERIFYPEER 选项设置为 false,因此在无效、过期或未签名的 SSL 证书的情况下请求不会触发错误。

最后,我们将 CURLOPT_FOLLOWLOCATION 设置为 1 以指示 cURL 遵循远程站点发送的 headers 中找到的“位置:”重定向。

现在我们必须准备我们想要的数据post。我们可以先将其存储在一个数组中,其中元素的键与常规表单的输入名称相同,值是我们想要为该字段 post 的值。

例如,如果采用常规形式,我们将有:

<input type="text" name="firstName" value="Name">
<input type="hidden" name="action" value="Register">

我们像这样将它添加到我们的数组中:

$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register'

对每个表单域执行相同的操作。

数据将按以下格式 posted: 键1=值1&键2=值2

为了像这样格式化数据,我们将为每个 key-value 对(例如 key1=value1)创建字符串,然后将它们放入另一个数组($post_items)使用 PHP 函数 implode() .

将它们组合成一个字符串
  foreach ( $post_data as $key => $value) 
    {
        $post_items[] = $key . '=' . $value;
    }

$post_string = implode ('&', $post_items);

接下来,我们需要告诉cURL我们想要post哪个字符串。为此,我们使用 CURLOPT_POSTFIELDS 选项。

curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); 最后,我们执行post,然后关闭连接。

$result = curl_exec($curl_connection);
curl_close($curl_connection);

到现在,数据应该已经posted到远程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);

?>