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

时间:2015-08-26 17:30:15

标签: php 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'

我在这里做错了什么?

1 个答案:

答案 0 :(得分: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个参数(将在网址中,即QUERY_STRING):

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

可以只改为计算$_REQUEST数组:

count($_REQUEST);

...但是因为这很容易打破我会强烈反对它,除非你完全控制整个应用程序,不要指望除你自己以外的任何用户,并且永远不要期望添加另一个参数。< / p>

我建议明确检查每个参数:

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 superglobals - 我建议您随时使用$_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";

(param1和param2之间缺少&符号)

为了避免必须手动构建有效的查询字符串,您应该能够简单地将数组传递给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);

所有卷曲选项都有详细记录here