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


PHP failed attempts to log in record in a txt file

基本上,为了简短起见,我有一项大学作业,我必须编写一些脚本。

在其中之一中,我必须制作一个脚本,记录在登录表单中输入错误的数据。因此,它将获取用户的IP地址,并将其放入一个文本文件中,后跟时间、日期、错误名称(例如,错误的用户名和密码、错误的名称等)、错误页面和所做的尝试。

我发现:如何获取用户ip如何获取时间和日期如何记录尝试

现在,我想做的是:我希望脚本搜索用户的IP地址,如果已经为失败的尝试记录了这个IP地址,我希望它只在对该IP地址的尝试中添加1,更新时间和日期,而不是创建新的记录。只有在尚未记录此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);
}
?>

如果你只是一次又一次地附加到同一个文本文件,那么如果你真的想把每个用户的尝试次数加起来,那么据我所知,你需要重写完整的txt文件。如果你想让自己更容易,那么你可以用这样一种方式编写你的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()函数检查两个ip是否匹配,错误代码是否相同。

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

您需要创建一个最多但不包括该行的字符串,并将其放入一个类似$firstpart的变量中。

您还需要对影响行之后的行执行同样的操作。例如$lastpart

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

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

不确定这是否有效,也不确定这有多实际,但至少我希望它能帮助你对如何处理你的问题有一些启发。