2010-06-06 2 views
1
if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile)) && $_SERVER['REQUEST_URI'] != "login" || "thankyou" || "confirm") 

이 코드가 작동하면 연산자가 현명하고 구문이 현명합니까?if 문이 올바르게 작동해야합니까?

답변

8

이 부분은 (아마도) 당신이 원하는대로 작동하지 않습니다

$_SERVER['REQUEST_URI'] != "login" || "thankyou" || "confirm" 

첫째, REQUEST_URI는 이러한 값과 동일하지 않습니다 - 적어도 추가 /있을 것이다. 스크립트의 이름이 test.php 인 경우 REQUEST_URI에 적어도 /test.php이 포함됩니다 (그 밖의 내용은 아래 참조). 변수 구성 방법을 보려면 REQUEST_URI 변수를 살펴보십시오.

또한 REQUEST_URI은 임의의 추가 쿼리 문자열을 포함하므로 임의로 ?name=value을 URL에 추가하여 비교를 혼동시킬 수 있습니다.

phpinfo()을 수행하면 REQUEST_URI보다 더 적합한 것을 찾을 수 있습니다. SCRIPT_NAME.

두 번째로 비교 작업을 수행하기 전에 수행중인 "or"작업이 값에 적용됩니다. 그것은 할지라도

!in_array($_SERVER['SCRIPT_NAME'], 
      array("/login.php", "/thankyou.php", "/confirm.php")) 
+0

$ name = basename ($ _ SERVER [ 'REQUEST_URI']); $ name_array = 폭발 ('.', $ 이름); 내 코드는 입니다. 아아 기다려야하므로 대신 $ name_array [0]이어야합니다. 바보 나. – Sam

+0

@Sam 나는 그게 좋다고 생각해. 그러나,'||'비교는 어느쪽으로도 작동하지 않을 것입니다.'in_array()'메소드가 나타납니다. 또는 login, thankyou 및 confirm 각각에 대해 '! ='비교를 수행해야합니다. –

+0

아하이 봐요. 빠른 응답 주셔서 감사합니다, 그것은 일했습니다 :). – Sam

1

, 나는 "복잡한"조건 이러한 종류의 방법을 만들 것입니다 :

당신은 아마 이런 식으로 뭔가를 할 수 있습니다.

방법 본문은 다음과 같이 보일 것입니다 :

if(!condition1) 
    return false; 

if(!condition2) 
    return false; 

if(!conditionN) 
    return false; 

return true; 

편집 : , 당신은 스스로가 매우 긴 문장 만약보다 훨씬 더 읽을 적절하게 그 조건 방법과 방법을 단지 가독성 이름을 지정할 수 있습니다 이유 .

관련 문제