글을 쓰다가 "쓰기" 버튼을 눌렀는데 alert 날리면서 모든 글이 휘리릭?
돌아 버리죠. ㅎㅎ
이 문제는 write_update.php에서 alert를 날리기 때문 입니다.
alert를 하면 java script로 history -1을 하게 되구요.
이 방법을 해결 하기 위한 편법으로 쿠키나 session 정의 변경을 하는데 모두 보안 문제 있구요.
그래서, write_update.php의 앞부분에 무조건 값을 저장하는 코드를 넣어두고,
다시 write를 하려고 하면, 저장된 값을 읽어서를 넣어줍니다.
naver나 다음의 임시저장 기능이 편할거 같은데, 실제로 저도 거의 안쓰는데
지금 안쓰면 나중에 별로 쓸 생각이 안나니까요. ㅎㅎ
이 기능은
쓰다가 웹브라우져가 죽어서 날라가는 것은 천재지변이라 모른척 하고,
첨부파일이나 link 같은거 날아가는 것도 모른척 합니다.
딱, 제목과 글 내용만 그대로 복구 됩니다.
config.php에 테이블을 등록 합니다.
$g4[tempsave_table] = $g4['table_prefix'] . "tempsave"; // 임시저장 테이블
phpmyadmin으로 db를 생성합니다.
CREATE TABLE IF NOT EXISTS `g4_tempsave` (
`tmp_id` int(11) NOT NULL AUTO_INCREMENT,
`mb_id` varchar(255) NOT NULL,
`bo_table` varchar(255) NOT NULL,
`wr_id` int(11) NOT NULL,
`wr_subject` varchar(255) NOT NULL,
`wr_content` text NOT NULL,
`wr_datetime` datetime NOT NULL,
`ip_addr` varchar(255) NOT NULL,
`wr_session` varchar(255) NOT NULL,
PRIMARY KEY (`tmp_id`),
KEY `mb_id` (`mb_id`),
KEY `wr_session` (`wr_session`),
KEY `bo_table` (`bo_table`)
)
`tmp_id` int(11) NOT NULL AUTO_INCREMENT,
`mb_id` varchar(255) NOT NULL,
`bo_table` varchar(255) NOT NULL,
`wr_id` int(11) NOT NULL,
`wr_subject` varchar(255) NOT NULL,
`wr_content` text NOT NULL,
`wr_datetime` datetime NOT NULL,
`ip_addr` varchar(255) NOT NULL,
`wr_session` varchar(255) NOT NULL,
PRIMARY KEY (`tmp_id`),
KEY `mb_id` (`mb_id`),
KEY `wr_session` (`wr_session`),
KEY `bo_table` (`bo_table`)
)
write.php에서 write.skin.php 올리기 전에 아래 코드를 추가 합니다.
// 불당팩 - 임시저장, session을 만들어준다.
if ($_SESSION[ss_tempsave] == "") {
set_session("ss_tempsave", $g4[server_time]);
} else {
$ss_tempsave = $_SESSION[ss_tempsave];
// 여유 있게, 5분 이내의 세션만 유효한걸루 인정한다. 실제로는 1분 이내만 인정하는게 맞는거다. 가끔 웹 브라우저가 죽기도 하니 5분 주는거다.
$new_time = date("Y-m-d H:i:s", $g4['server_time'] - 60*5 - 1);
$sql = " select * from $g4[tempsave_table] where wr_session = '$ss_tempsave' and bo_table='$bo_table' and wr_id='$wr_id' and wr_datetime > '$new_time' order by tmp_id desc limit 1";
$wr = sql_fetch($sql);
if ($wr) {
$content = get_text(trim($wr[wr_content]), 0);
$subject = get_text(trim($wr[wr_subject]), 0);
}
}
if ($_SESSION[ss_tempsave] == "") {
set_session("ss_tempsave", $g4[server_time]);
} else {
$ss_tempsave = $_SESSION[ss_tempsave];
// 여유 있게, 5분 이내의 세션만 유효한걸루 인정한다. 실제로는 1분 이내만 인정하는게 맞는거다. 가끔 웹 브라우저가 죽기도 하니 5분 주는거다.
$new_time = date("Y-m-d H:i:s", $g4['server_time'] - 60*5 - 1);
$sql = " select * from $g4[tempsave_table] where wr_session = '$ss_tempsave' and bo_table='$bo_table' and wr_id='$wr_id' and wr_datetime > '$new_time' order by tmp_id desc limit 1";
$wr = sql_fetch($sql);
if ($wr) {
$content = get_text(trim($wr[wr_content]), 0);
$subject = get_text(trim($wr[wr_subject]), 0);
}
}
bbs/write_update.php의 앞에 아래 코드를 추가하고
// 불당팩 - 이전에 저장된 것은 싹~ 지우고, 임시저장 DB에 저장을 해줍니다.
$ss_tempsave = $_SESSION[ss_tempsave];
$sql = " delete from $g4[tempsave_table] where wr_session='$ss_tempsave' ";
sql_query($sql);
$sql = " delete from $g4[tempsave_table] where bo_table='$bo_table' and mb_id = '$member[mb_id]' ";
sql_query($sql);
$sql = " insert into $g4[tempsave_table]
set
bo_table='$bo_table',
wr_id='$wr_id',
wr_subject='$wr_subject',
wr_content='$wr_content',
mb_id='$member[mb_id]',
wr_datetime='$g4[time_ymdhis]',
ip_addr = '$remote_addr',
wr_session='$ss_tempsave' ";
sql_query($sql);
$ss_tempsave = $_SESSION[ss_tempsave];
$sql = " delete from $g4[tempsave_table] where wr_session='$ss_tempsave' ";
sql_query($sql);
$sql = " delete from $g4[tempsave_table] where bo_table='$bo_table' and mb_id = '$member[mb_id]' ";
sql_query($sql);
$sql = " insert into $g4[tempsave_table]
set
bo_table='$bo_table',
wr_id='$wr_id',
wr_subject='$wr_subject',
wr_content='$wr_content',
mb_id='$member[mb_id]',
wr_datetime='$g4[time_ymdhis]',
ip_addr = '$remote_addr',
wr_session='$ss_tempsave' ";
sql_query($sql);
// 임시 DB 복구를 위해서 돌아갈 url을 정의해 줍니다.
if ($w == "r")
$goto_url = "$g4[bbs_path]/write.php?bo_table=$bo_table&w=r&wr_id=$wr_id";
else if ($w == "u")
$goto_url = "$g4[bbs_path]/write.php?bo_table=$bo_table&w=u&wr_id=$wr_id";
else
$goto_url = "$g4[bbs_path]/write.php?bo_table=$bo_table";
if ($w == "r")
$goto_url = "$g4[bbs_path]/write.php?bo_table=$bo_table&w=r&wr_id=$wr_id";
else if ($w == "u")
$goto_url = "$g4[bbs_path]/write.php?bo_table=$bo_table&w=u&wr_id=$wr_id";
else
$goto_url = "$g4[bbs_path]/write.php?bo_table=$bo_table";
bbs/write_update.php의 마지막에 아래 코드를 추가 합니다.
// 불당팩 - 임시저장된 것을 지워주고 세션도 날립니다.
$sql = " delete from $g4[tempsave_table] where wr_session = '$ss_tempsave' ";
sql_query($sql);
set_session("ss_tempsave", "");
$sql = " delete from $g4[tempsave_table] where wr_session = '$ss_tempsave' ";
sql_query($sql);
set_session("ss_tempsave", "");
마지막으로 bbs/write_update.php의 alert 함수중에, 두번째 인자가 없는 것에 $goto_url을 넣어줍니다.
단, 아래의 alert는 수정하면 안됩니다. 파일 용량이 넘치기 때문에 인자가 전달 안되서 goto_url 못 씁니다.
if (empty($_POST))
alert("파일 또는 글내용의 크기가 서버에서 설정한 값을 넘어 오류가 발생하였습니다.\\n\\npost_max_size=".ini_get('post_max_size')." , upload_max_filesize=$upload_max_filesize\\n\\n게시판관리자 또는 서버관리자에게 문의 바랍니다.");
alert("파일 또는 글내용의 크기가 서버에서 설정한 값을 넘어 오류가 발생하였습니다.\\n\\npost_max_size=".ini_get('post_max_size')." , upload_max_filesize=$upload_max_filesize\\n\\n게시판관리자 또는 서버관리자에게 문의 바랍니다.");
예)
alert("비밀글 미사용 게시판 이므로 비밀글로 등록할 수 없습니다.", $goto_url);
참 쉽죠??? ^^
- opencode.co.kr -
Ʈ 5д ÷ ϰ µ
ʿҰ ~~!! ҽ ^^
Ҵ ϰ ... ҽ ϱ ïƼ.
, redis. װ ϼ.
200% ̴ϴ.