2014-02-26 63 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)'并发布它的输出。 –

相关问题