繁体   English   中英

使用curl时无法访问$ _SERVER ['QUERY_STRING']

[英]Can't access $_SERVER['QUERY_STRING'] when using curl

我正在调用一个php脚本,如下所示:

$data="param1=P1";
$data.= "param2=P2&"; 
$data.= "param3=P3";  

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL," http://www.example.com/readcurl.php");
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);

curl_exec ($ch);
curl_close ($ch); 

现在,在接收脚本(readcurl.php)中,我可以通过以下方式读取参数:

$par1= $_REQUEST['param1'];
$par2= $_REQUEST['param2'];
$par3= $_REQUEST['param3'];

我想检查是否已提供所有参数。 但是当我这样做

count(explode('&', $_SERVER['QUERY_STRING']))

这给出“ 1”作为计数。 在浏览器中提供参数时:

http://www.example.com/readcurl?param1=P1&param2=P2&param3=P3

count(explode('&', $_SERVER['QUERY_STRING'])) 

给出“ 3”

我在这里做什么错?

您正在设置POST参数:

curl_setopt($ch, CURLOPT_URL," http://www.example.com/readcurl.php");
//This line is not needed, and in fact it should produce a warning
//curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);

...但是正在尝试读取GET参数(将在URL中,即QUERY_STRING ):

count(explode('&', $_SERVER['QUERY_STRING']))

可以简单地计算$_REQUEST数组:

count($_REQUEST);

...但是由于这很容易破坏,除非您对整个应用程序拥有绝对控制权,否则我强烈建议您不要这样做,不要指望您以外的任何用户,也不要期望添加其他参数。

我建议改为显式检查每个参数:

if (isset($_REQUEST['param1']) && isset($_REQUEST['param2']) && isset($_REQUEST['param3'])) {
    //All parameters are here, get them
    $param1 = $_REQUEST['param1'];
    $param2 = $_REQUEST['param2'];
    $param3 = $_REQUEST['param3'];
}

此外,我建议不要一般使用$_REQUEST超全局变量-它包含所有POST参数,所有GET参数和所有COOKIE参数。 这意味着您将放弃一定的控制权,从而(在最坏的情况下)将您的应用程序开放给不必要的安全漏洞-或在最好的情况下,增加将来调试的复杂性。

相反,您应该直接访问$_GET$_POST$_COOKIE 超全局变量 -我建议您尽可能使用$_POST

if (isset($_POST['param1']) && isset($_POST['param2']) && isset($_POST['param3'])) {
    //All parameters are here
    $param1 = $_POST['param1'];
    $param2 = $_POST['param2'];
    $param3 = $_POST['param3'];
}

...哦-您在这里有错别字:

$data="param1=P1";
$data.= "param2=P2&"; 
$data.= "param3=P3";

(参数1和参数2之间缺少&符)

为了避免必须手动构造有效的查询字符串,您应该能够简单地将数组传递给curl,如下所示:

$data = array(
    'param1' => 'P1',
    'param2' => 'P2',
    'param3' => 'P3'
);
curl_setopt($ch, CURLOPT_URL," http://www.example.com/readcurl.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

所有curl选项在此处都有详细记录

上方/下方的答案很长。

这是TL; DR和最佳做法,可以对数据进行正确的编码:

$dataArray = array(
    'param1' => 'data1',
    'param2' => 'data2',
);

$postData = http_build_query($dataArray, '', '&');

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

http://us.php.net/manual/zh/function.http-build-query.php

在接收脚本中,您检查

$_POST['param1']

因为POST数据不会附加到QUERY_STRING

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM