PHP cURL - POST不起作用

3
尝试编写与cURL相关的简单代码,但没有成功。我试图POST一个表单,但是没有任何反应,也没有错误发生。
以下是我的代码:
$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>

login.php:

<?php

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

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

?>

我的结果应该是“OK”,对吗?

1
这段代码看起来还不错。你能把包括home2.php在内的完整代码展示一下吗? - spicydog
尝试在curl_exec之前添加以下两行代码:curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - Mihai
@spicydog 完成。已更新帖子。 - ziad.ali
@Mihai 同样的事情 :( - ziad.ali
你的错误似乎很明显。你正在使用名为“usuario”的“username”键发送curl请求,但是你的表单期望的是“login”。你还需要提交到login.php而不是home2.php。当你通过浏览器提交home2.php上的表单时,实际发生的情况是浏览器将表单输入发送到login.php,而不是home2.php - h2ooooooo
显示剩余4条评论
2个回答

2

您位于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。这需要更改。您还需要模拟浏览器的操作,将POST变量发送到login.phpaction="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发送,你将能够更轻松地复制它。
注意:如果你的登录成功后似乎重定向到的success.php页面有任何操作,你还需要自动调用它。
如果login.php自动重定向,你可以直接使用cURL选项CURLOPT_FOLLOWLOCATION设置为1。

它起作用了。所以我正在尝试对一些我需要但不是我的站点(不是本地主机)进行操作。但我遇到了一个问题,即无法POST数据,并且我使用的输入名称是正确的。改变的是表单指向类似于index.php#tabs-1之类的内容。即使我将其设置为我的URL,POST也不会发生。您认为我应该提出另一个更具体的问题吗? - ziad.ali
我必须使用作为我已经完成的补充,对吧?请回答是的。因为我看到一个像这样的用法:"$html = file_get_html('http://www.google.com/');",让我感到害怕。我可以这样使用:html = file_get_html($store) 吗? - ziad.ali
我通常的做法是使用cURL获取正文(就像你已经做的那样),然后使用str_get_html。如果你完全不关心cURL,file_get_html只是一个快速包装器。这是simplehtmldom文档 - 请注意它是sourceforge,所以如果你使用firefox,即使它只是一个手册,你可能会收到病毒错误提示 - h2ooooooo
哦,以前从未涉及过DOM对象。我将我的curl返回值作为参数传递给str_get_html,然后开始使用"find"命令来获取我想要的内容。正如我之前所说的,每次我都必须进行大约100个请求,因此我保持我的curl登录处于打开状态,并创建一个循环来提交第二个表单并为每个结果创建一个DOM,然后使用find抓取数据,对吗?我会尝试一下@h2ooooooo, 谢谢! - ziad.ali
@ziad.ali 是的,那就是做法,不过这样做速度可能不会很快,如果你经常这样做,网站可能会阻止你。如果是这样,你可以使用 sleepusleep 来稍微减慢一下速度 :) - h2ooooooo
显示剩余4条评论

1
您提到了“当在home2.php表单上提交时,它应该转到另一个页面”。这是否意味着有一个HTTP重定向?如果是这样,您需要告诉cURL跟随重定向。就像这样:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

当提交发生时,它应该按照在home2.php中表单操作中设置的方式前往login.php。我已经更新了完整的代码。我也尝试了你建议的方法,但仍然是一样的。@Asaph - ziad.ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接