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

Dan*_*ssa 2 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>
Run Code Online (Sandbox Code Playgroud)

填写完值后name="userName",单击name="userBtn"页面刷新并将值更改为name="userName"我想要的信息.

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

小智 9

请参阅此详细示例,从创建新连接开始.

$curl_connection = 
  curl_init('http://www.domainname.com/target_url.php');
Run Code Online (Sandbox Code Playgroud)

使用curl_init()函数创建一个新连接,该函数将目标URL作为参数(我们要发布数据的URL).目标URL与普通表单的"action"参数相同,如下所示:

<form method="post" action="http://www.domainname.com/target_url.php">
Run Code Online (Sandbox Code Playgroud)

现在让我们为我们的连接设置一些选项.我们可以使用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);
Run Code Online (Sandbox Code Playgroud)

我们在这里设置了什么选项?

首先,我们将连接超时设置为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">
Run Code Online (Sandbox Code Playgroud)

我们将这个添加到我们的数组中:

$post_data['firstName'] = 'Name';
$post_data['action'] = 'Register'
Run Code Online (Sandbox Code Playgroud)

对每个表单字段执行相同操作.

数据将以以下格式发布:key1 = value1&key2 = value2

为了格式化这样的数据,我们将为每个键值对创建字符串(例如key1 = value1),将它们放在另一个数组($ post_items)中,然后使用PHP函数implode()将它们组合在一个字符串中.

  foreach ( $post_data as $key => $value) 
    {
        $post_items[] = $key . '=' . $value;
    }

$post_string = implode ('&', $post_items);
Run Code Online (Sandbox Code Playgroud)

接下来,我们需要告诉cURL我们要发布哪个字符串.为此,我们使用CURLOPT_POSTFIELDS选项.

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

$result = curl_exec($curl_connection);
curl_close($curl_connection);
Run Code Online (Sandbox Code Playgroud)

到目前为止,数据应该已发布到远程URL.去检查一下,如果它不能正常工作,请使用curl_getinfo()函数查看可能发生的任何错误.

print_r(curl_getinfo($curl_connection));
Run Code Online (Sandbox Code Playgroud)

该行显示有关传输的一系列信息.必须在使用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);

?>
Run Code Online (Sandbox Code Playgroud)