以下代码存在于我的一台服务器上:
$curl = curl_init();
$url = "http://www.example.com/controller/action?param1=" . $value1 . "¶m2=" . $value2;
$url = str_replace(" ","%20",$url);
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url
));
$result = curl_exec($curl);
大部分时间,这都很好。但是,今天在example.com的访问日志中,我注意到第二个参数完全丢失的条目。不只是值,整个参数。所以日志行是
GET / controller / action?param1 = 36838242 HTTP / 1.1
我无法想到会导致param2
从查询字符串中完全丢失的任何条件。然而,显然它发生了。并且只有一个代码块可以进行此curl调用,因此这绝对是负责访问日志条目的代码。
所以我的问题是,在什么条件下连接的一部分会失败,但其余的代码是否继续运行?由于代码在99%的时间内都有效,所以我喜欢把它写成侥幸,但这真的让我烦恼。
答案 0 :(得分:3)
正如其他人所指出的,字符串连接不会失败。
我猜测$value1
包含一些未正确编码的不可打印字符。您的str_replace
仅处理空格。你可以更安全地做这样的事情:
$params = array( 'param1' => $value1,
'param2' => $value2 );
$url = 'http://www.example.com/controller/action?' . http_build_query($params);
将当前通话发送至str_replace
。