파일 처리
php에서는 데이터를 파일에 저장할 수도 있고, 파일로부터 데이터를 읽어들일수도 있다.
파일 처리 과정
파일 읽기
1. 파일 열기, 열리지 않으면 종료
2. 파일에서 데이터 읽기
3. 파일 닫기
파일 쓰기
1.파일 열기, 파일이 존재하지 않으면 생성
2. 파일에 데이터 쓰기
3. 파일 닫기
파일 열기
fopen() 함수를 이용해 열 수 있다.
fopen("열 파일의 주소"."파일 접근 권한을 명시하는 파일 모드");
r | 파일을 읽기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함. |
r+ | 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함. |
w | 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함. 만약 파일이 존재하면 덮어쓰고, 파일이 없다면 새로 생성함. |
w+ | 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함. 만약 파일이 존재하면 덮어쓰고, 파일이 없다면 새로 생성함. |
a | 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 끝부분에 위치함. 만약 파일이 존재하면 이어 쓰고, 파일이 없다면 새로 생성함. |
a+ | 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 끝부분에 위치함. 만약 파일이 존재하면 이어 쓰고, 파일이 없다면 새로 생성함. |
x | 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함. 만약 파일이 존재하면 false를 반환하고 오류를 발생시킴. |
x+ | 파일을 읽고 쓰기 위해 열고, 파일 포인터는 파일의 시작 부분에 위치함. 만약 파일이 존재하면 false를 반환하고 오류를 발생시킴. |
c | 파일을 쓰기 전용으로 열고, 파일 포인터는 파일의 시작 부분에 위치함. 만약 파일이 없다면 새로 생성하고, 파일이 존재하면 파일을 덮어쓰지도 않고 오류를 발생시키지도 않음. |
c+ | 파일을 읽고 쓰기 위해 열고, 나머지는 'c'와 같음. |
뒤에 t를 추가하면... textmode로 열려서 모든 줄바꿈 문자를 실제로 바꿔준 상태로 전달
b를 추가하면 해당 파일을 binary mode로 열어서 줄바꿈 문자가 텍스트 그대로 전달됨
$fp = fopen("list.txt",'a');
list.txt를 열어 포인터를 파일 끝부분에 위치시키는 코드
파일 읽기
-fgets()
데이터를 한 번에 한 줄씩 읽어들인다.
$fp = fopen("list.txt", 'r'); //list.txt 파일을 읽기 전용으로 열고 파일 포인터를 $fp에 저장함
while(!feof($fp)){ //파일의 끝까지
$member = fgets($fp); //한 줄씩 $member 변수에 저장하고
echo $member."<br>"; // 출력한다.
}
-fgetsc()
데이터를 한 번에 한 글자씩 읽어들인다.
$fp = fopen("list.txt", 'r'); //list.txt 파일을 읽기 전용으로 열고 파일 포인터를 $fp에 저장함
while(!feof($fp)){ //파일의 끝까지
$char = fgetc($fp); //한 글자씩 $char 변수에 저장하고
if($char == "\n")
$char = "<br>";
if(!feof($fp))
echo $char; //출력함
}
-readfile()
데이터를 한번에 모두 읽어들인다.
전부 읽어서 출력 버퍼(output buffer)에 저장한다.
파일 닫기
fclose($fp); 로 닫을 수 있다.
파일 작성
-fopen()
여는 함수는 동일하지만 데이터를 쓸 경우에는 쓰기가 가능한 모드로 설정한다.
파일 쓰기
-fwrite() 함수
fputs()함수도 해당 파일에 문자열을 저장하는 작업을 한다.
$str = $name."\t".$gender."\t".$email."\n";
fwrite($fp,$str);
-파일 닫기는 fclose() 동일
-file_exists()
전달 받은 파일이나 디렉터리가 존재하는지 검사한다.
-filesize()
전달 받은 파일의 크기를 바이트 값으로 반환한다.
파일 내부 탐색
-ftell()
전달 받은 파일 포인터가 현재 가리키는 위치를 반환한다.
-rewind()
전달 받은 파일 포인터를 해당 파일의 맨 처음으로 이동시킨다.
-fseek()
전달 받은 파일 포인터를 특정 위치로 이동시킨다.
fseek....
첫인수:파일포인터
두번째인수: 3인수 기준 얼마나 옮기는지 오프셋
3인수: 오프셋 기준 (디폴트는 SEEK_SET)
SEEK_SET : 파일의 처음을 기준으로
SEEK_CUR : 파일 포인터 현재 기준
SEEK_END : 파일 끝 기준
일단 외워두긴 했는데 어따쓰는 함수인지 잘 가늠이 안가염
파일 삭제
-unlink()
전달받은 주소에 위치한 파일을 삭제한다.
쿠키
웹사이트에 접속할 때 서버에 의해 클라이언트 측에 남겨지는 부스러기 정보값들...
쿠키 생성
-setcookie()
쿠키를 생성할 수 있다.
setcookie($name[,$value[,$expire[,$path[,$domain[,$secure[,$httponly}}}}}})
쿠키 명을 제외한 매개변수는 전부 옵션이다.
지속시간을 전달하지 않으면 브라우저가 닫히기 전까지 유효하다.
HTTPS 프로토콜에서 사용하려면 secure 값을 true로 설정한다.
HTTP 프로토콜에서만 사용하려면 httponly 값을 true로 설정한다.
-$_COOKIE["쿠키이름"]
쿠키에 접근할 수 있는 변수.
<?php
$cookieName = "city";
$cookieValue = "서울";
setcookie($cookieName, $cookieValue, time()+60, "/"); //쿠키가 60초 지속
?>
...
<?php
if(!isset($_COOKIE[$cookiename])){
echo "{$cookieName}라는 이름의 쿠키는 아직 생성되지 않았습니다.";
} else {
echo "{cookieName}라는 이름의 쿠키가 생성되었으며, 생성된 값은 ".$_COOKIE[$cookieName]."입니다.";
}
?>
쿠키 삭제
unset() 함수나 setcookie()를 사용한다.
setcookie($cookieName, $cookieValue, time()-60, "/");
=
unset($_COOKIE["city"])
와 같음.
세션 session
여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 법.
브라우저를 닫아 서버와 연결을 끝내는 시점까지가 세션이다.
세션은 서비스가 돌아가는 서버 측에 데이터를 저장하고, 키값만 클라이언트 측에 남겨둔다.
보안에 취약한 쿠키 보완
세션 시작
session_start()
새로운 세션을 시작하거나, 기존의 세션을 다시 시작하게 해 준다.
지속시간은 php.ini 파일에 설정되어 있으므로 따로 명시해주지 않아도 ok
세션 변수의 등록
$_SESSION 배열에 등록할 수 있다.
등록을 해지하지 않는 이상 세션이 끝날 때까지 유지된다.
$_SESSION["city"] = "부산";
세션 변수 접근
$_SESSION["세션변수이름"]으로 접근할 수 있다
print_r($_SESSION); //모든 세션 변수의 정보를 연관 배열 형태로 보여준다.
세션 변수의 등록 해지
unset() 함수를 사용하면 해지가 가능하다.
session_unset() 현재 등록된 모든 세션 변수를 해지하고자 한다.
session_destroy() 세션 자체를 환전히 종료하여 아이디를 삭제한다.
예외 exception
프로그램이 실행 중에 발생하는 런타임 오류.
예외 처리는 발생한 예외를 처리하도록 코드 흐름을 바꾸는 행위이다.
예외 처리 (exception handling)
try 블록 내부에서 예외가 발생하면, 예외를 throw 던지고 catch 잡아서 처리한다.
php는 수동으로 던져야 한다...;; 왜죠
throw 예외객체;
Exception 클래스나 Exception 클래스를 상속받은 자식 클래스만 예외 객체가 될 수 있다.
프로퍼티 | 설명 |
---|---|
$message | 예외 메시지 |
$code | 예외 코드 |
$file | 예외가 발생한 파일명 |
$line | 예외가 발생한 라인 |
메소드 | 설명 |
---|---|
__construct() | 생성자 |
getMessage() | 예외 메시지를 반환함. |
getCode() | 예외 코드를 반환함. |
getFile() | 예외가 발생한 파일의 경로를 반환함. |
getLine() | 예외가 발생한 라인 번호를 반환함. |
getTrace() | 발생한 예외에 대한 정보를 포함한 배열(Exception stack trace)을 반환함. |
getTraceAsString() | getTrace()의 결과를 문자열로 반환함. |
__toString() | 발생한 예외에 대한 정보를 문자열로 반환함. |
사용자 정의 예외 (user defined exception)
class CustomException extends Exception //Exception 클래스를 상속 받아 예외 정의
{
public function errorMessage(){
$msg = $this->getMessage()."<br/>".
"예외가 발생한 파일 경로 : ".$this->getFile()."<br/>".
"예외가 발생한 라인 번호 : ".$this -> getLine();
return $msg;
}
}
try
{
throw new CustomException("예외 메시지");
}
catch(CustomException $ex){
echo $ex->errorMessage();
}
예외 메시지...
대체 언제 쓰게되는건지 모르겠음