2012-05-02 62 views
1

我在這裏有這個小片段,即使它滿足if語句也返回false如果語句返回假即使它不是

$urls = $_POST['links']; 
    trim($urls); 
$urls = explode("\r\n",$urls); 
foreach($urls as $url){ 
    trim($url); 
    if(strpos($url,'http://') === false) 
     $url = 'http://'.$url; 
    $parse = parse_url($url, PHP_URL_HOST); 
    if(($parse != 'site.com') || ($parse != 'www.site.com')) //problem here 
     echo 'false:'.$parse.'<br>'; 
    else 
     echo 'true:'.$parse; 
} 

的輸入是從一個textarea:

http://site.com 
site.com 
http://www.site.com 
www.site.com 

輸出:

true:site.com 
true:site.com 
false:www.site.com 
false:www.site.com 

你認爲是什麼問題?

+0

只是一個小竅門:你可以在GET和POST參數中使用數組,例如var [0] = abc&var [1] = def你的爆炸構造是有點不安全的。 – peipst9lker

+0

@ peipst9lker對不起,我沒有明白你的意思,你能解釋一下嗎? – Michelle

+0

@ peipst9lker我不確定這會有所幫助,因爲它看起來像4行都來自同一文本區域。我也不確定爆炸如您所建議的那樣是不安全的。不過,我確實認爲他應該使用「\ n」作爲分隔符而不是「\ r \ n」。 – jedwards

回答

4

我不知道你真的打算,但下面這行肯定是不對的:

if(($parse != 'site.com') || ($parse != 'www.site.com')) //problem here 

這將始終返回true,因爲如果分析是不是「site.com」是真實的,但它也是如果解析不是'www.site.com',並且由於它不能同時是它們兩個,它就是真的。你的意思是& &而不是||?也就是說,邏輯與而不是邏輯或?

if(($parse != 'site.com') && ($parse != 'www.site.com')) 

編輯:其實,如果你放什麼在你的問題需要的行爲,即真正的site.com和虛假的www.site.com,那麼你只是想:

if ($parse == 'site.com') 
{ 
    echo 'false:'.$parse; 
} 
else if ($parse == 'www.site.com') 
{ 
    echo 'false:'.$parse; 
} 

或者,也許這不是你想要的......

+0

我在想什麼?我的邏輯很差。謝謝 – Michelle

1

想想你在第二個if語句中使用的邏輯。無論$parse是什麼,您都將始終落入if分支。 (也就是說,你將永遠不會落入else分支。)

考慮以下方案:

// "Not A AND Not B" 
if(($parse != 'site.com') && ($parse != 'www.site.com')) 
// ... 

// "Neither A nor B" 
if(!(($parse == 'site.com') || ($parse == 'www.site.com'))) 
// ... 

// "Either A or B" 
if(($parse == 'site.com') || ($parse == 'www.site.com')) 
    echo 'true:'.$parse; 
else 
    echo 'false:'.$parse.'<br>'; 
// Note here we also swapped the two branches. 
0

更改,如果行:

if(($parse != 'site.com') && ($parse != 'www.site.com')) 
0

替換此行:

if(($parse != 'site.com') && ($parse != 'www.site.com'))