2014-04-28 3 views
0

기본적으로 짧게 유지하기 위해 몇 가지 스크립트를 만들어야하는 대학 과제가 있습니다.PHP가 txt 파일에 기록에 로그인하지 못했습니다.

이 중 하나에서 데이터가 로그인 양식에 잘못 입력되면 스크립트를 작성해야합니다. 따라서 사용자 IP 주소를 가져 와서 텍스트 파일에 넣고 시간, 날짜, 오류 이름 (예 : 잘못된 사용자 이름 및 암호, 잘못된 이름, we.), 오류 페이지 및 시도를 입력하십시오.

내가 알아 낸 : 얻을하는 방법을 사용자가 내가 원하는 무엇을, 어떻게 방법을 시도

이제

를 기록하는 시간과 날짜 을 얻는 을 IP : 나는 검색 스크립트를 원하는 사용자 IP 주소 및이 IP 주소가 실패한 시도에 대해 이미 기록 된 경우 새 레코드를 만드는 대신 해당 IP 주소에 대한 시도에 1을 더하고 시간과 날짜를 업데이트합니다. 이 IP 주소가 기록되지 않은 경우에만 새 레코드를 작성해야합니다.

<?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

왜이 태그가 C++입니까? 그것은이 질문과 아무 관련이 없습니다. –

+4

플랫 파일보다 db가 훨씬 더 쉬울 것입니다. –

+0

C++과 관련이 없으면 C++을 사용하고 있습니다. 죄송합니다. 또한 DB와는 더 쉽게 작업 할 수 있지만 조건은 묻습니다. 파일 형식, 내가 어떻게 MySQL DB를 함께 할 줄 알아 : | – SebastianZdroana

답변

1

당신이 정말로 각 개별 사용자에 의해 시도 횟수를 추가 할 경우 간단히 반복해서 같은 텍스트 파일에 추가하는 경우 :

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

} 

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

내가 지금까지 무엇을 가지고 , 그럼 내가 아는 한 전체 txt 파일을 다시 작성해야 할 것입니다. 너 자신을 쉽게 만들고 싶다면 IP 주소와 같이 필요한 값을 쉽게 얻을 수있는 방법으로 txt 파일을 작성할 수 있습니다.

당신이 좋아하는 각 라인 쓸 수있다 : 당신이 줄을 변경하고자 할 때 그럼 당신은 그것이 라인있는 기록을 유지해야합니다

IPADDRESS,ERROR CODE,ATTEMPTS /n 

합니다. txt 파일을 구문 분석하려면 루프가 필요합니다. 그럼 내가 시도 할 방법은 다음과 같습니다.

텍스트를 파일에서 변수로 저장하십시오.

explode() 함수를 사용하여 레코드 배열을 만듭니다. (데이터베이스의 한 행처럼). 나는 그것을 좋아할 것이다. $rows = explode("/n" , $txt);

행을 반복한다. 아마 이것을 위해 foreach($rows as $row)을 사용할 것입니다.

행 번호를 추적하십시오. 그래서 그것을위한 변수를 만들고 그것을 반복합니다.

은 수행하여 list($ip, $err, $attempts)을 만들기 위해 다시 explode() 기능을 사용 list($ip, $err, $attempts) = explode("," , $row);

지금 정상 PHP를 사용하는() 함수를 확인하는 경우 경우 두 개의 IPS 일치, 에러 코드가 같은 경우.

만약 그렇다면 $attempts++을 사용할 수 있습니다. 이제 까다 롭고 필수적인 부분.

최대 행을 포함하지 않는 문자열을 만들고 변수에 넣으면 $firstpart과 같은 문자열이 필요합니다.

영향을받은 행 다음 행에 대해서도 동일한 작업을 수행해야합니다.예 : $lastpart

이제 영향을받는 행에 대해 새 문자열을 만듭니다. 순서대로 $str = $ip . "," . $err . "," . $attempts;

마지막으로, 변수를 사용하여 TXT 파일을 작성 : 쉽게 수행 $firstpart, $str, $lastpart.

확실하지 않음이이게 확실하지 얼마나 실용적 작동하는지,하지만 적어도 나는 그것이 도움이되기를 바랍니다 당신은 당신의 문제에 접근하는 방법에 대한 일종의 브레인 웨이브를 얻으려고합니다.

+0

고맙다. 나는 어디든 갈 수 있는지 알아볼 것이다. – SebastianZdroana

+0

드래곤을 포맷팅하는 코드를 추가해 주셔서 감사합니다. 휴대 전화로이 코드를 사용하면 안됩니다. – Colum

관련 문제