[英]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¶m2=P2¶m3=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.