使用 curl 提交/检索表单结果

Posted

技术标签:

【中文标题】使用 curl 提交/检索表单结果【英文标题】:Using curl to submit/retrieve a forms results 【发布时间】:2011-06-03 02:45:24 【问题描述】:

在尝试使用 curl 将数据发布到页面并在提交表单后检索结果时需要帮助。

我创建了一个简单的表单:

<form name="test" method="post" action="form.php">              
    <input type="text" name="name" size="40" />
    <input type="text" name="comment" size="40" />
    <input type="submit" value="submit" />
</form>

另外,我有 php 代码在同一页面中处理此表单。它所做的只是回显表单值。

我一直在使用的卷曲是这样的:

  $h = curl_init();

  curl_setopt($h, CURLOPT_URL, "path/to/form.php"); 
  curl_setopt($h, CURLOPT_POST, true);
  curl_setopt($h, CURLOPT_POSTFIELDS, array(
  'name' => 'yes',
  'comment' => 'no'
  ));
  curl_setopt($h, CURLOPT_HEADER, false);
  curl_setopt($h, CURLOPT_RETURNTRANSFER, 1);

  $result = curl_exec($h);
  echo $result;

当我启动包含 curl 代码的页面时,我得到了 form.php 页面内容,但它没有显示 提交表单时 PHP 应该回显的变量。

希望有任何帮助。

谢谢。

【问题讨论】:

我们能看到处理表单提交的 PHP 吗?问题可能就在那里。 另外,您是否验证过手动提交表单会产生所需的输出? 手动提交表单会产生正确的输出。处理表单的 PHP 是: if(isset($_POST['submitted']))echo $_POST[name] ..... etc. 就是这样 【参考方案1】:

AHHHH 在您发表评论后,问题很明显。

您需要在数组中再包含一个 POST 变量。

'submitted' => 'submitted'

如果单击,提交按钮还会返回一个 post 值,您正在处理 PHP 的表单中检查该值。

if ($_POST['submitted']) 

在您的 curl 代码中,但是您遗漏了“提交”后的变量。

如果这是您要查找的内容,请选中此答案旁边的复选标记。谢谢!

【讨论】:

【参考方案2】:

通过阅读其他两个答案以及 OP 的评论,我有几个想法。

具体来说,OP 评论是:

手动提交表单确实会产生正确的输出。处理表单的 PHP 是: if(isset($_POST['submitted']))echo $_POST[name] ..... etc. 就是这样

在标准条件下,如原始问题中所述,您的基本表单将生成一个 $_POST 数组,如下所示:

array(
  'name' => 'The Name as Entered in the Form' ,
  'comment' => 'The Comment as Entered in the Form' ,
  'submit' => 'submit' # From the "Submit" button
);

您的评论表明您的表单处理程序的某些方面正在寻找名为“已提交”的 $_POST 元素。

1) 如问题中所述,基本形式将始终返回 FALSE 以检查 $_POST['submitted'],因此,将触发该条件的 ELSE 操作(如果存在)。

2) 您的 CURL 操作没有设置“提交”或“已提交”,并且对于条件始终返回 FALSE。

所以,我建议你:

1) 检查您的表单处理程序,查看哪些字段是必不可少的,它们的名称是什么以及它们的内容应该是什么。

2) 检查您的基本表单,并确保它具有适当的字段。

3) 检查您的 CURL 操作,并确保它详细说明了每个必填字段。 (简单的检查是在表单处理程序的顶部插入print_r( $_POST );die(); 并提交基本表单。这将准确显示表单正在发送的内容,因此您可以在 CURL 中重新创建它。

【讨论】:

感谢您的彻底检查,这正是问题所在。

以上是关于使用 curl 提交/检索表单结果的主要内容,如果未能解决你的问题,请参考以下文章

自动提交表单 (cURL)

CURL模拟表单post提交及相关常用参数的使用(包括提交表单同时上传文件)

请教用Curl 在php 里面模拟表单提交 文本+文件的写法

php 使用curl 进行简单模拟提交表单

Linux curl 模拟form表单提交信息和文件

php curl 模拟post表单向提交数据