2015-01-16 3 views
0

다음 코드는 내 서버 중 하나에 살고 : 대부분의 시간 문자열 연결이 실패 할 수있는 원인은 무엇입니까?

$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); 

, 이것은 잘 작동합니다. 그러나 example.com의 액세스 로그에서 오늘 두 번째 매개 변수가 완전히 누락 된 항목을 발견했습니다. 값뿐만 아니라 전체 매개 변수. 그래서 로그 라인은

GET/컨트롤러/액션입니까? PARAM1 = 36838242 HTTP/1.1

내가 쿼리 문자열에서 누락 된 완전히 될 param2을 일으킬 것입니다 무슨 어떤 조건을 생각할 수 없다. 그러나 그것은 분명히 일어났습니다. 그리고이 컬 호출을 만드는 코드 블록이 하나 밖에 없으므로 이것은 분명히 액세스 로그 항목을 담당하는 코드입니다.

내 질문에 어떤 조건에서 연결이 실패 할 수 있지만 나머지 코드는 계속 실행 중입니까? 코드가 99 %의 시간 동안 작동하기 때문에 나는 그것을 우연히 쓰기를 좋아할 것이지만 이것은 정말로 나를 괴롭 히고 있습니다.

+1

아마도 '$ value1'에 0 바이트가 붙어있을 수 있습니다. –

+1

문자열 연결이 "실패"할 수 없습니다. 당신의'$ value'는 URL을 끝내는 (또는 최소한 서버가 볼 수있는 부분) 것을 포함하고 있습니다. 마지막으로, 요청이 귀하의 코드에서 전혀 나오지 않았을 수도 있습니다 (서버가 인터넷과 같은 큰 네트워크의 다른 클라이언트에 노출 된 경우). – CBroe

+0

@CBroe 로그 항목의 IP 주소가 다른 서버와 일치했습니다. 게다가, 나는 어쨌든 그 요청을하는 유일한 사람입니다. –

답변

3

다른 사람들도 지적했듯이 문자열 연결은 실패 할 수 없습니다.

$value1에는 제대로 인코딩되지 않은 인쇄 할 수없는 문자가 포함되어 있다고 생각합니다. str_replace은 공백 만 처리합니다.

$params = array('param1' => $value1, 
       'param2' => $value2); 

$url = 'http://www.example.com/controller/action?' . http_build_query($params); 

그리고 str_replace에 현재 통화를 삭제 : 당신은 훨씬 더 안전하고 이런 일이 될 것입니다.

+0

hmmm ... 내가 말하기를 싫어하는 동안 (그리고 나는 다른 사람이 그럴 것이라고 생각한다) 나는'$ value1'이 NUL이 아닌 문자열임을 보증 할 수있다. 내 데이터베이스 (그리고 그 값을 볼 수있는 다른 로그 파일에 기록됩니다). –

+0

충분합니다. 두 경우 모두 URL을 작성하는 방식이 안전하지 않습니다. 나는 아직도 그것이 가치있는 정보를 가지고 있다고 믿기 때문에이 대답을 남겨 둘 것이다. (내가 망각으로 버려지는 경우를 제외하고는 내가 제거 할 것이 아니라면) –

+0

예, 나는 querystring 건물이 열악하다는 것에 동의합니다. 이 상속 된 코드 (이)에 대해 비난하고 싶지만, 수정하지 않고 몇 번 보았으므로 지금은 내 책임입니다. 또한이 정보가 귀중한 정보가 될 수 있음에 동의합니다. 그리고이 경우처럼 모든 불가능한 시나리오가 제거 될 때 항상 남아있는 모든 것이 대답이어야합니다 : –

관련 문제