我的PHP curl Post请求没有按预期工作

我的PHP curl Post请求没有按预期工作,php,curl,post,Php,Curl,Post,我尝试使用以下代码向另一个php页面发送post请求: $vars = ['val1' => 'myval']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_REFERER, $_SERVE

我尝试使用以下代码向另一个php页面发送post请求:

$vars = ['val1' => 'myval'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_MAXREDIRS, 4);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
$data = curl_exec($ch);
curl_close($ch);
但是在目标页面上,
var\u dump($\u POST)将仅输出“1”。我本以为会这样:
数组(val1=myval)
或类似的东西。因此,如果存在并包含“myval”,我可以使用
isset($\u POST[“val1”])
进行检查

你知道这个请求有什么问题吗

编辑: 我现在已将代码更改为以下内容:

<?php
$data = array(
    'foo'=>'bar',
    'baz'=>'boom',
    'cow'=>'milk',
    'php'=>'hypertext processor');
$ch=curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_URL, "target.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

在target.php中:

<?php
echo print_r($_POST, true));
?>

这是因为
curl\u setopt()
不接受像
array
;)这样的复杂文本类型您需要以查询字符串的形式显示数据:
“postvar1=value1&postvar2=value2&postvar3=value3”

$format=http\u build\u query($vars);
curl_setopt($ch,CURLOPT_POSTFIELDS,$format);

$format=“val1=my value”//注意创建正确的编码
curl_setopt($ch,CURLOPT_POSTFIELDS,$format);

如果您使用的是
CURLOPT\u POSTFIELDS
,您也不需要设置
CURLOPT\u POST
。事实上,在之后设置它将导致发送可能不正确的头

CURLOPT_POSTFIELDS
接受数组,并将内容类型标题设置为
multipart/form data
(如果提供)。稍后,设置
CURLOPT_POST
将覆盖到
application/x-www-form-urlencoded
,这意味着另一端的PHP脚本希望数据编码为HTTP查询字符串。这就是你遇到问题的原因


您可以通过在发送之前正确编码
$vars
(使用
http\u build\u query
,就像在另一个答案中一样)来解决此问题,或者只需删除对set
CURLOPT\u POST
的调用。我推荐后者。

我想,我知道了。当我将“target.php”之类的东西设置为目标时,数据并没有被发送。但是当我使用一个完整的URL,比如,它会像预期的那样工作。有时候,这很容易。。。很抱歉占用了您的时间。

根据它的说法,也可以是数组。您是对的。“将数组传递给
CURLOPT_POSTFIELDS
会将数据编码为
多部分/表单数据
,而传递URL编码字符串会将数据编码为
application/x-www-form-urlencoded
”这应该有效。如何检查post请求的响应是什么。。。不是!;)