2013-05-03 283 views
1

我完全困惑:爲什麼我的函數方法不能工作?從函數返回布爾值後檢查布爾值

我有一個小問題,我不確定它來自哪裏,但我想先檢查一下,如果我的IF語句是原因,但在java if(var){ //var is true }工程,但在PHP中,它似乎更多比我對布爾人的理解複雜。

我試圖檢查,如果一個布爾值是真的後,我檢查使用的函數return true;

我的一些代碼是這樣的。

IF:if($user->userValidMC($_POST['username']) === true 功能:

public function userValidMC($user){ 

     // grab data 
     $minecraftOutput = file_get_contents('https://www.minecraft.net/haspaid.jsp?user=' . $user . ''); 

     return $minecraftOutput; 

    } 

上午我檢查什麼不對,或者是我的代碼完全錯誤(功能)?

+0

是否在你的榜樣的URL _really_返回PHP值「真」或者是返回_String_真的嗎? – akluth 2013-05-03 14:05:24

+0

您正在檢查一個字符串是否爲bool類型並設置爲true,哪些字符串不是。 – Daniel 2013-05-03 14:05:35

+0

你似乎沒有從你的函數中返回'true'。 – Rikesh 2013-05-03 14:05:39

回答

2

遠程服務返回一個字符串,無論是'true''false',所以返回值應該是:

return trim($minecraftOutput) === 'true'; 
+0

+1:這是我尋找的解決方案! – 2013-05-03 14:09:35

+0

認爲file_get_contents將因404錯誤而失敗。讓我們看看OP說什麼 – hek2mgl 2013-05-03 14:11:46

+0

@ hek2mgl不,它顯然會返回'(string)false',所以有理由認爲它會成功爲'(string)true' :) – 2013-05-03 14:15:29

0

您正在返回file_get_contents的結果。
包含文件的內容,而不是布爾值。
我建議你檢查文件是否存在,然後看看是否有長度的內容。

+0

失敗時,file_get_contents()將返回FALSE。 – sbeliv01 2013-05-03 14:06:31

+0

就這樣。謝謝你的提示。 – 2013-05-03 14:07:38

3

該方法實際上會返回一個字符串。 (有this URL測試)更改if到:

if($user->userValidMC($_POST['username']) !== 'false' 

這是因爲該用戶是否存在,該方法將返回頁面內容,而不是一個布爾true。但是你正在測試=== true。但是如果用戶不存在,則該方法將返回false,因爲file_get_contents()失敗。所以你應該檢查一下。

另一種方式 - 我寧願 - 是的方法更改爲:

public function userValidMC($user){ 
    // grab data 
    // the page will return the string 'false' if the user does not exist 
    $minecraftOutput = file_get_contents('https://www.minecraft.net/haspaid.jsp?user=' . $user . ''); 
    return $minecraftOutput !== 'false'; 
} 

...和(原)if聲明:

if($user->userValidMC($_POST['username']) === true 
+0

+1:雖然當我看到這個時我快門,但我明白-'file_get_contents'會在失敗時一直返回'bool'值'false',但沒有別的一致性! – 2013-05-03 14:08:08

+0

@MichaelPerrenoud是的,如果url將返回404,'file_get_contents()'將返回'bool(false)' – hek2mgl 2013-05-03 14:13:05

+0

謝謝,這似乎與傑克的答案一起工作。恥辱我不能將兩個答案標記爲解決方案! – Lewes 2013-05-03 14:16:53

0

的file_get_contents將返回的內容的文件,或錯誤。

使用三聯=手段比較值和類型,所以你說如果函數返回一個布爾,這也不會,

0

的,如果你張貼檢查閹羊「userValidMC」已返回true的功能,請注意,您使用===,所以要檢查爲實際的「真正」的布爾值,不僅僅是價值評估爲真(使用==)。

if($user->userValidMC($_POST['username']) === true) 

然而,函數返回的file_get_contents(http://php.net/manual/en/function.file-get-contents.php

此函數返回文件或假的故障內容的結果,所以它不應該返回true。

您可以檢查的結果是這樣的:

if($user->userValidMC($_POST['username']) !== false) 
0

的「的file_get_contents」成功返回一個字符串,失敗錯誤。

如果你只是簡單的測試,你得到的通話則有效響應:

return $minecraftOutput !== false; 

將返回一個布爾值。

或者如果你檢查的響應,那麼一個特定的值:

return $minecraftOutput === "expectedValue"; 

如果你想成爲不那麼嚴格,那麼:

if($user->userValidMC($_POST['username']) == true) 

將通過與(大多數)字符串長度大於0,但是從函數中返回一個嚴格的布爾值更安全。

參見:PHP type comparisons