我正在调用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'
我在这里做错了什么?
答案 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