2014-02-26 99 views
0

我有這樣的:Strpos是說它沒有找到字符串時,它應該有

$fi2 = "/var/www/server/poll/ips.txt"; //IP file 
$mystring = $_SERVER['REMOTE_ADDR']; //IP according to server 
$findme = file_get_contents($fi2); 
$pos = strpos($mystring, $findme); 
if ($pos === true) { 
    echo "Found"; 
} else {  
    echo "not found"; 
} 

但是,它並沒有說「未發現」,即使IP匹配在文本文件中的東西。我已經完成

echo "$mystring $findme"; 

它會正確輸出我的IP和文本文件。

有人告訴我,我應該用

if ($pos !== false) { 

,我做到了,它仍然無法正常工作更換

if ($pos === true) { 

這是我用來保存到文本文件中的代碼:

//Record IP 
$fi2 = "/var/www/server/poll/ips.txt"; //IP file 
file_put_contents($fi2, "\r\n$mystring", FILE_APPEND); //Stick it onto the IP file 
+0

您確定該文件已正確加載嗎? – kero

+0

是的,我用'回聲',它打印出來很好 – Frank

+0

你不能只使用preg_match(); ?對不起,我在iPad上,無法將我的註釋格式化爲適當的代碼 –

回答

0

我只是理解了它自己。

我改變

file_put_contents($fi2, "\r\n$mystring", FILE_APPEND); //Stick it onto the IP file 

file_put_contents($fi2, "$mystring", FILE_APPEND); //Stick it onto the IP file 

我不知道爲什麼這個固定(剛開始PHP),但是這就是它打破的原因,因此,如果有人提出了一個答案來解決它與原來的線我會接受它。也需要更改$pos === true$pos !== false

+0

我真的好奇_why_解決了這個問題。 @ chipperyman573確保您重新添加分隔符。您不希望意外地匹配錯誤的IP。沒有分隔符,你可以匹配'1.2.3.41.2.3.5'中的'1.2.3.41'。 – Halcyon

+1

只有在文件中只有一個1時纔會修復它。否則它會再次破裂。我更新了我的答案,因爲strpos()參數是倒退的(這是另一個問題) –

+0

這解釋了很多。 'a'匹配'ab',但不是相反。複雜的bug總是最難找到的。 – Halcyon

2

直接從說明書上strpos()

返回將針存在相對的開始位置乾草堆字符串(獨立於偏移量)。還請注意,字符串位置從0開始,而不是1.

如果未找到針,則返回FALSE

所以結果是一個數字位置或FALSE,這意味着$pos === true總是失敗!另一個問題是strpos()簽名如下:

mixed strpos (string $haystack , mixed $needle [, int $offset = 0 ])

你混了$haystack$needle可以由窮人命名造成的。嘗試是這樣的:

$fi2 = "/var/www/server/poll/ips.txt"; //IP file 
$ip = $_SERVER['REMOTE_ADDR']; //IP according to server 
$file = file_get_contents($fi2); 
$pos = strpos($file, $ip);// ($findme, $mystring) 
if ($pos !== FALSE) { 
    echo "found"; 
} else { 
    echo "not found"; 
} 
+0

剛剛嘗試過,它仍然無法正常工作。 – Frank

+2

@ chipperyman573請參閱更新。 「strpos()」的參數錯誤順序 – kero

0

strpos返回一個數字或false如果沒有找到。

正確的if語句應該是:

if ($pos !== false) { 

另一個常見的錯誤是寫:

if (!$pos) { 

但如果$pos0 - 如果字符串是在的開始發現這恰好字符串 - 此檢查也會失敗。

+0

剛剛嘗試過,它仍然無效。 – Frank

+0

你是否確實知道IP在文件中?試試''findme = $ mystring',它應該匹配。 – Halcyon

+0

我超超級duper肯定,我只是下載到我的電腦,並手動檢查。 – Frank

0

的if語句的選擇:

if(!is_bool($pos)){ 
2

我認爲這是三個問題相結合。

首先,如果你加載文件具有在IP地址的最後一個新行,它不會匹配:

$findme = file_get_contents($fi2); 

變化

$findme = trim(file_get_contents($fi2)); 

也像其他人那樣指出,你的職位邏輯是不正確的。

if ($pos !== false) { 

編輯:

也爲strpos您的參數順序是錯誤的:

$pos = strpos($findme, $mystring); 
+0

試過這兩個,仍然不起作用。 – Frank

+0

嘗試'var_dump($ mystring,$ findme)'併發布它的輸出。 –

相關問題