웹 사이트를 운영하다보면 사용자 입력 또는 프로그램 처리 시 조건에 맞지 않을 경우 예외처리를 해야한다. 이럴때는 해당 페이지에 스크립트 alert 을 이용하여 에러 메시지를 띄우고 페이지를 이동을 하게 되는데 보기가 좋지 않다.  

 

이럴때 사용할 수 있는 방법은 처리되는 페이지를 ajax 처리 하여 결과를 받게 되는데 페이지 구조상 ajax 처리가 아닌 페이지 이동으로 구축을 해야할때도 있다. 이번 편은 ajax 가 아닌 페이지 이동 후 처리해야할 경우에 대해 예제를 통해 알아보도록 하자. 

 

기본방식 

먼저 아래와 같은 로그인 페이지가 있다.

<?php ex) index.php ?>
<form action="login.php" method="post">
	<p><input type="text" name="id" value="" placeholder="아이디"></p>
	<p><input type="password" name="password" value="" placeholder="비밀번호"></p>
	<p><input type="submit" value="로그인"></p>
</form>

 

`로그인` 버튼을 클릭하면 `login.php`로 이동하여 아래와 같이 로그인 처리를 하게 될 것 이다. 

<?php  // ex) login.php
try{
	if(empty($_POST['id'])){ throw new Exception("아이디를 입력해주세요.");}
	if(empty($_POST['password'])){ throw new Exception("비밀번호를 입력해주세요.");}

	// DB체크및 성공 처리
	// .. 

}catch(Exception $e){
	die('<script>alert("'.$e->getMessage().'"); location.href="index.php"; </script>');
}
header("Location: / ");
exit;

 

위와 같이 처리하게 된다면 예외처리가 될 경우 해당 페이지에서 흰 공백화면과 함께 알럿창을 볼 수 있다. 이런 방식은 가장 통상적인 방식이긴하나 원하는 로직은 페이지 이동 후 띄우는 방법이기때문에 이러한 처리를 위해서 사용되는 두가지 방식에 대해 알아보자 

 

1. PHP의 세션(SESSION) 을 이용한 방식

가장 먼저 알아볼 방법은 PHP의 세션을 이용한 방법이다. 먼저 FORM 페이지를 아래 예제와 같이 작성해 준다. 

<?php // ex) index.php
	session_start();
	$errMsg = '';
	if(!empty($_SESSION['errMsg'])){ $errMsg = $_SESSION['errMsg']; unset($_SESSION['errMsg']); }
?>
<form action="login.php" method="post">
	<p><input type="text" name="id" value="" placeholder="아이디"></p>
	<p><input type="password" name="password" value="" placeholder="비밀번호"></p>
	<p><input type="submit" value="로그인"></p>
</form>

<?php if( $errMsg != ''){?>
<script>window.onload = function(){ alert('<?php echo $errMsg ?>');} </script>
<?php } ?>

 

그다음 `로그인` 버튼 클릭 시 이동되는 `login.php ' 파일을 아래와 같이 작성해준다. 

<?php // ex) login.php
try{
	session_start();
	if(!empty($_SESSION['errMsg'])){ unset($_SESSION['errMsg']); } 	// 세션비우기

	if(empty($_POST['id'])){ throw new Exception("아이디를 입력해주세요.");}
	if(empty($_POST['password'])){ throw new Exception("비밀번호를 입력해주세요.");}

	// DB체크및 성공 처리
	// .. 

}catch(Exception $e){
	$_SESSION['errMsg'] = $e->getMessage();
	die('<script>location.href="index.php"; </script>');
}
header("Location: / ");
exit;

 

이의 예제 소스를 보면 session에 에러메시지 내용을 담아서 페이지로 보내고 있다. 이렇게 될 경우 이동된 `index.php` 에서 에러메시지를 띄우게 될것이다.  만약 사이트내 세션으로 처리가 불가능할 경우 아래와 같이 처리하는 방법도 있다. 

 

2. 에러메시지 자체를 파라미터로 보내서 처리하는 방식

먼저 `index.php` 파일을 아래와 같이 작성해 준다. 

<?php // ex) index.php
	$errMsg = '';
	if(!empty($_GET['errMsg'])){ $errMsg = base64_decode($_GET['errMsg']); }
?>
<form action="login.php" method="post">
	<p><input type="text" name="id" value="" placeholder="아이디"></p>
	<p><input type="password" name="password" value="" placeholder="비밀번호"></p>
	<p><input type="submit" value="로그인"></p>
</form>

<?php if( $errMsg != ''){?>
<script>window.onload = function(){ alert('<?php echo $errMsg ?>'); history.replaceState(null, null, "index.php"); } </script>
<?php } ?>

 

그다음 `로그인` 버튼 클릭 시 이동되는 `login.php ' 파일을 아래와 같이 작성해준다. 

<?php // ex) login.php
try{
	if(!empty($_SESSION['errMsg'])){ unset($_SESSION['errMsg']); } 	// 세션비우기

	if(empty($_POST['id'])){ throw new Exception("아이디를 입력해주세요.");}
	if(empty($_POST['password'])){ throw new Exception("비밀번호를 입력해주세요.");}

	// DB체크및 성공 처리
	// .. 

}catch(Exception $e){
	die('<script>location.href="index.php?errMsg='.base64_encode($e->getMessage()).'"; </script>');
}
header("Location: / ");
exit;

 

바로 위의 예제를 살펴보면 예외처리 시 에러메시지를 `base64_encode` 하여  `index.php`로 URL 파라미터로 남겨주었다. `index.php` 페이지에서는 에러메시지를 다시 `base64_decode` 하여 스크립트를 통해 띄어주었다.  여기서 중요한점은 새로고침시 메시지가 다시 뜨는것을 방지하기 위해 `history.replaceState` 를 통해 URL에 붙은 errMsg 파라미터를 삭제해주었다.