我有这个:
$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 === true) {
带
if ($pos !== false) {
我做了什么但它仍然不起作用。
以下是我用来保存到文本文件的代码:
//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 :(得分:2)
直接来自strpos()
上的手册:
返回针存在于相对于haystack字符串开头的位置(与offset无关)。另请注意,字符串位置从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";
}
答案 1 :(得分:2)
我认为这是三个问题的结合。
首先,如果你加载的文件在ip地址的末尾有一个新行,那么它就不匹配了:
$findme = file_get_contents($fi2);
更改为
$findme = trim(file_get_contents($fi2));
正如其他人指出的那样,你的pos逻辑不正确。
if ($pos !== false) {
编辑:
你的争论顺序也是错误的:
$pos = strpos($findme, $mystring);
答案 2 :(得分:0)
strpos
会返回一个数字,如果找不到,则返回false
。
正确的if语句是:
if ($pos !== false) {
另一个常见错误是写:
if (!$pos) {
但是如果$pos
是0
- 如果在字符串的开头找到字符串会发生这种情况 - 这个检查也会失败。
答案 3 :(得分:0)
if语句的替代方法:
if(!is_bool($pos)){
答案 4 :(得分: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
。