세션
값을 전달하지 않고 값을 계속 유지시켜주는 방식
*세션에 많은 정보를 저장하면 안된다.
세션 VS 쿠키
세션에 저장되는 정보는 서버쪽에 저장
쿠키는 브라우저에 저장 (해킹 쉬움)
a.php
<?
session_start();
$_SESSION["name"] = '학생';
$_SESSION["passwd"] = '암호';
$name=$_SESSION["name"];
$passwd= $_SESSION["passwd"];
echo(" name = $name <br>");
echo(" passwd = $passwd <br>");
echo("<a href='./b.php'>b.php</a>");
?>
b.php
<?
session_start();
$_SESSION["name"] = '학생';
$_SESSION["passwd"] = '암호';
$name=$_SESSION["name"];
$passwd= $_SESSION["passwd"];
echo(" name = $name <br>");
echo(" passwd = $passwd <br>");
echo("<a href='./b.php'>b.php</a>");
?>
php.ini에 'session.auto_start = 1'로 설정하면 session_start() 함수를 생략 할 수 있다.
$_SESSION["name"] 변수와 $_SESSION["passwd"] 변수에 세션 값을 저장한다.
이들 변수는 session_destroy() 함수나 session_unset() 함수가 호출되기 전까지 계속 유지된다.
▶ 세션 관련 함수
• bool session_start ( void )
- 세션을 시작한다.
- 매개 변수 없이 쓰인다.
- session.auto_start=1로 설정하면 함수를 자동으로 실행한 것과 동일하다.
- $_SESSION 배열을 이용해서 세션 변수를 등록한다.
• bool session_destroy( void )
- 세션을 종료한다.
- 매개 변수 없이 쓰인다.
- 이후 세션을 이용하려면 새로운 세션을 시작해야 한다.
• void session_unset ( void )
- 세션 변수를 모두 초기화 한다.
- 매개 변수와 반환 값이 모두 없다.
- 세션자체를 없애는 것은 아니다.
• string session_id ( void )
- 세션 ID를 반환한다.
세션을 이용한 인증 처리
• 테이블 입출력 프로그램
- st_vi.php : student 테이블 출력 프로그램
- st_in.html : student 테이블 입력 폼
- st_in.php : student 테이블 입력 프로그램
• 인증 정보(계정) 등록 프로그램
- id.html : 계정 등록 폼
- id.php : 계정 등록 프로그램
• 로긴 프로그램
- check.html : 로긴 정보 입력 폼
- check.php : 로긴 프로그램
세션을 이용한 인증 처리 실습
인증을 위해 미리 테이블을 생성한다.
오라클에 접속해서 생성한다.
SQL> CREATE TABLE id(
2 id varchar2(10),
3 passwd varchar2(32) CONSTRAINT id_nu_passwd NOT NULL,
4 CONSTRAINT user_pk_id PRIMARY KEY (id)
5 );
테이블이 생성되었습니다.
• 계정 등록 프로그램
id.html
<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> 계정등록 </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="id" action="id.php" method="POST">
<center>
<table border="0" width="250">
<tr>
<td width="50"><p align="center">ID</p></td>
<td> <input type="text" name="id"></td>
</tr>
<tr>
<td width="50"><p align="center">passwd</p></td>
<td> <input type="password" name="passwd"></td>
</tr>
<tr>
<td colspan="2">
<p align="center"><input type="submit" name="확인" value="확인"></p>
</td>
</tr>
<table>
</form>
</body></html>
id.php
<?
require('conn.php');
$id = $_POST["id"];
$passwd = $_POST["passwd"];
$sql="insert into id (id, passwd)
values ('$id', DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2))";
$result=oci_parse($conn,$sql);
$re=@oci_execute($result); // 입력된 값을 테이블에 저장한다.
oci_free_statement($result);
oci_close($conn);
if(!$re){
echo(" <script>
window.alert('계정 등록 장애입니다.');
history.go(-1);
</script>
");
exit;
} // st_vi.php를 호출할 때 $id나 $passwd는 세션변수에 등록되었음으로
else // 전달할 필요가 없다.
echo(" <meta http-equiv='Refresh' content = '0; URL=st_vi.php'>");
?>
• 로긴 프로그램
로긴 프로그램은 st_vi.php로부터 호출된다. st_vi.php의 [login] 버튼을 클릭하면 check.html을 호출하여 id와 패스워드를 입력 받는다.
입력된 id와 패스워드는 POST방식으로 check.php에 전달된다.
check.html
<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> login </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="login" action="check.php" method="POST">
<center>
<table border="0" width="250">
<tr>
<td width="50"><p align="center">ID</p></td>
<td> <input type="text" name="id"></td>
</tr>
<tr>
<td width="50"><p align="center">passwd</p></td>
<td> <input type="password" name="passwd"></td>
</tr>
<tr>
<td colspan="2">
<p align="center"><input type="submit" name="확인" value="확인"></p>
</td>
</tr>
<table>
</form>
</body></html>
check.php
<?
session_start();
require('conn.php');
$id = $_POST["id"];
$passwd = $_POST["passwd"];
$sql="select * from id
where id = '$id'
and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";
$result=oci_parse($conn,$sql);
$re=oci_execute($result);
$row_num=oci_fetch_all($result,$row);
oci_free_statement($result);
oci_close($conn);
if($row_num == 1){
$_SESSION["id"] = $id;
$_SESSION["passwd"] = $passwd;
echo(" <meta http-equiv='Refresh' content = '0; URL=st_vi.php'>");
}
else{
echo(" <script>
window.alert('잘못된 계정 정보입니다.');
history.go(-1);
</script>
");
exit;
}
?>
• 로그인이 안된 상태에서 접근 불가능
log.php
<?
session_start();
if(empty($_GET["logout"]))
{}
else session_unset();
$id = $_SESSION["id"];
$passwd = $_SESSION["passwd"];
require('conn.php');
$sql="select * from id
where id= '$id'
and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";
$result=oci_parse($conn,$sql);
$re=oci_execute($result);
$row_num=oci_fetch_all($result,$row);
if($row_num == 1)
{
}
else
{
echo(" <script>
window.alert('로그인이 필요합니다');
history.go(-1);
</script>
");
}
?>
st_in.html
<?
require('log.php') // login이 안되어 있으면 접근 불가능한 것을 추가
?>
<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> student 입력폼 </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="insert" action="st_in.php" method="POST">
<center>
<table border="0" width="250">
<tr>
<td width="50"><p align="center">학번</p></td>
<td> <input type="text" name="sno"></td>
</tr>
<tr>
<td width="50"><p align="center">이름</p></td>
<td> <input type="text" name="sname"></td>
</tr>
<tr>
<td width="50"><p align="center">성별</p></td>
<td> 남<input type="radio" name="sex" value="남">,
여<input type="radio" name="sex" value="여"></td>
</tr>
<tr>
<td width="50"><p align="center">학과</p></td>
<td> <select name="major" size="1">
<option value="화학">화학</option>
<option value="생물">생물</option>
<option value="물리">물리</option>
<option value="유공">유공</option>
<option value="식영">식영</option></td>
</tr>
<tr>
<td width="50"><p align="center">학년</p></td>
<td> 1<input type="radio" name="syear" value="1">,
2<input type="radio" name="syear" value="2">,
3<input type="radio" name="syear" value="3">,
4<input type="radio" name="syear" value="4"></td>
</tr>
<tr>
<td width="50"><p align="center">학점</p></td>
<td> <input type="text" name="avr"></td>
</tr>
<tr>
<td colspan="2">
<p align="center"><input type="submit" name="확인" value="확인"></p>
</td>
</tr>
</table>
</form>
</body></html>
로그인이 안된 상태에서 자료 입력하기를 바로 들어가려면 접근이 불가능하다.
• 테이블 입출력 프로그램
st_vi.php를 제외한 st_in.html과 st_in.php는 이전 소스와 동일해서 생략한다. st_vi.php는 로그인 상태와 로그인되지 않은 상태에 따라 출력 내용이 달라진다.
로그인 상태인 경우 데이터를 입력 버튼을 보여주지만 로그인이 아닌 상태에서는 로그인과 등록 메시지만 보여준다.
st_vi.php
<?
//==========================로그인========================================
session_start();
if(empty($_GET["logout"])){}
else session_unset(); // session_distroy 사용과 비교한다.
$id = $_SESSION["id"];
$passwd = $_SESSION["passwd"];
require('conn.php');
$sql="select * from id
where id = '$id'
and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";
$result=oci_parse($conn,$sql);
$re=oci_execute($result);
$row_num=oci_fetch_all($result,$row);
if($row_num == 1){ // 로긴 상태
echo("<a href=./st_in.html>자료 입력하기</a>
<a href=./st_vi.php?logout=$row_num>logout</a><hr>
");
}
else{ // 비로긴 상태
echo(" <a href=./id.html>계정등록</a>
<a href=./check.html>login</a><hr>");
}
//==========================자료입력========================================
//echo("<a href=./st_in.html>자료 입력하기</a><hr>");
//require('conn.php');
//==========================삭제기능========================================
$del=$_GET[del]; // $del 변수가 null이 아니면 행을 삭제하는 else절이 실행된다.
if (empty($del)){}
else {
$sql="delete from student where sno='$del'";
$result=oci_parse($conn,$sql);
oci_execute($result);
oci_free_statement($result);
}
//==========================검색기능=========================================
$search = $_GET[search];
if (empty($search)) {
$sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr
from student order by sno";
$result=oci_parse($conn,$sql);
}
else {
$sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr
from student
where sname like '%{$search}%' order by sno";
$result=oci_parse($conn,$sql);
}
oci_execute($result);
//==========================================================================
$row_num=oci_fetch_all($result, $row); // $row_num : 전제 행의 수
//echo("Row의 개수는 $row_num 입니다.<br><hr>"); // 행은 컬럼명, 열은 행번호
oci_free_statement($result);
oci_close($conn);
$scale=5; // 화면에 출력할 행의 개수
$start = $_GET[start];
if (empty($start)){$start=0;} // 첫 화면은 0에서 시작, 배열의 키값은 0에서 시작
echo("<table border='1'>");
for($i=$start; $i<($start+$scale); $i++) {
if ($i<$row_num){
echo("
<tr>
<td width='50'><p align='center'>{$row['SNO'][$i]}</p></td>
<td width='80'><p align='center'>{$row['SNAME'][$i]}</p></td>
<td width='20'><p align='center'>{$row['SEX'][$i]}</p></td>
<td width='20'><p align='center'>{$row['SYEAR'][$i]}</p></td>
<td width='50'><p align='center'>{$row['MAJOR'][$i]}</p></td>
<td width='30'><p align='center'>{$row['AVR'][$i]}</p></td>
<td width='30'><a href=./st_vi.php?del={$row[SNO][$i]}>del</a></td>
</tr>
");
}
}
echo("</table><br>");
$p=$start-$scale; // 이전 화면의 시작 위치
$n=$start+$scale; // 다음 화면의 시작 위치
if($p>=0)
echo("<a href=./st_vi.php?start=$p&search=$search>[이전페이지]</a> ");
else
echo("이전페이지 ");
if($n<$row_num)
echo("<a href=./st_vi.php?start=$n&search=$search>[다음페이지]</a>");
else
echo("다음페이지");
//echo("<br>");
//echo($search); // 확인하기 위해 search 변수 출력
echo("<hr>");
echo("$row_num 열이 검색됨<br><br>");
?>
<form name='search' method='get' action='st_vi.php'>
검색창 <input type='text' name='search'>
<input type='submit' name='확인' value='확인'>
</form>
실행결과
계정을 등록한다.
계정을 등록하고 로그인을 클릭한다.
로그인이 된다.
로그인하면 자료 입력하기를 할 수 있다.
'PHP 공부 기록' 카테고리의 다른 글
PHP 8 - 다양한 기능 추가(삭제, 검색, 화면단위) 및 테이블 관계 입출력 (0) | 2021.12.24 |
---|---|
PHP 7 - PHP와 오라클 연동 (입출력 프로그램) (0) | 2021.12.24 |
PHP 6 - PHP를 이용한 DB 접속 (0) | 2021.12.12 |
(수정중) PHP 5 - 배열 (0) | 2021.11.23 |
PHP 4 - 폼(Form) (0) | 2021.11.19 |