可能导致字符串串联失败的原因


What could cause string concatenation to fail?

以下代码存在于我的一台服务器上:

    $curl = curl_init();
    $url = "http://www.example.com/controller/action?param1=" . $value1 . "&param2=" . $value2;
    $url = str_replace(" ","%20",$url);
    curl_setopt_array($curl, array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $url
    ));
    $result = curl_exec($curl);

大多数时候,这工作得很好。但是,今天在示例中.com的访问日志中,我注意到第二个参数完全丢失的条目。 不仅仅是值,而是整个参数。 所以日志行是

GET/controller/action?param1=36838242 HTTP/1.1

我想不出任何会导致param2从查询字符串中完全丢失的条件。然而,显然它发生了。 并且只有一个代码块进行此 curl 调用,因此这绝对是负责访问日志条目的代码。

所以我的问题是,在什么情况下,连接的一部分会失败,但其余代码会继续运行?由于代码在 99% 的时间内都有效,我很想把它写成侥幸,但这真的让我很烦恼。

正如其他人所指出的,字符串连接不会失败。

我猜$value1包含一些未正确编码的不可打印字符。您的str_replace只处理空间。做这样的事情会更安全:

$params = array( 'param1' => $value1,
                 'param2' => $value2 );
$url = 'http://www.example.com/controller/action?' . http_build_query($params);

并放弃当前对str_replace的调用.