基本上为了保持简短,我有一个大学的任务,我必须制作一些脚本。
在其中一个中,我必须创建一个脚本,记录何时在登录表单中输入错误的数据。因此,它将占用用户的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);
}
?>
答案 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.
不确定这是否有效,不确定这是多么实用,但至少我希望它可以帮助你获得某种脑波来解决问题。