[질답게시판 만들기] 09. write_ok.php

09.write_ok.php

넘어온 POST 값들을 이용해서 처리를 실행하는 페이지입니다.

<?php
include_once "common.php";

// 넘어온 데이타 정리
$post_idx		= $_POST['post_idx'];	// post_idx가 넘어왔다는건 수정이라는 뜻. 없으면 새글
$post_title		= $_POST['post_title'];
$post_content	= $_POST['post_content'];
$mem_nickname	= $_POST['mem_nickname'];
$mem_password	= hash('md5', $_POST['mem_password']);	// 비밀번호는 md5 암호화
$post_ip		= ip2long( $_SERVER['REMOTE_ADDR'] );
$post_regtime	= date('Y-m-d H:i:s');
$post_is_secret = $_POST['post_is_secret'] == 'Y' ? 'Y' : 'N';
$post_status	= 'Y';
$post_count_comment = 0;
$post_hit		= 0;

여기서 비밀번호는 md5 암호화를 하도록 하겠습니다.

비밀번호 자체를 DB에 넣는건 좀 뭐시기 한거같아서 간단하게 md5 로 처리하려고 합니다.

수정이건 신규건 일단 초기값을 위와같이 받도록 세팅했습니다.

 

// 수정일경우 기존값을 가져온다.
if($post_idx)
{	
	$query	= "SELECT * FROM `tbl_board_post` WHERE `post_idx` = '{$post_idx}' AND `post_status` = 'Y'";
	$result = $dbcon->query($query);
	$original	= $result->fetch_array();
	
	// 입력한 비밀번호가 기존 비밀번호와 맞는지 확인한다.
	if($original['mem_password'] == $mem_password OR $_POST['mem_password'] == ADMIN_PASSWORD)
	{
		//맞으면 기존 비밀번호로 대체한다 ( 관리자 비밀번호로 확인했을경우 관리자 비밀번호로 바뀌어 버리기 때문)
		$mem_password = $original['mem_password'];
	} 
	else
	{
		alert('입력하신 비밀번호가 기존의 비밀번호와 다릅니다.');
		exit;
	}
	
	// 수정일경우 값을 변경하면 안되는값들은 기존값을 그대로 이용한다.
	$post_regtime 		= $original['post_regtime'];
	$post_count_comment = $original['post_count_comment'];
	$post_hit			= $original['post_hit'];
}

수정일 경우를 처리하여줍니다.

기존 값을 가져온후,

비밀번호를 체크하고 (작성자 또는 관리자) 다르면 경고메시지를 출력하고 뒤로가기를 실행합니다.

비밀번호가 맞으면 기존 데이타의 비밀번호로 다시세팅해줍니다.

이는 관리자 비밀번호로 체크를 해서 맞을경우 관리자 비밀번호로 DB가 수정되는것을 방지하기 위함입니다.

같은 이유로 post_regtime (등록일시), post_count_comment (댓글개수), post_hit(조회수) 역시

기존 값으로 다시 대체해줍니다.

 

$query = "";
$query .= " `post_title` = '{$post_title}'";
$query .= ",`post_content` = '{$post_content}'";
$query .= ",`mem_nickname` = '{$mem_nickname}'";
$query .= ",`mem_password` = '{$mem_password}'";
$query .= ",`post_ip` = '{$post_ip}'";
$query .= ",`post_regtime` = '{$post_regtime}'";
$query .= ",`post_is_secret` = '{$post_is_secret}'";
$query .= ",`post_status` = '{$post_status}'";
$query .= ",`post_count_comment` = '{$post_count_comment}'";
$query .= ",`post_hit` = '{$post_hit}'";

// 수정일경우
if($post_idx) {	
	$query = "UPDATE `tbl_board_post` SET " . $query . " WHERE post_idx = '{$post_idx}'";
}
// 신규일경우
else {
	$query = "INSERT INTO `tbl_board_post` SET " . $query;	
}

// 쿼리 실행
$dbcon->query($query);

쿼리문을 작성하고 쿼리문을 실행해줍니다.

mysql 이 다른 sql 과 다른점이 있다면 INSERT 구문의 형식을 UPDATE 구문과 동일하게 사용할수 있다는 점입니다.

위와같이 먼저 입력할 값들을 세팅한뒤 수정이냐 신규에 따라 INSERT, UPDATE를 붙여주도록 하였습니다.

단 UPDATE경우는 WHERE 절을 이용하여 업데이트할 게시글 PK를 정의해줘야 합니다.

 

$result_msg = "글 수정을 완료하였습니다.";
// 신규 생성일경우
if(empty($post_idx))
{
	$result_msg = "새로운 글을 등록하였습니다.";
	// 신규생성일경우 post_idx 값이 비어있으므로 실행한 쿼리에서 생성된 게시글 PK를 가져온다. 
	$post_idx = $dbcon->insert_id;	
}

// 이글을 작성한사람은 비밀번호를 입력하지 않아도 되도록 세션을 생성해둔다.
$_SESSION['post_check_'.$post_idx] = time();

alert($result_msg, BASEURL."/read.php?idx=".$post_idx);
exit;

DB입력 완료후 메시지 표시하고,

작성한 글로 페이지를 이동하도록 게시글 PK를 구해오는 부분입니다.

UPDATE의 경우는 이미 게시글 PK가 있지만 신규글의 경우 게시글PK가 없으므로

insert_id 기능을 이용하여 게시글 PK를 구해오도록 합니다.

또한 글을 작성한사람의 세션을 생성하여 비밀번호를 입력하지 않아도 볼수있도록 처리합니다.

 

 

완성된 코드

<?php
include_once "common.php";

// 넘어온 데이타 정리
$post_idx		= $_POST['post_idx'];	// post_idx가 넘어왔다는건 수정이라는 뜻. 없으면 새글
$post_title		= $_POST['post_title'];
$post_content	= $_POST['post_content'];
$mem_nickname	= $_POST['mem_nickname'];
$mem_password	= hash('md5', $_POST['mem_password']);	// 비밀번호는 md5 암호화
$post_ip		= ip2long( $_SERVER['REMOTE_ADDR'] );
$post_regtime	= date('Y-m-d H:i:s');
$post_is_secret = $_POST['post_is_secret'] == 'Y' ? 'Y' : 'N';
$post_status	= 'Y';
$post_count_comment = 0;
$post_hit		= 0;

// 수정일경우 기존값을 가져온다.
if($post_idx)
{	
	$query	= "SELECT * FROM `tbl_board_post` WHERE `post_idx` = '{$post_idx}' AND `post_status` = 'Y'";
	$result = $dbcon->query($query);
	$original	= $result->fetch_array();
	
	// 입력한 비밀번호가 기존 비밀번호와 맞는지 확인한다.
	if($original['mem_password'] == $mem_password OR $_POST['mem_password'] == ADMIN_PASSWORD)
	{
		//맞으면 기존 비밀번호로 대체한다 ( 관리자 비밀번호로 확인했을경우 관리자 비밀번호로 바뀌어 버리기 때문)
		$mem_password = $original['mem_password'];
	} 
	else
	{
		alert('입력하신 비밀번호가 기존의 비밀번호와 다릅니다.');
		exit;
	}
	
	// 수정일경우 값을 변경하면 안되는값들은 기존값을 그대로 이용한다.
	$post_regtime 		= $original['post_regtime'];
	$post_count_comment = $original['post_count_comment'];
	$post_hit			= $original['post_hit'];
}


// 쿼리문 만들기


$query = "";
$query .= " `post_title` = '{$post_title}'";
$query .= ",`post_content` = '{$post_content}'";
$query .= ",`mem_nickname` = '{$mem_nickname}'";
$query .= ",`mem_password` = '{$mem_password}'";
$query .= ",`post_ip` = '{$post_ip}'";
$query .= ",`post_regtime` = '{$post_regtime}'";
$query .= ",`post_is_secret` = '{$post_is_secret}'";
$query .= ",`post_status` = '{$post_status}'";
$query .= ",`post_count_comment` = '{$post_count_comment}'";
$query .= ",`post_hit` = '{$post_hit}'";

// 수정일경우
if($post_idx) {	
	$query = "UPDATE `tbl_board_post` SET " . $query . " WHERE post_idx = '{$post_idx}'";
}
// 신규일경우
else {
	$query = "INSERT INTO `tbl_board_post` SET " . $query;	
}

// 쿼리 실행
$dbcon->query($query);


$result_msg = "글 수정을 완료하였습니다.";
// 신규 생성일경우
if(empty($post_idx))
{
	$result_msg = "새로운 글을 등록하였습니다.";
	// 신규생성일경우 post_idx 값이 비어있으므로 실행한 쿼리에서 생성된 게시글 PK를 가져온다. 
	$post_idx = $dbcon->insert_id;	
}

// 이글을 작성한사람은 비밀번호를 입력하지 않아도 되도록 세션을 생성해둔다.
$_SESSION['post_check_'.$post_idx] = time();

alert($result_msg, BASEURL."/read.php?idx=".$post_idx);
exit;

 

[catlist id=76 numberposts=14 conditional_title=”PHP 질문과 답변 게시판 만들기” orderby=date]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.