PHP - 使用strpos比较字符串

时间:2011-11-09 20:13:41

标签: php

我在我的网站上设置了一个投票系统。然而,为了确保人们不能再次投票,我有一个知识产权寻找机制来收集他们的知识产权并确保他们不再投票。

我这样做的方式是,我收集他们的IP,然后将它与一个包含IP的文本文件进行比较。它有一个逗号分隔每个IP。

function getUserIP()
{
//check ip from share internet
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
  $ip=$_SERVER['HTTP_CLIENT_IP'];
}
//to check ip is pass from proxy
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
  $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
  $ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}

$visitorIp = getUserIP();
$myFile = "ip_polllist.txt";
$fh = fopen($myFile, 'r');
$theData = fread($fh, 200);
fclose($fh);
$findme = $visitorIp.",";
$mystring = $theData;
echo $mystring;
echo $findme;
$pos = strpos($mystring, $findme);
if($pos === true)
{
    die();
}
if($pos == true)
{
die();
}

代码有什么问题?为什么$pos = false

3 个答案:

答案 0 :(得分:0)

如果找到针,函数strpos()将返回整数位置。如果未找到针,则返回布尔值FALSE。

我建议使用$ pos!== false,因为如果您使用!=而不是!==,则返回的有效INT位置0可能会被解释为false。

答案 1 :(得分:0)

我不认为你的方法真的很好:

1)从多个请求写入单个文件并不是很好,因为查找文件可能会降低脚本的性能。你有权访问任何数据库系统吗?

2)您的网页上是否有任何帐户系统?如果是,我宁愿根据帐户而不是IP地址限制第二次投票。

3)当你开始第二次民意调查时你会怎么做?创建第二个文件?

4)fread($fh, 200):如果您有100个锁定用户(IP)会怎样?您的脚本只读取前200个字节。

5)if($pos == true):我真的不喜欢依赖PHP的自动显示“功能”。您需要FALSE或一个号码,因此请检查FALSE>= 0

答案 2 :(得分:0)

而不是

$fh = fopen($myFile, 'r');
$theData = fread($fh, 200);
fclose($fh);

您可以使用file_get_contents($myFile);

或者更好地将IP存储在数据库中!