PHP尝试在txt文件中登录记录失败

时间:2014-04-28 20:23:00

标签: php

基本上为了保持简短,我有一个大学的任务,我必须制作一些脚本。

在其中一个中,我必须创建一个脚本,记录何时在登录表单中输入错误的数据。因此,它将占用用户的IP地址并将其放入文本文件中,后跟时间,日期,错误名称(例如,错误的用户名和密码,错误的名称,w.e。),错误页面和尝试。

我已经想通了: 如何获取用户ip 如何获得时间和日期 如何记录尝试

现在,我想要做的是:我希望脚本搜索用户的IP地址,如果已经为失败的尝试记录了这个IP地址,而不是创建一个新记录,我希望它只需添加1到对该IP地址的尝试,更新时间和日期。只有在未记录此IP地址的情况下,才应创建新记录。

if IP ALREADY EXISTS{
FIND AMOUNT OF ATTEMPTS
attempts++;

} 

else{
   ADD IP;
   ADD TIME;
   ADD DATE;
   ADD REASON;
   attempt=1;
}

这是我到目前为止所做的:

<?php
$time = date("h:i:sa");
$date = date("d/m/y");
$error = "Incorrect Data Entered";
$attempts = 0;
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
$myFile = "errorLog.txt"; 
$file = fopen($myFile, 'a') or die("can't open file");
$searchfor = "$ip";

// the following line prevents the browser from parsing this as HTML.
header('Content-Type: text/plain');

// get the file contents, assuming the file to be readable (and exist)
$contents = file_get_contents($myFile);
// escape special characters in the query
$pattern = preg_quote($searchfor, '$ip');
// finalise the regular expression, matching the whole line
$pattern = "/^.*$pattern.*\$/m";
// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)){
   echo "Found matches:\n";
   echo implode("\n", $matches[0]);
}
else{
  $attempts = 1;                
  $stringData = "$ip, $time, $date, $error, $attempts\n";
  fwrite($file, $stringData);
  fclose($file);
}
?>

1 个答案:

答案 0 :(得分:1)

如果您只是一遍又一遍地附加到同一文本文件中,那么如果您真的想要将每个用户的尝试次数相加,那么您将需要重写完整的txt文件,直到我&#39;我知道。 如果你想让自己更容易,那么你可以编写你的txt文件,这样你就可以轻松地从中获取所需的值,例如ip地址。

你可以写下每一行:

IPADDRESS,ERROR CODE,ATTEMPTS /n

然后,当您想要更改该行时,您需要记录它是哪一行。将需要一个循环来解析您的txt文件。 所以我尝试的方式是:

将文件中的文本存储到变量中。

使用explode()函数创建记录数组。 (就像数据库中的一行)。我会像$rows = explode("/n" , $txt);

一样使用它

遍历行。我可能会使用foreach( $rows as $row)

跟踪行号。因此,为它创建一个变量并迭代它。

再次使用explode()功能创建list($ip, $err, $attempts)list($ip, $err, $attempts) = explode("," , $row);

现在使用普通的php if()函数检查两个ips是否匹配,如果错误代码相同。

如果他们这样做,你可以$attempts++。现在是棘手/必不可少的部分。

您需要创建一个字符串,但不包括该行,并将其放入变量调用$firstpart

您还需要对效果行之后的行执行相同操作。例如$lastpart

现在为受影响的行创建一个新字符串。轻松完成:$str = $ip . "," . $err . "," . $attempts;

最后,使用变量编写txt文件,顺序为:$firstpart, $str, $lastpart.

不确定这是否有效,不确定这是多么实用,但至少我希望它可以帮助你获得某种脑波来解决问题。