【问题标题】:php cURL - POST Not workingphp cURL - POST 不工作
【发布时间】:2015-07-26 04:53:19
【问题描述】:

尝试一些简单的代码来处理 cURL 但没有幸运.. 我试图发布一个表单,但没有任何反应,也没有发生错误。

这是我的代码:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8888/curl/home2.php');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'usuario=teste&senha=12345');
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$store = curl_exec ($ch);

print_r(curl_getinfo($ch));
echo curl_errno($ch) . '-' . 
                curl_error($ch);

echo $store;

当在 home2.php 表单上提交时,它应该转到另一个页面并返回一些数据。我是不是做错了什么?

--- 更新

这是我的简单 home2.php 代码:

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    <form method="POST" action="login.php" id="formLogin" name="formLogin">
        Usuario <input name="login" type="text">
        Senha <input name="senha" type="text">
        <input type="submit">
    </form>
</body>
</html>

登录.php:

<?php

$login = $_POST['login'];
$senha = $_POST['senha'];

if($login == "teste"){
    echo "OK";
}

?>

我的结果应该是“OK”吧?

【问题讨论】:

  • 这段代码看起来没问题。你能展示包括 home2.php 在内的完整代码吗?
  • 尝试在curl_exec之前添加这两行curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  • @spicydog 完成。更新了帖子。
  • @Mihai 同样的事情:(
  • 您的错误似乎相当明显。您使用名为 usuario 的“用户名”键发送 curl 请求,但您的表单需要 login。您还需要提交给login.php 而不是home2.php。当您通过浏览器在home2.php 上提交表单时,实际发生的情况是浏览器将表单输入发送到login.php - 它永远不会发送到home2.php

标签: php post curl


【解决方案1】:

home2.php 上的表单如下所示:

<form method="POST" action="login.php" id="formLogin" name="formLogin">
    Usuario <input name="login" type="text">
    Senha <input name="senha" type="text">
    <input type="submit">
</form>

请务必注意,用户名输入框名为 login,但在创建 cURL 请求时,您将用户名发送为 usario。这需要改变。您还需要模拟浏览器会做什么并将发布变量发送到 login.php (action="login.php") 而不是 home2.php(此页面包含表单,并且永远不会收到任何输入表单数据)。

总而言之,您的代码应该可以通过以下方式修复:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8888/curl/login.php');
// Change the URL                                         ^^^^^
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'login=teste&senha=12345');
// Change the username key             ^^^^^
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$store = curl_exec ($ch);

print_r(curl_getinfo($ch));
echo curl_errno($ch) . '-' . 
                curl_error($ch);

echo $store;

如果您有任何疑问,浏览器中的网络选项卡(或任何 HTTP 数据包嗅探器)会准确地告诉您浏览器发出的请求、带有哪些变量、指向哪些 URL,并且您将能够复制更容易。

注意:如果 login.php 在成功时明显重定向到的 success.php 页面没有任何作用,您还需要自动调用它。

如果login.php自动重定向,你可以使用cURL选项CURLOPT_FOLLOWLOCATION设置为1。

【讨论】:

  • 成功了。所以我正在尝试处理我需要的一些站点,它不是我的(不是本地主机)。但是我面临一个问题,也没有发布,我使用正确的名称作为我的输入。改变的是表单指向类似的东西:index.php#tabs-1。即使我将其设置为我的 URL,POST 也不会发生。你认为我应该打开另一个更具体的问题吗?
  • 如果唯一的区别是标签,那么就会有一些 javascript 摆弄。使用 HTTP 嗅探器查看单击您要模拟的按钮时站点发出的请求。
  • 使用您所说的并转到视图源,我找到了它。那是一个隐藏的领域。现在它正在工作。 - 很抱歉一直打扰您,但是如果我想每次发出 100 个请求并获取返回的数据怎么办。轻松的任务?我的意思是,结果是一个完整的网页,我想要部分字段。我不知道要搜索什么..“cURL 抓取数据”? @h2ooooooo
  • 您正在寻找“网络爬虫”或“dom 解析器”。本质上你想搜索“php web scraper”或“php dom parser”。我喜欢使用simplehtmldom 给我一个类似搜索和收集的jQuery。 phpQuery也挺不错的。
  • 我必须作为我所做工作的补充,对吧?请说是。因为我看到了这样的用法:“$html = file_get_html('google.com/');”并感到害怕。我可以使用 html = file_get_html($store); ?
【解决方案2】:

您提到“当在 home2.php 表单上提交时,它应该转到另一个页面”。你的意思是有一个HTTP重定向吗?如果是这样,您需要告诉 cURL 遵循重定向。像这样:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

【讨论】:

  • 当提交发生时,它应该按照 home2.php 中的操作表单中的设置转到 login.php。我用完整的代码更新了帖子。还尝试了您的建议,但仍然相同。 @Asaph
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多