기존에 쿠키를 썼던걸 세션으로 바꿨습니다.
모양을 조금 바꿨습니다. 아래 그림처럼.

mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.
((-------IMAGE-------))
by Anna 안나 2008. 5. 26. 17:59
처음 들어갔을때, (손님_0000) 식으로 표시되도록 했습니다.
숫자는 아이피 첫자리와 끝자리.

그리고 글을 올려야 cookie[name]이 만들어지고,
나가고 들어올때 cookie[name]이 있어야,
나가고 들어올때 표시되도록 했습니다.

.....
mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.

((-------IMAGE-------))
by Anna 안나 2008. 5. 26. 17:58
채팅창 모양을 좀 바꿔봤습니다.
보통 채팅프로그램하고 비슷하게 해봤습니다.
예제를 보면,, 어떻게 달라졌는지 알수 있습니다.
FF와 IE에서 테스트했습니다.


mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.
by Anna 안나 2008. 5. 26. 17:58
사용자님의 요청으로,
채팅방 나갈때, 나간거 표시되도록 했는데,
더불어서 들어올때도 표시되도록 했습니다.
(단, 닉네임이 있는 경우에만)

-- 테스트해보니까, FF에서는 나간거 표시가 안되는군요..
onunload 이벤트에 함수를 걸었는데,,실행이 안됩니다.
해결방법은 더 찾아봐야겠습니다.
IE에서는 제대로 됩니다.


mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.
by Anna 안나 2008. 5. 26. 17:57
외관은 바뀐게 없습니다. 내부파일처리 방식이 많이 바뀌었습니다.

1. 트래픽을 많이 잡아먹던 방문자목록 확인-하는걸 3초 간격으로 늘렸습니다.
2. 새글 올라왔는지 확인 하는 부분을 새로 추가해서, 0.7초마다 확인하도록 했고,
- - - 데이타파일의 filesize로 새글 올라왔는지 확인하도록 해서,
- - - 기존의 filesize값하고 다르면, 새글 올라온걸로 판단하게 했습니다.
3. 파일 저장 장소를 바꿨습니다..
4. 등등의 파일경로가 바뀌었습니다.
5. 빈 채팅방 삭제 인터벌간격을 줄번호 5에 달았습니다.($dellinterval = 5;)
- - - 최소한의 간격은 방문자확인이 3초마다 이뤄지는만큼 디폴트대로 하시고,
- - - 길게는 뭐 아무렇게나 줘도 됩니다.. (10시간 = 36000)

0.7초 간격으로 새글확인이 494줄에,
setTimeout('go()', 700); 이렇게 되어 있는데,
더 짧게 할라면 여기서 700을 500으로 하거나,, 길게 할라면,, 뭐 1000으로 하거나,,
하면 됩니다.

------

첨에 이게.. ajax로 데이타를 읽어올때, php를 안거치고,
직접 데이타파일을 접속해서 읽어오도록 하는 방식이었다가,,
수정된거라서,,
누적된 관행에서 비롯된 비효율적인 부분이 있던걸,, 이번에 깔끔히 수정했습니다.
-ajax가 읽어오는 대상이 php파싱을 거친 것입니다.
-그래서, 본문의 경우 데이타를 요청할때, 이미 출력된 줄번호를 보내서
-그 줄번호 이후의 것만 출력한다든지.. 하는 식으로 하고 있습니다.

------

트래픽-- 보통 계산이 어떻게 되는지 모르겠습니다.
패킷캡춰하는 프로그램으로 보면,, 대개 헤더가 굉장히 깁니다.
그 헤더가 트래픽계산에 다 포함되는건지.. 안 포함되는건지에 따라서
소모하는 트래픽이 엄청나게 차이 날겁니다.

0.7초마다 새글확인을 하도록 했는데, 새글이 없으면, 받아오는 값이 없습니다.
이 경우 헤더정보가 트래픽계산에 포함되지 않는다면, 트래픽은 제로입니다.
하여튼 요거 잘 모르겠네요..
by Anna 안나 2008. 5. 26. 17:57
사용자님의 요청으로 몇몇가지 수정했습니다.
1. 글쓰는 부분- 파일버튼을 누르면 exit 버튼이 있습니다.
- - - 누르면 채팅방을 나갑니다.

2. 채팅방id에 _- 가능하게 했습니다.

3. 채팅방목록에서 채팅방id길이가 길어도, 두줄로 나오거나 레이아웃이 깨지지 않게 했습니다.
by Anna 안나 2008. 5. 26. 17:56
1. 본문 10KB에서, 기존꺼 백업하고 새로 갈아타는데,,,
연결이 매끄럽지 않던 문제가 있었습니다.
- - - 매끄럽게 연결되도록 수정했습니다.
- - - 채팅창을 리프레시하지 않았을때는 기존의 채팅내용에 그대로 이어지고,
- - - 리프레시하거나 새로 들어왔을때는 백업이후의 내용만 보여지게 됩니다.
- - - 이전꺼는 링크로, 열어볼수 있습니다.
- - - 백업한 채팅창 열어볼때, 이미지링크 보여지지 않던거 수정했습니다.

2. 트래픽 많이 차지하는 방문자목록에서,, 채팅기록링크소스를
- - - php에서 소스를 만들어 가져오던 방식에서
- - - 자바스크립트로 브라우저에서 만들도록 바꿨습니다.
- - - 하여튼,, 채팅백업이 있을때,, 그거 소스길이만큼
- - - 읽어올때, 트랙픽이 줄은겁니다..
- - - 이게 작질 않은게, 1초마다 읽어오고, 방문자수만큼 또 그만큼 늘으니까,,
- - - - - - - - -

by Anna 안나 2008. 5. 26. 17:56
1. 중복닉네임 사용할수 없도록
- - - 이미 있던건데,, 어떤 수치가 약간 바뀌면서-따라 바뀌질 않아서
- - - 먹통으로 되어 있던거 바로 잡았습니다.

2. 금지 닉네임 설정 하도록
- - - 사용자분의 요청으로 금지닉네임을 운영자가 설정할수 있도록 했습니다.
- - - 예를들어, '운영'이 금지어면,, 운영자, 운영인등,, 운영이 들어가는 필명은 사용할수 없습니다.
- - - 단 운영자(계정주인)는 제외됩니다.

3. 본문 10KB에서, 기존꺼 백업하고 새로 갈아타는데,
- - - 처리에 에러가 있었습니다.
- - - 하여튼 대충 수습했습니다.

((-------IMAGE-------))

mysql 안쓰고, php파일 하나로 돌아갑니다.
압축풀어 폴더채로 업로드하고, chat폴더권한 777주고(설치끝),
index.php에 접속해서 사용하면 됩니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

채팅 소스 60 (mysql 안씀, ajax)  (0) 2008.05.26
채팅 소스 59 (mysql 안씀, ajax)  (0) 2008.05.26
채팅 소스 58 (mysql 안씀, ajax)  (0) 2008.05.26
채팅 소스 57 (mysql 안씀, ajax)  (1) 2008.05.26
채팅 소스 56 (mysql 안씀, ajax)  (0) 2008.05.26
간단한 채팅7 -> 8 ->9 ->10  (0) 2008.05.26
간단한 채팅소스 6  (0) 2008.05.26
간단한 채팅소스5  (1) 2008.05.26
간단한 채팅소스4  (0) 2008.05.26
간단한 채팅소스3  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:55
예제링크를 클릭해보면 확인되겠지만,
id를 가지고, 채팅방을 구성합니다. 생성하려는 id가 이미 있으면,
그 방에 들어갈지, 아님 다른걸 구성할지 confirm을 통해 물어봅니다.
글씨에 색깔이 들어갑니다. 색깔은 계속 기억됩니다.
-----
한글 닉일때, 문제가 발생했었는데, 무식한 방법으로 해결했습니다.
여하튼 더이상 문제는 없습니다.
=======================================================

다운로드링크: http://www2.ssam.biz/blog/file/chat.rar
예제 링크 : http://www2.ssam.biz/chat/

접속자처리..로 이번엔 완벽하게 수정한 버전이다.
$t = date("s");
$t = $t / 3;
if($t % 3 < 1) {
$guest1 = $db."_guest1";
$guest2 = $db."_guest2";
$guest3 = $db."_guest3";
} else if($t % 3 > 1) {
$guest1 = $db."_guest3";
$guest2 = $db."_guest1";
$guest3 = $db."_guest2";
} else {
$guest1 = $db."_guest2";
$guest2 = $db."_guest3";
$guest3 = $db."_guest1";
}

우선 현재시간의 초를 구해서, 그걸 3로 나누고, 다시 3으로 나눠서,
매 3초마다, $guest1,$guest2,$guest3 의 파일이 바뀌도록 한다.
두개로 했더니, (하나는 나타내고, 하나는 기록하고..)
문제가 뭐냐면, 끊어진 접속자를 지워낼수가 없더란 것이다.
fopen(파일,"w") 이걸로 해야, 사라진 접속자를 지워낼수 있는데,
이걸로 했다간 누가 접속할때마다, 기존에 저장된 내용도 지워지니까,, 전혀 무의미하고,

fopen(파일,"a") 이걸로 하자니, 계속 기록이 누적될뿐,
오래된 기록을 지워내질 못하고,,

해서 3편제로 나눠서,
$guest3 이거는 누가 접속하든 계속 삭제하고,
$guest2 이거는 기록하고,
$guest1 이거는 나타내고 하는 방식으로..
.. 3초마다, 그 이름에 해당하는 파일이 순환되도록 해서,
가장 오래된 기록도 6초 후엔 삭제되도록.. 했다.

이 방식은 이전꺼에도 썼던건데,
시간배분을 잘못했다..
6초마다 바뀌도록 한다고 했는데,, 뭔가 큰 실수가 있었다.

$name = ($_COOKIE[name]) ? $_COOKIE[name] : $_SERVER[REMOTE_ADDR];
$name = $name."<br>";
$fm = fopen($guest1,"a+");
$fs = fopen($guest2,"a+");
$memo = fgets($fm);
$meme = fgets($fs);
if(!strchr($memo, $name)) fputs($fm, $name);
if(!strchr($meme, $name)) fputs($fs, $name);
fclose($fm);
fclose($fs);
@unlink($guest3);
$memo = preg_replace('`([0-9]+)\.[0-9]+\.[0-9]+\.([0-9]+)`i','$1.**.**.$2',$memo);
echo $memo;

역시 압축파일 소스의 일부분인데,
쿠키(글올릴때 닉이 저장됨)가 있으면 쿠키로 없으면, ip로
현재 접속자정보를 나타내는 첫번째템프파일, 기록전담하는 두번째템프파일에 기록한다.
동일한 이름이 있는지 검색해서, 없으면,.
그리고 세번째템프파일을 삭제한다.
ip는 나타낼때 중간부분을 감춰서 나타낸다.

nzeo.com에서 질문했다가, 직접 테스트해서 알아낸 방법론을 사용했는데,
$fm = fopen($guest1,"a+"); 이거다.
기존에는 $fm = fopen($guest1,"a");
이렇게 해서 쓰기만 되는걸로 했는데,
$fm = fopen($guest1,"a+"); 이렇게 하면 읽기도 가능하다.
단 읽는게 먼저, 쓰는게 나중에 나와야 한다.

그 덕에.. 내용을 우선 읽어서,
현재 기록할려고 하는거하고, 중복되는게 있는지 검색한 후에
없으면 기록하고, 아니면 마는 방식으로 할수가 있다.
위에서처럼...

위에서는 기록을 첫번째템프,두번째템프에 모두 하는데,
변동사항의 갱신을 빠르게 하기 위해서다.
그래도 첫번째템프에는 접속이 끊어진 사람의 기록이 남아있을수 있다.
(3초 전부터 기록된거라)
두번째템프는 그 시간에 새로 생성된 것이라,, 기록이 끊어진 사람의 정보는 없다.
첫번째템프의 낡은 기록은 3초뒤에 그 파일이 세번째템프가 되어, 삭제되면서 없어진다.

-----------
파일은 맨위에 링크한 압축파일이다.
전부 xmlHTTP로 페이지를 읽어오는 방식이라서, 리프레쉬는 없다.
xmlHTTP로 하느라고,, (ajax라고 그러던가,, 그냥 대충 쓰기만 하지.. 이름을 잘 모른다.)
인코딩이 UTF-8이다. euc-kr 이면,, 뭐 좀 희한한 처리를 해줘야 한다. (그러느라고 부하도 늘고..)

4번째줄에
$db = date("Ym"); // 변경가능
이렇게 돼있다. 디비이름을 그냥 "연월"로 했다.
이건 누가 쓸란지 몰라도, 쓰게 될때, 각자 알아서 수정하면 된다.
날짜별로 바뀌게 하려면 date("Ymd"); 로 하면 될테고...

프레임 세조각으로 구성되어 있다,
왼쪽에 접속자, 우측 넓게 채팅메인화면, 하단에 글쓰는 폼.

==========
접속자 정보 5초에서 3초로 바꾸고,
기존에 저장된 파일을 php로 짜맞춰서 출력된 내용을 ajax로 읽어오던 방식에서,
파일자체를 ajax로 읽어다가, 자바스크립트로 table같은거 짜넣는 방식으로 바꿨다.
자바스크립트로 클라이언트에서 처리하도록 했지만, 그정도가 큰 부하를 줄거같진 않고,
트래픽을 많이 줄이는 잇점이 더 클거 같기 때문이다.

하여튼,, 큰 변화가 있었다.
채팅본문이 출력되는 쪽과, 접속자정보가 나오는 쪽은
리프레시를 전혀 안하게 되었다는 것.
글을 입력하는 쪽도, header("location:?v=r"); 이걸로 처리해서,
언듯 보면, 전혀 refresh 한거 같지 않다..

압축파일은 다시 업로드했다.

=============
중요한 실수가 있었다.
$t % 3 했을때의 값이, 소수점 아래인줄 알고,, 실수를 했는데,
바로 잡았다.










현재시간..
칼라선택 추가함...
-------
자바스크립트로 셀렉트박스에서 특정항목을
선택되도록 하는게, 어려울줄 알았더니..
의외로 쉽다.
그냥
셀렉트박스 name=fcolor였는데,
document.all.fcolor.value='뭐'
이렇게 하니까, 그냥 선택된다.
그냥 input의 value를 스크립트로 만드는거하곤,
좀 다를줄 알았더니, (뭔가 좀 동적인 느낌이라)
다를게 없다..

왜냐면, 한번 어떤 색으로 글을 올리고,
다시 반복해서 선택하지 않고도,
그 색이 자동으로 선택되어 있어야,, 안귀찮으니까.
그래서,, 찾아본건데,, 의외로 간단해서,,

뭐 그렇다는 얘기다.

우선.. 수정했습니다.
UTF-8로 인코딩되서 생성된 파일을..
ajax로 읽어와서,, 자릿수로 이름과 날짜등을 구분해서 출력하는데,
....
이름에 한글이 나올때,
ajax는 한글자를 하나로 자르는군요.
php에서는 두개로 인식하는데,,....

그래서 계속.. 안맞았던 겁니다.
ajax의 문제라기 보다, 자바스크립트.
substr(0, 20) 이렇게 했는데, 자바스크립트는 한글 1글자를 1칸으로 인식하니까,
문제가 되었던 겁니다. 지금은 아예 구분자를 넣어서,,
splt을 써서 이름하고 나머지하고 구분하고,, 뭐 그렇게 하고 있습니다.
따라서,
안정적으로 작동합니다.. 파일은 수정해서 업로드 했구요.
by Anna 안나 2008. 5. 26. 17:53
이전 버전에서 확 달라졌는데,
new ActiveXObject("Microsoft.XMLHTTP");
이름을 뭐라 그러는지 모르겠는데, 여하튼.. 이거(이하 xmlhttp로 지칭함).
이걸 사용해서, refresh(새로고침)되는걸 없앴다.

예제는 http://www2.ssam.biz/chat/
소스를 여기다 나열하느니(그거,,여러가지.. 거시기해서)
걍 압축파일을 링크한다. http://www2.ssam.biz/blog/file/chat.rar
압축풀면 chat 폴더안에 index.php 파일이 들어있는데,
폴더이름,파일이름 다 바꿔도 된다.

다만,, 4번째 줄에
$db = date("Ym"); // 변경가능
이렇게 돼있는데,,, 채팅데이타파일은 "연월" 그니까 200707 로 만든다는거다.
이거는 각자 알아서,.. 경로는 맞춰주고,,,
지금은 index.php 파일과 데이타파일이 같은 chat 폴더안에 있는걸로 해서, 저렇게 돼있는데,
다르게 한다면, 경로를 맞춰주면 된다.
그리고, chat 폴더는 777권한을 줘야 한다. 그래야 파일을 수정,삭제해가면서 데이타를 저장하니까.
그리고 여기엔 .htaccess 파일로 외부접근을 막으면 안된다.

xmlhttp 라는게 클라이언트(서버가 아니고,각자의 컴터)에서 실행되는건데,
외부접근을 막으면, 파일을 읽어오질 못하게 된다.

한참 애를 먹인건,, 방문자 리스트다.
결국 임시파일 세개를 만들어서,
어찌저찌, 하나 삭제하고, 하나 만들고, 하나 보이고.. 하도록 해서 해결했다.
간격은 6초.

-----
외관은 이전꺼에서 변한게 없다.
(별로 좋지 않다는 뜻)

xmlhttp를 써도, 실시간으로 새글을 확인할라면,
IE에서 인터넷옵션-설정-페이지열때마다 새로 확인 되도록 해야 한다.
안그러면,, 새글 확인이 안된다.






아. 그리고 이거 인코딩이 UTF-8입니다.
xmlhttp 가 읽을때, UTF-8이라야,,
처리가 간단해지니까..

대대적인 수정(?) -접속자처리와 관계된- 이 있었다.
접속자 갱신은 5초.. 5초안에 접속자는 뜨고,
끊어진 사람은 사라진다.

.......
by Anna 안나 2008. 5. 26. 17:52
자세한 얘기는 아래(http://www2.ssam.biz/blog/?tb=1&no=160)에서....

또 대폭적인 수정이 있었는데,
닉네임을 10자로 짤라 맞춰서,,
이름, 날짜, 본문의 구분을 전처럼 '@@@@@' 이걸로 구분하지 않고, 자리수로 하도록 바꿨다.
닉네임은 10자이상 입력하지 못하도록 되어있다. - 10자 이하는 무방..

그리고, 실시간 접속자 칸을 추가했다.
10초마다 갱신되며,, 채팅창에 글을 올려서, 닉네임이 있는 사람은 닉네임으로,
없는 사람은 ip(중간에 생략하고)로 접속자를 나타낸다.

-- 소스 셋째줄에
$db = "./777/".date("Ymd"); // 변경가능
여기서 777이란 디렉토리를 만들어주던지, 다른이름의 디렉토리로 하던지..
하여튼 그 디렉토리의 권한을 777(읽고,쓰고,수정하고)을 준다.
그 외에 따로 수정해야 하는 것 없음 ---

예제는http://www2.ssam.biz/chat5.php

<?
ob_start();
$db = "./777/".date("Ymd"); // 변경가능
$last = $db."_last";
$cnt = $db."_cnt";
$time = time();
?>
<center align="center">
<?
if($_POST[name] && $_POST[content]){
$memo = "";
$date = date("H:i:s");
if(!$_COOKIE[name]) {
setcookie("name", $_POST[name], $time + 86400);
$cmemo = str_pad($_SERVER[REMOTE_ADDR], 15).str_pad($_POST[name], 20).$time."\r\n";
$fp = fopen($cnt,"a");
fputs($fp,$cmemo);
fclose($fp);
$memo = " ".$date."<font color=blue>".$_POST[name]."</font>님이 입장하셨습니다.\r\n";
} else if($_COOKIE[name] != $_POST[name]) {
$memo = " ".$date."<font color=blue>".$_COOKIE[name]."</font>님이 닉네임을 <font color=blue>".$_POST[name]."</font>으로 바꿨습니다.\r\n";
setcookie("name");
setcookie("name", $_POST[name], $time + 86400);
}
$_POST[content] = preg_replace('`[\r\n]+`i', '', nl2br(stripslashes($_POST[content])));
$memo .= str_pad($_POST[name], 20).$date.$_POST[content]."\r\n";
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
$fp = fopen($last,"w");
fputs($fp,$time);
fclose($fp);
?>
<script>
window.open("?v=b&t=<?=$time?>","cbody");
location.replace("?v=w");
</script>
<?
} else if($_GET[v]=="w") {
?>
<form method="post" action="?">
<table border=5 cellspacing=4 cellpadding=4 width=750>
<col width=70><col>
<tr><td><input type="text" name="name" maxlength="10" style="width:70" value="<?=$_COOKIE[name]?>"></td>
<td><input type="text" name="content" style="width:560;height:20;font-size:9pt;overflow-y:auto">&nbsp;<input type="submit" value="쓰기"></td>
</tr></table>
</form>
<?
} else if($_GET[v]=="b") {
?>
<table border=5 cellspacing=2 cellpadding=4 width=90 style='position:absolute;top:0;left:10'>
<tr><td>
<?
if(file_exists($cnt)){
$fp = fopen($cnt,"r");
$memo = fgets($fp);
$name = substr($memo, 15, 20);
$name = trim($name);
if($name != ""){
echo $name."<br>";
} else {
$name = substr($memo, 0, 15);
$name = explode('.',$name);
$name = $name[0].".*.*.".$name[3];
echo $name."<br>";
}
}
?>
</td></tr></table>
<table border=5 cellspacing=2 cellpadding=4 width=750>
<col width=70><col><col width=45>
<?
if(file_exists($db)){
$fp = fopen($db,"r");
$i = 1;
while(!feof($fp)){
$memo = fgets($fp);
$name = substr($memo, 0, 20);
$date = substr($memo, 20, 8);
$content = substr($memo, 28);
if($name){
?>
<tr><td><?=$name?></td><td><?=$content?></td><td><?=$date?></td></tr>
<?
$i++;
}
}
fclose($fp);
}
?>
<tr><td></td><td style='display:none'><a name="rrr">&nbsp;</a></td></tr>
</table>
<p>
<script>
function go(){
window.open("?v=t&t=<?=$_GET[t]?>","tim");
}
setTimeout("go()", 2000);
function gg(){
window.open("?v=r&<?=$_GET[t]?>","cnt");
setTimeout("gg()", 10000);
}
setTimeout("gg()", 10000);
</script>
<?
} else if($_GET[v]=="t") {
$fp = fopen($last,"r");
$lastt = fread($fp,10);
fclose($fp);
?>
<script>
<?
if($lastt > $_GET[t]){
?>
window.open("?v=b&t=<?=$lastt?>","cbody");
<?
} else {
?>
setTimeout("location.reload();", 2000);
<?
}
?>
</script>
<?
} else if($_GET[v]=="r") {
$tmp = $cnt."_tmp";
if(file_exists($tmp)) rename($tmp,$cnt);
if($_COOKIE[name]) $cmemo = str_pad($_SERVER[REMOTE_ADDR], 15).str_pad($_COOKIE[name], 20).$time."\r\n";
else $cmemo = str_pad($_SERVER[REMOTE_ADDR], 15)." ".$time."\r\n";
$fp = fopen($tmp,"a");
fputs($fp,$cmemo);
fclose($fp);
?>
<script>
window.open("?v=b&t=<?=$_GET[t]?>","cbody");
window.open("","tim");
</script>
<?
} else {
?>
<html><head><title>[chat]</title></head>
<frameset rows="*,80, 10, 0" frameborder="0" border="0" framespacing="0" onload="return true;" onunload="return true;">
<frame src="?v=b#rrr" name="cbody" target="tim" marginwidth="0" marginheight="0" scrolling="auto" noresize>
<frame src="?v=w" target="cbody" marginwidth="0" marginheight="0" scrolling="no" noresize>
<frame src="" name="tim" target="cbody" marginwidth="0" marginheight="0" scrolling="no" noresize>
<frame src="" name="cnt" marginwidth="0" marginheight="0" scrolling="no" noresize>
</frameset>
</html>
<?
}
?>
</center>
<style>
* {font-size:9pt}
a {color:black}
a:link {text-decoration:none}
a:visited {text-decoration:none}
a:hover {text-decoration:underline}
table {border-width:6px; border-style: outset}
</style>

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

채팅 소스 57 (mysql 안씀, ajax)  (1) 2008.05.26
채팅 소스 56 (mysql 안씀, ajax)  (0) 2008.05.26
채팅 소스 55 (mysql 안씀, ajax) - 닉도용 방지  (0) 2008.05.26
간단한 채팅7 -> 8 ->9 ->10  (0) 2008.05.26
간단한 채팅소스 6  (0) 2008.05.26
간단한 채팅소스4  (0) 2008.05.26
간단한 채팅소스3  (0) 2008.05.26
간단한 채팅소스2  (1) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:51
자세한 얘기는 아래(http://www2.ssam.biz/blog/?tb=1&no=159)를 읽어보길 권한다.

수정사항:
새로고침하면서, 채칵채칵 소리나는걸,, 거의 없앴다.
글을 올렸을때, 두어번 채칵되고, 변동사항 있을때 채칵되고,,
그밖에 대기중에 채칵되는 소리는 없앴다.
(location.reload()를 쓰니까, 채칵되는 소리가 안난다.)

그리고 시간을 달았는데,,
시간,분,초가 화면에 출력되고,
채팅데이터가 연월일의 이름으로 저장되도록,,, 바꿨다.

그리고 검색해보니까, php로 채팅하는 소스가 여럿나왔다..
다운받아보니,, 복잡하던데,,,
아마도 그만큼 좋은거겠지..
어떤 것은 mysql 데이터베이스를 이용하는가 보던데,,
그럼 아마 서버부하가 .. 만만찮을거 같다. 그냥 지레짐작에,

이거는 그냥 파일로 저장해서, 출력하는 것이고,
그나마도 현재 출력된 상태에서 변동사항이 있을때(2초마다 검색:채칵소리없음), 새로고침하는 거라서,,,,
서버부하는 작지 않을까 싶다.

예제는 http://www2.ssam.biz/chat4.php


<?
ob_start();
$db = "./777/".date("Ymd"); // 변경가능
$last = $db."_last";
?>
<center align="center">
<?
if($_POST[name] && $_POST[content]){
$memo = "";
$time = date("H:i:s");
if(!$_COOKIE[name]) setcookie("name", $_POST[name], time() + 86400);
if($_COOKIE[name] != $_POST[name]) {
if($_COOKIE[name]) $memo = "&nbsp;@@@@@".$time."@@@@@<font color=blue>".$_COOKIE[name]."</font>님이 닉네임을 <font color=blue>".$_POST[name]."</font>으로 바꿨습니다.\r\n";
else $memo = "&nbsp;@@@@@".$time."@@@@@<font color=blue>".$_POST[name]."</font>님이 입장하셨습니다.\r\n";
setcookie("name");
setcookie("name", $_POST[name], time() + 86400);
}
$_POST[content] = preg_replace('`[\r\n]+`i', '', nl2br(stripslashes($_POST[content])));
$memo .= $_POST[name]."@@@@@".$time."@@@@@".$_POST[content]."\r\n";
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
$fp = fopen($last,"w");
fputs($fp,time());
fclose($fp);
?>
<script>
window.open("?v=r","cbody");
location.replace("?v=w");
</script>
<?
} else if($_GET[v]=="w") {
?>
<form method="post" action="chat4.php">
<table border=5 cellspacing=4 cellpadding=4 width=750>
<col width=70><col>
<tr><td><input type="text" name="name" style="width:70" value="<?=$_COOKIE[name]?>"></td>
<td><input type="text" name="content" style="width:560;height:20;font-size:9pt;overflow-y:auto">&nbsp;<input type="submit" value="쓰기"></td>
</tr></table>
</form>
<?
} else if($_GET[v]=="b") {
?>
<table border=5 cellspacing=2 cellpadding=4 width=750>
<col width=70><col><col width=45>
<?
if(file_exists($db)){
$fp = fopen($db,"r");
$i = 1;
while(!feof($fp)){
$memo = fgets($fp);
$name = strtok($memo,"@@@@@");
$time = strtok("@@@@@");
$content = strtok("@@@@@");
if($name){
?>
<tr><td><?=$name?></td><td><?=$content?></td><td><?=$time?></td></tr>
<?
$i++;
}
}
fclose($fp);
}
?>
<tr><td></td><td style='display:none'><a name="rrr">&nbsp;</a></td></tr>
</table>
<p>
<script>
function tmev(){
today=new Date();
var tm = today.getTime();
setTimeout("go('"+tm+"')", 2000);
}
function go(tm){
window.open("?v=t&t=" + tm,"tim");
}
tmev();
</script>
<?
} else if($_GET[v]=="t") {
$fp = fopen($last,"r");
$lastt = fread($fp,10);
fclose($fp);
?>
<script>
<?
if($lastt > substr($_GET[t],0,10)) {
?>
window.open("?v=r","cbody");
<?
} else {
?>
setTimeout("location.reload();", 2000);
<?
}
?>
</script>
<?
} else if($_GET[v]=="r") {
?>
<META HTTP-EQUIV=Refresh CONTENT='0; URL=?v=b#rrr'>
<?
} else {
?>
<html><head><title>[챗]</title></head>
<frameset rows="*,80, 10" frameborder="0" border="0" framespacing="0" onload="return true;" onunload="return true;">
<frame src="?v=b#rrr" name="cbody" target="tim" marginwidth="0" marginheight="0" scrolling="auto" noresize>
<frame src="?v=w" target="cbody" marginwidth="0" marginheight="0" scrolling="no" noresize>
<frame src="" name="tim" target="cbody" marginwidth="0" marginheight="0" scrolling="no" noresize>
</frameset>
</html>
<?
}
?>
</center>
<style>
* {font-size:9pt}
a {color:black}
a:link {text-decoration:none}
a:visited {text-decoration:none}
a:hover {text-decoration:underline}
table {border-width:6px; border-style: outset}
</style>

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

채팅 소스 56 (mysql 안씀, ajax)  (0) 2008.05.26
채팅 소스 55 (mysql 안씀, ajax) - 닉도용 방지  (0) 2008.05.26
간단한 채팅7 -> 8 ->9 ->10  (0) 2008.05.26
간단한 채팅소스 6  (0) 2008.05.26
간단한 채팅소스5  (1) 2008.05.26
간단한 채팅소스3  (0) 2008.05.26
간단한 채팅소스2  (1) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:50
아래 채팅소스의 업그레이드판이다.
아래(http://www2.ssam.biz/blog/?tb=1&no=158)에서는 2초마다, 글보는 면을 새로고침해서, 변동사항을 반영하게 했는데, 이게 너무.. 거시기해보이고,, 해서,
서버쪽에서 누가 글을 올리던, 그 시간만 파일로 저장했다가,
화면이 출력된 시간하고 비교해서,
화면의 시간값보다 크면, 화면을 새로고침하고, 아니면,- 누가 글 올린게 없는거니까,- 그냥 버티고,,
이걸 2초마다 체크하는 걸로 바꿨다.

그니까 전폭적인 화면의 새로고침은 없고,
2초마다 보이지 않는 프레임에 파일을 띄워서,
시간을 확인하고, 변경사항이 있으면, 글보는 메인화면을 새로고침하도록... 했다.

이렇게 해서, 전체적인 부하 -서버,클라이언트 모두-를 줄일수 있다.
변경사항이 있을때만, 새로고침하게 되니까..

예제는 http://www2.ssam.biz/chat3.php이고,
아래와 중복되는 얘기는 생략한다.

<?
ob_start();
$db = "./777/chat.dat"; // 변경가능
$last = "./777/chat_last.dat";
?>
<center align="center">
<?
if($_POST[name] && $_POST[content]){
if(!$_COOKIE[name]) setcookie("name", $_POST[name], time() + 86400);
if($_COOKIE[name] != $_POST[name]) {
$memo = "&nbsp;@@@@@<font color=blue>".$_COOKIE[name]."</font>님이 필명을 <font color=blue>".$_POST[name]."</font>으로 바꿨습니다.\r\n";
setcookie("name");
setcookie("name", $_POST[name], time() + 86400);
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
}
$_POST[content] = preg_replace('`[\r\n]+`i', '', nl2br(stripslashes($_POST[content])));
$memo = $_POST[name]."@@@@@".$_POST[content]."\r\n";
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
$fp = fopen($last,"w");
fputs($fp,time());
fclose($fp);
?>
<script>
window.open("chat3.php?v=r","cbody");
location.replace("chat3.php?v=w");
</script>
<?
} else if($_GET[v]=="w") {
?>
<form method="post" action="chat3.php">
<table border=5 cellspacing=4 cellpadding=4 width=750>
<col width=70><col>
<tr><td><input type="text" name="name" style="width:70" value="<?=$_COOKIE[name]?>"></td>
<td><input type="text" name="content" style="width:560;height:20;font-size:9pt;overflow-y:auto">&nbsp;<input type="submit" value="쓰기"></td>
</tr></table>
</form>
<?
} else if($_GET[v]=="b") {
if($_GET[refresh]!="stop") {
}
?>
<table border=5 cellspacing=4 cellpadding=4 width=750>
<col width=70><col>
<?
if(file_exists($db)){
$fp = fopen($db,"r");
$i = 1;
while(!feof($fp)){
$memo = fgets($fp);
$name = strtok($memo,"@@@@@");
$content = strtok("@@@@@");
if($name){
?>
<tr><td><?=$name?></td><td><?=$content?></td></tr>
<?
$i++;
}
}
fclose($fp);
}
?>
<tr><td><input type=hidden name=tme></td><td style='display:none'><a name="rrr">&nbsp;</a></td></tr>
</table>
<p>
<script>
function tmev(){
today=new Date();
var tm = today.getTime();
document.all.tme.value = tm;
setTimeout("refre()", 2000);
}
tmev();
function refre(){
var tm = document.all.tme.value;
window.open("chat3.php?v=t&t=" + tm,"tim");
setTimeout("refre()", 2000);
}
</script>
<?
} else if($_GET[v]=="t") {
$fp = fopen($last,"r");
$lastt = fread($fp,10);
fclose($fp);
if($lastt > substr($_GET[t],0,10))
{
?>
<script>
window.open("chat3.php?v=r","cbody");
</script>
<?
}
} else if($_GET[v]=="r") {
?>
<script>
location.replace("chat3.php?v=b#rrr");
</script>
<?
} else {
?>
<html><head><title>[챗]</title></head>
<frameset rows="*,80, 10" frameborder="0" border="0" framespacing="0" onload="return true;" onunload="return true;">
<frame src="chat3.php?v=b#rrr" name="cbody" target="tim" marginwidth="0" marginheight="0" scrolling="auto" noresize>
<frame src="chat3.php?v=w" target="cbody" marginwidth="0" marginheight="0" scrolling="no" noresize>
<frame src="" name="tim" target="cbody" marginwidth="0" marginheight="0" scrolling="no" noresize>
</frameset>
</html>
<?
}
?>
</center>
<style>
* {font-size:9pt}
a {color:black}
a:link {text-decoration:none}
a:visited {text-decoration:none}
a:hover {text-decoration:underline}
table {border-width:6px; border-style: outset}
</style>




소스 맨위에
./777/chat.dat
여기서 777 은 디렉토리이름이다. 권한은 777을 준다.
그냥 경로니까, 각자 바꿔도 된다. 권한만 777주고,

chat.dat 파일은 채팅의 내용과 이름이 저장되고,
chat_last.dat 파일은 마지막 게시물의 시간이 저장된다.
물론 파일 이름은 바꿔줘도 된다.
또 파일이 없어도 된다. 없으면 새로 생성하니까.

chat3.php로 되어 있는 파일이름은
각자 수정해서 맘에 드는 이름으로 쓸수 있다.
예를들어 index.php로 쓰고자 할때는,
소스에서 chat3.php 라는 단어를 모두 삭제하면 된다.
(물론 index.php라는 단어로 바꿔줘도 되지만)

그니까 아주 모르는 사람을 위해 설명하자면,
이 소스를 긁어서 파일로 저장하고,
dat 파일이 저장될 경로 하나 생성해서, 권한777주고,
그냥 이 파일을 실행하면 되는 것이다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

채팅 소스 55 (mysql 안씀, ajax) - 닉도용 방지  (0) 2008.05.26
간단한 채팅7 -> 8 ->9 ->10  (0) 2008.05.26
간단한 채팅소스 6  (0) 2008.05.26
간단한 채팅소스5  (1) 2008.05.26
간단한 채팅소스4  (0) 2008.05.26
간단한 채팅소스2  (1) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:50
<center align="center">
<?
$db = "./777/chat.dat"; // 변경가능
if($_POST[name] && $_POST[content]){
if(!$_COOKIE[name]) setcookie("name", $_POST[name], time() + 86400);
if($_COOKIE[name] != $_POST[name]) {
$memo = "&nbsp;@@@@@<font color=blue>".$_COOKIE[name]."</font>님이 필명을 <font color=blue>".$_POST[name]."</font>으로 바꿨습니다.\r\n";
setcookie("name");
setcookie("name", $_POST[name], time() + 86400);
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
}
$_POST[content] = preg_replace('`[\r\n]+`i', '', nl2br(stripslashes($_POST[content])));
$memo = $_POST[name]."@@@@@".$_POST[content]."\r\n";
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
?>
<script>
window.open("chat2.php?v=b#rrr","main");
location.replace("chat2.php?v=w");
</script>
<?
} else if($_GET[v]=="w") {
?>
<form method="post" action="chat2.php">
<table border=5 cellspacing=4 cellpadding=4 width=750>
<col width=70><col>
<tr><td><input type="text" name="name" style="width:70" value="<?=$_COOKIE[name]?>"></td>
<td><input type="text" name="content" style="width:560;height:20;font-size:9pt;overflow-y:auto">&nbsp;<input type="submit" value="쓰기"></td>
</tr></table>
</form>
<?
} else if($_GET[v]=="b") {
if($_GET[refresh]!="stop") {
?>
<script>
function refre(){
location.replace("chat2.php?v=n");
}
setTimeout("refre()", 2000);
</script>
<?
}
?>
<table border=5 cellspacing=4 cellpadding=4 width=750>
<col width=70><col>
<?
if(file_exists($db)){
$fp = fopen($db,"r");
$i = 1;
while(!feof($fp)){
$memo = fgets($fp);
$name = strtok($memo,"@@@@@");
$content = strtok("@@@@@");
if($name){
?>
<tr><td><?=$name?></td><td><?=$content?></td></tr>
<?
$i++;
}
}
fclose($fp);
}
?>
<tr><td></td><td style='display:none'><a name="rrr">&nbsp;</a></td></tr>
</table><p>
<?
if($_GET[refresh]=="stop") echo "<a href='?v=b#rrr'>refresh</a>";
else echo "<a href='?v=b&refresh=stop#rrr'>stop</a>";
echo "<p>";
} else if($_GET[v]=="n") {
?>
<script>
location.replace("chat2.php?v=b#rrr","_self");
</script>
<?
} else {
?>
<html><head><title>[챗]</title></head>
<frameset rows="*,80" frameborder="0" border="0" framespacing="0" onload="return true;" onunload="return true;">
<frame src="chat2.php?v=b#rrr" name="main" marginwidth="0" marginheight="0" scrolling="auto" noresize>
<frame src="chat2.php?v=w" name="write" marginwidth="0" marginheight="0" scrolling="no" noresize>
</frameset>
</html>
<?
}
?>
</center>
<style>
* {font-size:9pt}
a {color:black}
a:link {text-decoration:none}
a:visited {text-decoration:none}
a:hover {text-decoration:underline}
table {border-width:6px; border-style: outset}
</style>
아래에 올린 것은 그냥 메모장이지, 채팅은 안되는 거였다.
글쓰는 곳과 읽는 곳을 프레임으로 분리하고,
읽는 곳을 계속 리프레쉬되도록 했는데,
IE를 두개 띄워놓고 보니까, 리프레쉬가 계속 됨에도, 이쪽에서 입력된게, 저쪽에서 실시간으로 확인되지 않았다.
그래서 아예, 다른 페이지로 이동을 시키고, 그 페이지에서 다시 이동시키는 방법으로 리프레쉬를 만들었다.

refresh 간격을 2초로 늘였고, IE 인터넷옵션-일반-(임시인터넷파일)-설정-(저장된페이지의 새버전확인)-자동으로
해놓아도, 새로고침이 된다. - 아마 페이지이동이 있어서,,-

글 읽는 곳 하단에 'stop' 이라고 링크 달았다.
이거 클릭하면, refresh가 멈춘다. refresh가 멈춘 페이지의 하단에는 다시 'refresh'링크를 달았다.
그걸 클릭하면 다시 refresh가 시작된다.

아래와 마찬가지로
필명을 한번 쓰면, 쿠키에 저장되어서, 자동으로 칸이 채워지고,
중간에 필명을 바꾸면, 바뀐다는 표시가 본문에 뜬다.

나머지 사안들은 아래와 같다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

간단한 채팅7 -> 8 ->9 ->10  (0) 2008.05.26
간단한 채팅소스 6  (0) 2008.05.26
간단한 채팅소스5  (1) 2008.05.26
간단한 채팅소스4  (0) 2008.05.26
간단한 채팅소스3  (0) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:49
필명은 한번 쓰면, 쿠키로 저장되서, 자동으로 기입되고,
필명을 수정하면, 수정한다고 본문에 출력되고,,,
필명하고, 내용만 저장되도록 했다.

Mysql 안쓰고, 파일로 저장했다가 읽어서 출력하는 방식이고.
예제에서는 권한 777준(읽고,쓰고,수정) 폴더에 chat.dat 이름으로 저장하고 있고,
이 파일을 삭제하면, 채팅이 초기화된다.

저장될때 필명하고 본문의 구분을 @@@@@(골뱅이 다섯개)로 했으니까,
필명과 본문에는 @@@@@(골뱅이 다섯개)가 들어 있지 않아야 한다.

소스는 아래.
<center style="width:750" align="center">
<?
$db = "./777/chat.dat"; // 변경가능
if($_POST[name] && $_POST[content]){
if(!$_COOKIE[name]) setcookie("name", $_POST[name], time() + 86400);
if($_COOKIE[name] != $_POST[name]) {
$memo = "&nbsp;@@@@@<font color=blue>".$_COOKIE[name]."</font>님이 필명을 <font color=blue>".$_POST[name]."</font>으로 바꿨습니다.\r\n";
setcookie("name");
setcookie("name", $_POST[name], time() + 86400);
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
}
$_POST[content] = preg_replace('`[\r\n]+`i', '', nl2br(stripslashes($_POST[content])));
$memo = $_POST[name]."@@@@@".$_POST[content]."\r\n";
$fp = fopen($db,"a");
fputs($fp,$memo);
fclose($fp);
header("location:#bott");
}
?>
<table border=5 cellspacing=4 cellpadding=4 width=100%>
<col width=40><col>
<?
if(file_exists($db)){
$fp = fopen($db,"r");
$i = 1;
while(!feof($fp)){
$memo = fgets($fp);
$name = strtok($memo,"@@@@@");
$content = strtok("@@@@@");
if($name){
?>
<tr><td><?=$name?></td><td><?=$content?></td></tr>
<?
$i++;
}
}
fclose($fp);
}
?>
</table>
<a name="bott"></a><p>
<form method="post" action="<?=$_SERVER[PHP_SELF]?>" align=center>
<table border=5 cellspacing=4 cellpadding=4 align=center>
<tr><td width=70><input type="text" name="name" style="width:70" value="<?=$_COOKIE[name]?>">
<td><input type="text" name="content" row='2' style="width:400;height:40;font-size:9pt;overflow-y:auto"><input type="submit" value="쓰기" /></td></tr></table>
</form>
</center>
<style>
* {font-size:9pt}
a {color:black}
a:link {text-decoration:none}
a:visited {text-decoration:none}
a:hover {text-decoration:underline}
table {border-width:6px; border-style: outset}
</style>

위의 예제에서는
chat.dat 파일이 있는 폴더, 777 안에
.htaccess 파일로 직접적인 접근 허용치 않고, 야후로 돌려버린다.

내용은
RewriteEngine On
RedirectMatch /(.*)$ http://www.yahoo.com
이 두줄. 파일이름은 ˝.htaccess˝

그러므로 chat.dat 파일을 삭제하거나, 다운로드할때는
ftp로 접속해야 한다.(웹으로는 안되고)
만들어만 보고, 테스트 해본게 아니라.. 좀 불확실하다.
채팅프로그램이 서버부하가 심하다고 하던데,
이건 mysql에 접속하는 것도 아니니...
서버부하는 그다지.. 없을걸로 생각된다.
생각해보니.. 이 소스로 채팅은 어렵겠다는 생각이 든다.
내가 입력했을때, 나한테는 재깍 뜨지만,
상대가 입력했을때, 내가 보는 화면에서는 변화가 없을테니까....

그럼 1초마다 리프레시 되도록 하면 어떨까,
글쓰는 부분은 리프레시되면 안되니까, 프레임으로 분리해서, 하단에 두고,,,

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

간단한 채팅소스 6  (0) 2008.05.26
간단한 채팅소스5  (1) 2008.05.26
간단한 채팅소스4  (0) 2008.05.26
간단한 채팅소스3  (0) 2008.05.26
간단한 채팅소스2  (1) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:48
게시판을 생성하면,
./data/아래에 게시판id의 폴더가 생성되고,,
그 안에
files/ 폴더 : 게시판업로드파일 저장경로
body.dat : 본문내용저장
list.dat : 이름,비번,제목 등을 저장
no.dat : 번호, 조회수 등을 저장
rp.dat : 덧글의 이름,비번,날짜,내용 등을 저장
rtb.dat : 받은 트랙백 저장
stb.dat : 보낸 트랙백 저장
upload.dat : 업로드 내역 저장
이게 빈파일로 만들어지고..

rss리더 게시판일때는, rss.dat( : rss 주소저장)가 덧붙고,
이후에 vote.dat( : 추천인 ip, 글번호 저장) 가 추가적으로 생기기도 합니다.

대체로 한 줄이 게시물 하나입니다.

body.dat : 한줄 통채로가 하나의 게시물 본문이고,, 다른 사항은 없습니다.

list.dat :
(20자리-글쓴이)(10자리-비번)(10자리:날짜)(15자리-ip)제목ω태그1ω태그2ω태그3ω태그4ω태그5ω|(썸네일주소 또는 rss원본주소 )

no.dat :
(6자리:글번호)(2자리:범주)(회원번호)|조회수|덧글수|엮은글수|엮인글수|추천수|답글깊이|

rp.dat :
(6자리:글번호)(1자리:덧글깊이)(20자리-글쓴이)(10자리-비번)(10자리:날짜)(15자리-ip)내용(5자리:회원번호)

rtb.dat :
(6자리:글번호)ω엮인블로그제목ω엮인글링크주소ω엮인글제목ω엮인글내용ω날짜ω아이피

stb.dat :
(6자리:글번호)ω엮은글링크주소ω엮은글제목ω날짜

upload.dat :
(6자리:글번호)파일이름(6자리:다운횟수)(6자리:파일번호)

rss.dat :
한줄 통채로가 수집할 rss주소 하나.

bno.dat :
게시판분화한 내역을 저장.
(6자리:마지막글번호)(6자리:글갯수)(6자리:총갯수)분화한기록의 이름

head.dat :
게시판 각각의 머리부분에 출력하는 내용

vote.dat :
첫줄에 년.월.일 아래줄부터
(6자리:글번호)ω추천인아이피ω

이런식으로 저장되어 있습니다.
(몇자리:뭐뭐) 는 몇자리의 숫자를 말하는 거고,
(몇자리-뭐뭐) 는 몇자리의 문자를 뜻하는 겁니다.

body.dat와, list.dat는 글번호가 없는데, 항상 no.dat와 같이 열리기 때문입니다.
(= 배치순서와 줄수가 같음)
no.dat 에서 답글깊이는 본문에 답글(덧글-코멘트아니고)이면 1,
답글의 답글이면 2, 거기에 또 답글이면 3.. 하는 답글깊이 입니다.
rp.dat에 줄끝에 다섯자리 회원번호가 있습니다.. 답글쓴사람이 회원일때, 찾기쉬우라고.. 해둔 것이고,
다섯자리로 둔 것은 회원의 Max를 99999명으로 한정하고 있는 것입니다.
회원이 10만명 이상이면 게시판 소스 바꿔야 합니다.

여기까지가 ./data/게시판id/ 경로내의 데이타파일 구조에 대한 설명이었습니다.

./data/ 경로의 파일은 아래와 같습니다.
./data/.htaccess : /data/ 경로의 외부접근을 막는 파일
./data/boards.dat : 생성한 게시판내역
./data/member.dat : 회원 목록
./data/memo.dat : 쪽지저장
./data/setting.dat : 제목 & include 설정 내용저장
./data/head : 제목 & include 설정에서 상단내용추가 저장
./data/tail : 제목 & include 설정에서 하단내용추가 저장

./data/boards.dat :
(10자리-게시판id)(6자리:최근글번호)(6자리:글갯수)(1자리:목록권한)(1자리:읽기권한)(1자리:쓰기권한)(1자리:덧글권한)(1자리-게시판형태)(1자리:글제목에html허용/비허용)(1자리:미리보기)(1자리:rss출력)(1자리:하단목록)(게시판이름)|넓이-번호|넓이-분류|넓이-제목|넓이-이름|넓이-날짜|넓이-조회|넓이-추천|(공지글목록-번호^번호^)|게시판관리자지정|업로드파일번호끝|ω범주1ω범주2ω.......ω

./data/member.dat :
(10자리-회원id)(10자리-회원비밀번호)|(1자리:회원레벨)|회원닉네임|회원메일주소|쓴글수|덧글수|(5자리:회원번호)

./data/memo.dat :
(1자리:쪽지확인여부)(1자리:받은이 삭제여부)(1자리:보낸이 삭제여부)ω받은이 회원번호ωω보낸이 회원번호ω(10자리:날짜)ω보낸이 닉네임(아이디)ω쪽지내용

회원에게 제공되는 스크랩북은 ./data/_scrap/회원번호 파일에 저장됩니다.
여기 구조는 : 게시판idω게시물번호ω스크랩날짜ω게시물제목
입니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

간단한 채팅소스5  (1) 2008.05.26
간단한 채팅소스4  (0) 2008.05.26
간단한 채팅소스3  (0) 2008.05.26
간단한 채팅소스2  (1) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.8)입니다. - 오류수정  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:38
아래 그림은 [관리자화면] 입니다.
연속적인 것인데, 설명을 위해서 여러개로 그림을 짤랐습니다.

((-------IMAGE-------))
첫번째 그림입니다.
- - - (개별)게시판관리 기능입니다.
- - - 기타를 클릭하면, 노란박스로 강조한 부분과 같은 항목들이 밑으로 뜹니다.
- - - 최근글 : 게시판의 마지막 글번호입니다. 새글이 작성될때 참고하기 위해서, 기록하고 있습니다.
- - - 총갯수 : 게시판의 글 갯수입니다. 목록 나열할때(특히 목록번호)를 위해서 기록하고 있습니다.
- - - 게시판ID : 게시판을 호출하는 id입니다. 어쩌다보니 이 예제게시판의 id는 모두 한글이군요.
- - - 게시판이름 : 목록, 본문의 위쪽에 위치하는 게시판 이름입니다.
- - - 형태 : 제목형, 본문형, 요약형, rss형이 있습니다.
- - - - - - 제목형 : 일반적인 게시판과 같은 목록형태입니다. 목록에서 미리보기가 됩니다.
- - - - - - 본문형 : 목록에 본문이 나열됩니다.
- - - - - - 요약형 : 게시물에 포함된 그림과 본문일부 등으로 표시됩니다.
- - - - - - rss형 : 제목형과 모양은 같은데,, rss리더 기능을 하는 게시판입니다.
- - - 분류 : 카테고리, 범주와 같은 것입니다. 버튼에 분류의 갯수가 표시되어 있고, 클릭하면 편집창이 뜹니다.
- - - 권한제한 : 목록, 읽기, 쓰기, 덧글의 권한제한을 설정할수 있습니다.
- - - - - - 회원레벨이 1~ 운영자 9로 설정되니까, 권한을 0으로 하면, 아무라도 열어볼수 있는거고,
- - - - - - 권한을 높여놓으면 그 레벨이상의 회원만 열수 있습니다.
- - - - - - 목록권한이 없는 사용자에게는, 게시판자체가 보여지질 않습니다.
- - - - - - 읽기권한이 없는 사용자에게는, 본문이 열리질 않는데, rss리더게시판일때는 rss원문주소로 링크됩니다.
- - - - - - 쓰기권한이 없는 경우는 글 작성, 답글작성을 못합니다.
- - - - - - 덧글권한이 없는 경우는 덧글을 달수 없습니다.
- - - - - - 권한제한은 0~9까지의 숫자와 알파벳 a로 설정할수 있습니다.
- - - - - - 알파벳 a는 내부적으로 99로 해석되어서, 운영자도 열어볼수 없습니다.
- - - - - - 예를들어 덧글을 아예 안쓰겠다고 할때, 덧글권한을 a로 놓으면,, 덧글입력창이 뜨질 않습니다.
- - - 삭제 : 게시판을 삭제합니다.. 확인창이 한번뜨고, 그 게시판에서 올라온 모든 자료를 삭제합니다.
- - - 분화 : 게시판이 용량이 너무 커져서, 움직임이 둔화될때, 데이타를 분산해서, 기동을 빠르게 하는 기능입니다.
- - - 링크 : 그 게시판으로의 링크입니다.
- - - 목록항목 넓이설정 : 게시판 생성후에, 특히 제목넓이는 조정해줘야 합니다.
- - - - - - 게시판목록에서 머리(?)부분에 스타일효과를 자유로이 줄수 있도록, 따로 테이블로 싸다보니까
- - - - - - 아래 목록들하고 싱크(?)가 안맞게 되어서, .. 넓이를 여기서 딱 맞게 해줘야 합니다.
- - - 제목태그 : 게시물 제목에 html태그 허용/비허용 선택하는 것입니다.
- - - - - - html태그 허용선택되더라도, <SCRIPT>나 등등의 몇몇 태그는 쓸수 없습니다.
- - - 미리보기 : 목록에서 본문 미리보기 허용/비허용 선택하는 것입니다.
- - - - - - 게시판 용량이 한 100MB쯤 되었을때, 미리보기를 비허용으로 하면, 목록출력이 훨씬 빨라집니다.
- - - rss출력 : 게시판 rss출력여부를 결정하는 것입니다.
- - - 하단목록 : 본문열었을때 아래쪽에 목록을 출력할 것인지 선택하는 것입니다.
- - - 관리자 : 그 게시판에 한해서, 운영자와 동일한 권한을 갖는 회원을 두명 선정할수 있습니다.
- - - - - - 그 게시판의 관리자로 선정할 회원의 id를 적는 곳입니다.
- - - 공지글 : 공지로 올라간 게시물의 번호입니다. 구분자 ^에 유의하시고,,
- - - - - - 게시판 목록에서도 공지글 올리고, 내리고 하는게 되지만,여기서도 편집,삭제 할수 있습니다.
- - - rss리더모두갱신 : rss리더로 만든 게시판이 많을때, 일괄적으로 업뎃시킬수 있는 버튼입니다.
- - - 수정 : 위의 수정사항을 입력하는 버튼입니다.
- - - - - - 전체게시판을 한꺼번에 수정하도록 하고 있습니다.
- - - 게시판추가 : 게시판ID와 게시판이름을 적고, (목록)형태를 정하고, (권한제한설정을 하고), 게시판추가버튼을 누릅니다.
- - -
- - - 위의 내용은 아래그림에서 ./data/boards.dat에 저장됩니다.

((-------IMAGE-------))
두번째 그림 - 파일/폴더관리 기능입니다.
- - - 경로이동 : 아래출력되는 파일리스트의 경로를 이동합니다.
- - - 파일생성 : 그 경로의 파일(빈파일)을 생성합니다.
- - - 폴더생성 : 그 경로의 폴더를 생성합니다.
- - - 목록에 파란색은 폴더, 빨간색을 파일입니다.
- - - 파란색 폴더 이름을 클릭하면 그 경로로 이동하고,
- - - 빨간색 파일 이름을 클릭하면 다운로드됩니다.
- - - 크기/수정 : 보여지는 값은 파일의 크기입니다. 폴더의 경우 내부파일을 포함한 값은 아닙니다.
- - - - - - 파일의 경우 클릭하면 내용 편집창이 뜹니다. 단 1MB이상의 파일일 경우는 편집창이 뜨지 않습니다.
- - - 소유자/링크 : 이 게시판에서는 소유자가 중요합니다. 모든 데이타파일은 nobody( = 99)로 되어있어야 합니다.
- - - - - - FTP로 업로드하면, 소유자가 바뀝니다. 게시판 데이타파일일 경우, 소유자가 nobody(=99)가 아니면 에러가 납니다.
- - - - - - 이때는 크기/수정으로 그 파일을 열어서, 고대로 다시 저장하면 소유자가 nobody(=99)로 바뀝니다.
- - - - - - 1MB이상의 파일일 경우, 아래에 설명할 copy나 rename을 통해서, 소유자를 바꿀수 있습니다.
- - - 삭제 : 폴더는 폴더삭제라고 빨간글씨로 나옵니다. 클릭하면 확인창이 뜨고, 폴더 내부파일을 포함해서 홀랑 삭제합니다.
- - - - - - 파일은 삭제/비움이라고 되어 있습니다.. 삭제는 파일삭제, 비움은 파일내용을 비우는 것입니다.
- - - 선택 : 파일,폴더앞에 checkbox를 체크해서 일괄선택하는 것입니다.
- - - - - - 일괄선택으로 copy, 압축, 삭제, 비움을 수행할수 있습니다.
- - - copy : 버튼을 누르면, 왼쪽에 copy 경로를 적을수 있는 칸이 나옵니다.
- - - - - - 그 칸에 폴더경로를 적었을 경우, 그 폴더에 일괄선택한 파일을 복사해넣습니다.
- - - - - - 그 칸에 폴더경로+파일경로를 적었을 경우,,(+선택파일이 하나) 그 경로에 그 파일이름으로 복사합니다.
- - - rename : 파일이나 폴더의 이름을 바꿉니다.. 경로와 파일(폴더)이름을 적도록 되어있으니까,, 위치이동도 가능합니다.
- - - - - - 체크한 파일(폴더)가 하나여야 합니다. 그리고 그 칸에 경로와 파일(폴더)이름을 적습니다.
- - - 압축 : 쉘스크립트를 쓸수 있는 계정에서만 사용할수 있습니다.
- - - - - - 파일폴더 일괄선택해서, 압축하면, data경로에 날짜이름으로 tar.gz 로 압축됩니다.
- - - 삭제 / 비움 : 선택된 항목에서 파일일 경우에만 적용됩니다.
- - - 파일업로드 : 위의 경로에 파일 업로드합니다.
- - - 받은쪽지함 / 보낸쪽지함 / 스크랩북 / 관리자정보
- - - - - - 운영자의 개인쪽지함과 스크랩북, 그리고 개인정보수정 링크입니다.
- - -
- - - 경로를 ../ 이런식으로 입력하면, 게시판파일의 범위를 넘어서, 다른 계정파일에도 접근할수 있습니다.
- - - 다른 계정파일을 일괄선택해서 압축해도, 압축파일은 data/날짜정보.tar.gz 의 위치에 저장됩니다.

((-------IMAGE-------))
세번째 회원정보 관리기능입니다.
- - - 회원이 지금 운영자 하나밖에 없는 모습입니다.
- - - 회원이 엄청 많아지면, 관리자화면이 복잡해지니까, 목록 15개 단위로 페이징되도록 했습니다.
- - - 전체쪽지발송 : 전체회원에게 쪽지를 발송할수 있는 기능입니다. 아래목록은 회원ID입니다.
- - - 전체메일발송 : 전체회원에게 메일을 발송할수 있는 기능입니다.
- - - - - - 이 게시판에서 쓰는 메일기능은 php의 mail() 함수를 쓰고 있는데,
- - - - - - 경우에 따라서, mail()함수를 쓸수 없는 계정도 있습니다.
- - - - - - 이 경우엔 메일발송기능을 사용할수 없습니다.
- - - 쓴글 / 덧글 : 그 회원이 작성한 글 / 덧글의 갯수입니다.
- - - 레벨 : 그 회원의 레벨입니다.. 최초(자동)가입시에 1,, 그 이상은 운영자가 수동으로 올려줘야 합니다.
- - - 수정 : 왼쪽의 회원정보를 수정했을때, 그 수정사항을 입력하는 버튼입니다.
- - - - - - (개별)게시판관리에서는 전체게시판을 통채로 수정하지만, 여기서는 개별적으로 수정-편집합니다.
- - - 삭제 : 회원정보를 삭제합니다.. 그 회원을 강퇴시키는 것입니다.
- - -
- - - 회원의 닉네임하고, 메일주소, 쓴글, 덧글, 레벨을 수정할수 있습니다..

((-------IMAGE-------))
네번째 제목 & include 설정입니다.
- - - 게시판 전체에 대한 설정입니다.
- - - 제목 : 게시판 전체의 제목, 또는 홈페이지의 제목을 설정합니다.
- - - - - - rss출력 할때, 또는 게시판에서 document.title에 사용됩니다.
- - - 인클루드 : 외부파일을 인클루드합니다.. 위 아래로.
- - - 목록나열갯수 : 목록형태별로 하나의 목록에 나열될 게시물수를 정합니다.
- - - 최근게시물수 : 전체최근게시물에서 출력할 게시물수를 목록형태별로 정합니다.
- - - 넓이:그림파일 : 본문에 임베드되는 그림의 최대넓이를 설정합니다.
- - - - - - 이 크기보다 큰 그림일때는 자동으로 이 크기로 리사이즈됩니다.
- - - 넓이:게시판 : 게시판의 넓이를 정합니다.
- - - 넓이:코멘트 : FF에서 이거 수동으로 안 정해주면, 옆으로 삐져나오길래, 아예 딱 규정하도록 하고 있습니다.
- - - 게시판색 : 게시판 색상을 변경합니다.
- - - - - - 첫번째는 게시판맨위쪽에 줄로 표시되는 제일 진한 색상, 전체최근게시물에 게시물 제목앞에 날짜색 입니다.
- - - - - - 두번째는 게시판목록의 머리(?)부분, 본문의 제목부분에 쓰인 색상, 미리보기의 바탕색입니다.
- - - - - - 세번째는 게시판본문의 글쓴이,날짜 부분의 색상입니다.
- - - - - - 네번째는 게시판목록에서 게시물 구분, 본문의 맨끝에 쓰이는 색상입니다.
- - - - - - 이미지창이나, 미리보기의 입체감 있는 테두리는 세번째와 첫번째색으로 되어 있습니다.
- - - 상단내용추가 : 그 내용을 data/head 파일로 저장해서, 게시판 맨 위쪽에서 인클루드(추가) 합니다.
- - - 하단내용추가 : 그 내용을 data/tail 파일로 저장해서, 게시판 맨 아래쪽에서 인클루드합니다.
- - - 하단여백높이 : 게시판 목록 하단의 여백높이를 설정합니다.. 목록번호등을 클릭하기 쉽도록..
- - - 수정 : 위의 편집내용을 저장합니다.. 저장되는 파일은 data/setting.dat 입니다.
((-------IMAGE-------))
위 그림은,, 일반회원의 회원정보 모습입니다.
- - - 아이디, 쓴글, 덧글, 레벨 표시되고 있고,
- - - 받은 쪽지함, 보낸 쪽지함, 스크랩북의 링크가 있습니다.
- - - 아이디 : 일반회원의 경우는 이 항목이 나타나지 않습니다. 운영자만 가능한 기능입니다.
- - - - - - 운영자가 자기 아이디를 수정할수 있는 기능입니다.
- - - 비밀번호 : 비밀번호를 수정할수 있습니다.
- - - 닉네임 : 닉네임을 수정할수 있습니다.
- - - 메일주소 : 메일주소를 수정할수 있습니다.
- - - 회원정보수정 : 위에 수정한 내용을 저장합니다.
- - - 회원탈퇴 : 회원탈퇴합니다.
- - - 아래 박스는 회원리스트입니다..
- - - 쪽지를 클릭하면 그 회원에게 쪽지를,
- - - 메일을 클릭하면 그 회원에게 메일을 보낼수 있습니다.
- - - - - - mail()함수가 지원되는 경우에만 사용할수 있습니다.
- - - - - - 회원의 메일주소는 노출되지 않습니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

간단한 채팅소스4  (0) 2008.05.26
간단한 채팅소스3  (0) 2008.05.26
간단한 채팅소스2  (1) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.8)입니다. - 오류수정  (0) 2008.05.26
srboard 1.7 버전입니다.  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:38
((-------IMAGE-------))
위 그림은 [글쓰는화면] 트랙백, 태그 다 열어놓은 모습-- 위지윅상태입니다.
- - - 태그는 다섯개까지 입력할수 있고,, 트랙백을 걸때(남의 글을 내글에 엮을때)
- - - 그 글의 링크주소를 같이 입력하도록 하고 있습니다.
- - - <B>, <I>, <S>,, 등등은 해당 태그지원버튼입니다.
- - - , <IMG>를 클릭하면 url주소적는 창이 뜹니다.
- - - 배경색, 글자색을 클릭하면 색상팔레트가 나옵니다.
- - - ← : undo, → : redo 그 우측으로는 위첨자,아래첨자,, 그리고 좌우정렬 선택상자입니다.
- - -파일업로드는 찾아보기를 눌러서, 파일을 선택하면 즉시 업로드되고,
- - -업로드내역은 아래회색박스처럼 뜨고, 이미지파일의 경우엔 글쓰는본문에 위와같이 출력됩니다.
- - -맨위에 비밀글(체크박스)은 : 글쓴이와 게시판관리자만 볼수 있도록 하는 것입니다.
- - -맨위에 공지글(체크박스)은 : 게시판관리자에게만 보여집니다.

((-------IMAGE-------))
위 그림은,, [글쓰는화면] 텍스트에딧 상태의 모습입니다.
- - -대체로 위지윅상태와 비슷하지만,
- - -ie효과, 박스, 여닫기, 변환 - 선택상자가 다릅니다.
- - -ie효과 : ie에서만 적용되는 텍스트필터효과입니다.
- - -박스 : 외곽선박스,배경색박스, 둘다 합쳐진 박스,fieldset 등의 선택사항이 있습니다.
- - -여닫기 : more/less 네가지 선택사항입니다.
- - -변환 : 줄바꿈을 로 변환 - 또는 그 역으로 하는 등등의 기능입니다.

((-------IMAGE-------))
위 그림은 그렇게 작성된 게시물 예제입니다.
- - -글쓴이가 회원일경우, 글쓴이이름을 클릭하면 위와 같이 네가지 선택사항의 박스가 뜹니다.
- - -비회원일 경우, 바로 글쓴이이름 게시판 검색으로 링크됩니다.
- - -본문 위에 트랙백주소가 있습니다.
- - -클릭하면 ie에서는 복사,FF에서는 복사할수 있도록 prompt창으로 뜹니다.
- - -업로드한 파일내역이 본문하단우측에 빨간글씨로 표시되고,
- - -파일크기와 다운로드횟수가 표시됩니다.
- - -이미지파일의 경우는, 신속한 출력을 위해서, 다운로드집계를 하지 않습니다.
- - -그 아래는 입력했던 태그가 태그검색링크로 출력됩니다.. - - -덧글칸 아래 좌측에, 답글, 추천, 스크랩이 있습니다.
- - -답글 : 코멘트가 아닌 답글입니다. 본문은 포함하지 않습니다.
- - -추천 : 게시물 추천링크입니다. 하나의 게시물에 한사람이 하루에 한번 추천할수 있습니다.
- - -추천 : 추천내역은 날짜, 아이피와 함께 저장되고, 하루뒤에 리셋됩니다.
- - -스크랩 : 회원에게 제공되는 책갈피 비슷한 기능입니다.

((-------IMAGE-------))
제목형 목록입니다.
- - -제목옆에 체크박스와 선택반전버튼, 우측에 선택상자는
- - -게시판관리자에게만 보여집니다.
- - -목록 맨위에 좌측부터 보면
- - -rss : rss 출력링크입니다.
- - -▤ : 제목형 목록링크입니다.
- - -□ : 본문형 목록링크입니다.
- - -▦ : 요약형 목록링크입니다.
- - -한 목록의 게시물출력갯수는 목록형태별로 정할수 있습니다.
- - -게시판을 생성할때, 기본형태를 정하도록 되어있고,
- - -사용자가 위 링크를 클릭해서, 바꿔볼수 있도록 되어 있습니다.
- - -제목위에 마우스를 올리면 내용 미리보기 -레이어창이 뜹니다.
- - -본문에 이미지가 있는경우, 썸네일사이즈로 미리보기 됩니다.

((-------IMAGE-------))
로그인 안한 상태의 제목형 목록입니다.
- - - 로그인을 클릭하면 아래에 로그인하는 란이 뜹니다.
- - - 회원가입을 클릭하면 아래의 그림으로 링크됩니다.


((-------IMAGE-------))
회원가입 폼입니다.
- - - 아이디를 넣고, 중복검사를 누릅니다. 닉네임을 넣고 중복검사를 통과합니다.
- - - 중복검사는 입력처리할때, 어차피 또 하니까,
- - - 중복검사 ok 뜬 후에, 아이디나 닉네임을 바꾸게 되면, 다시 ok(중복검사)를 눌러 확인합니다.
- - - 비밀번호는 별표처리가 되니까, 실수방지를 위해서, 두번 넣도록 되어 있고,
- - - 메일주소는 간단하게 내용중에 @이 있는지만 확인합니다.
- - - 아이디, 비밀번호는 영문숫자 10자 이내라야 하고,, 넘어가면,, 되돌아옵니다.
- - - 닉네임은 길이제한 없는데, 게시물에 글쓴이이름에 표시되는게 닉네임이니만큼,
- - - 너무 길면,, 보기 안좋을수도 있습니다.


((-------IMAGE-------))
요약형 목록입니다.
- - - 본문에 임베드된 이미지태그가 있는 경우, 이미지파일을 100x100 사이즈로 출력합니다.
- - - 글이 올려질때나, 수정될때 내용을 검색해서, 첫번째로 걸리는 이미지태그의
- - - src주소를 따로 저장했다가 출력하는 방식입니다.
- - - 섬네일을 클릭하면, 큰 그림으로 뜨고, 제목이나, 요약내용을 클릭하면 본문으로 갑니다.

((-------IMAGE-------))
rss리더형 게시판의 rss주소 편집창입니다.
- - - new에 추가할 주소를 입력하고, 입력을 누르던지, 키보드엔터를 눌러 추가합니다.
- - - 추가는 하나씩, 삭제나 수정은 전체를 한꺼번에 할수 있는 편집창입니다.
- - - 읽어온 게시물은 각 rss주소 순서대로의 번호로 분류되어 저장됩니다.
- - - 다만 분류-범주를 따로 설정해야,, 분류된게 나타나게 됩니다.
- - - 저작권침해의 위험이 있어서, rss리더형 게시판을 새로 생성할때,
- - - 읽기권한을 회원이상으로 기본적으로 설정되도록 하고 있습니다.
- - - 읽기권한이 없는 경우는,, 바로 그 rss의 원래주소로 제목에서 링크됩니다.
- - - 읽기권한이 있는 회원의 경우는 위와같이 제목옆에 [link]로 표시됩니다.

((-------IMAGE-------))
제목형 목록에서,글쓴이이름 - 회원-을 클릭해서 쪽지보내기를 클릭한 상태입니다.
- - - 비회원도 회원에게 쪽지보내기가 됩니다.
- - - 당연히 비회원에게 쪽지보내기는 안됩니다.
- - - 쪽지보내기창에 내용을 적고 쪽지보내기 버튼을 누르면 쪽지가 전달됩니다.

((-------IMAGE-------))
위 그림은 받은 쪽지함을 클릭한 모습입니다.
- - - 별표두개는 처음 확인하는 쪽지의 표시입니다.
- - - 쪽지가 도착하면, 로그인했을때, [쪽지가 도착했습니다] 라는 문구가 뜹니다.
- - - 쪽지는 한 목록에 열개씩, 위와같이 표시됩니다.

((-------IMAGE-------))
위 그림은,, 스크랩북의 모습입니다.
- - - 본문 아래쪽에 스크랩 링크를 누르면 스크랩되고,
- - - 날짜는 스크랩한 날짜로 기록됩니다.
- - - 제목을 클릭하면 해당 게시물이 새창으로 뜹니다.

((-------IMAGE-------))
위 그림은 일반적인 제목형 목록입니다.
- - - 공지가 두개 있고, 분류가 설정되어 있습니다.
- - - 분류는 분류로 설정한게 없거나, 분류항목의 넓이를 0으로 하면
- - - 목록에 표시되지 않습니다.
- - - 다른 항목도 마찬가지로, [관리자화면] [게시판관리]에서 해당 항목의 넓이를 0으로 하면,
- - - 목록에 나오지 않습니다.
- - - 제목옆에 빨간색 [숫자]는 덧글+엮은글+엮인글 갯수입니다.
- - - 따로 따로 표시하다가, 번잡해서,, 합산해서 표시합니다.
- - - 여기서 좌측하단에 전체보기를 클릭하면 아래 그림으로 이동합니다.

((-------IMAGE-------))
위 그림은 전체최근게시물입니다.
- - - 요약형은 세개, 제목형은 다섯개 출력되는 모습인데,
- - - 목록형태별로 출력갯수는 조정할수 있습니다.
- - - 제목을 클릭하면, 본문 미리보기가 뜹니다.
- - - 미리보기는 본문읽을 권한이 있어야 뜹니다.
- - - 요약형의 섬네일그림을 클릭하면 큰 그림으로 뜹니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

간단한 채팅소스3  (0) 2008.05.26
간단한 채팅소스2  (1) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.8)입니다. - 오류수정  (0) 2008.05.26
srboard 1.7 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.7)입니다.  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:35
이 게시판은,,
http://www2.ssam.biz/blog/?tb=1&ct=5
여기에서 배포하고 있습니다.

mysql을 사용하지 않는 게시판입니다.
구성파일은
index.php
exe.php
admin.php
data(폴더 그 안에) .htaccess
입니다.

data폴더안에 .htaccess파일의 기능은,
data폴더로의 직접적인 접근을 막는 것입니다.
mysql없이 데이타를 파일로 저장하는데,
외부에서 그 파일에 직접 접근할수 없도록 하는 역할입니다.

index.php가 게시판 접속파일입니다.

설치방법은 1. 위 파일을 계정에 올리고,
2. data폴더의 권한을 777로 줍니다.
3. admin.php에 접속해서 회원가입을 합니다.
관리자를 구분하는 방법이 따로 없어서,
맨첨에 가입한 사람을 관리자로 인식하도록 했습니다.
따라서, 게시판 설치파일 업로드즉시 회원가입하는게 좋습니다.

데이타 저장은,,한줄에 게시물 하나씩 쌓는 방식입니다.
단, 처리속도와 부하를 생각해서,
게시물의 번호와 자주변동하는 사항(조회수같은거)은 따로,
제목과 글쓴이등도 따로,
게시물 본문내용도 따로,
덧글도 따로, 저장하고 있습니다.

id가 no인 게시판을 예로 들어서
./data/no/ 폴더가 있고 그 안에,
아래와 같은 파일,폴더가 생성됩니다.

./data/no/files - 업로드파일 저장경로
./data/no/body.dat - 게시물 본문저장
./data/no/list.dat - 제목. 이름등을 저장
./data/no/no.dat - 번호와 자주바뀌는 사항을 저장(용량이 작음)
./data/no/notice.dat - 공지사항을 저장
./data/no/rp.dat - 덧글을 저장
./data/no/rtb.dat -받은 트랙백(= 엮인글)을 저장
./data/no/stb.dat -보낸 트랙백(=엮은글)을 저장
./data/no/upload.dat -파일업로드 목록을 저장
./data/no/vote.dat - 추천인의 아이피와 추천내역을 저장(1일).
./data/no/bno.dat - 게시판 데이타 분화한 내역을 저장

위의 파일들은 게시판을 추가할때, 자동으로 생성됩니다.
대개는 새글이 위로 쌓이는 방식으로 저장합니다.
(-특별한 경우를 빼고는)
그래야 출력할때 더 빠르기 때문입니다.
(왜냐면 최근것을 출력할 경우가 훨씬 더 많으니까)

이 방식을 포함한 여러 방식으로
10만개의 게시물환경을 만들어서 테스트해본 결과,,
목록출력, 본문출력, 각종검색 출력에서 젤 나은 것을 선택한게
이 방식이었습니다.

출력된 게시판을 브라우저에서 소스보기를 해보면,
맨 아래.

<!--getmicrotime:: 0.0042188167572021-->
이렇게 나옵니다.
여러방식의 게시판으로 성능을 비교측정하느라고,
microtime() 함수를 이용해서,
맨위에서 재고, 맨 아래서 재고,, 그 시간차를 출력하는 소스를 넣었다가,,
빼지않고,주석처리로 보이지만 않게 했습니다.

이 시간은 서버컴퓨터에서 php소스를 처리하는데 걸린 시간입니다.

아마 좀 빠른 편일거라고 생각됩니다.

좀 늦는게, 조회수처리, 추가하는 부분일수 있는데,
그래서 그 부분은 iframe안에 넣어서 처리합니다.
본문출력에 부담이 가지 않도록,, 하느라고..
게시판을 여러개 생성할수 있고,
생성된 게시판은 http://주소/경로/index.php에서
최근게시물로 나오고,,
생성할수 있는 숫자의 한계는 없습니다.

회원관리기능이 있고,
트랙백기능을 포함해서, 블로그의 일반적인 기능이 있고,
rss리더 기능이 있습니다.

흠이라면, 스킨기능이 없다는 것.

// 게시판의 모든 팝업창은 모달창(웹페이지 대화상자)으로 열립니다.
탭브라우저에서도 메인화면위에 팝업창으로 뜰수 있게 하기 위해서..

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

간단한 채팅소스2  (1) 2008.05.26
간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.8)입니다. - 오류수정  (0) 2008.05.26
srboard 1.7 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.7)입니다.  (0) 2008.05.26
srboard 1.6 버전입니다.  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:31
index.php 292줄
$ctl = $ii; 에서 $ctl = $i -6; 로 수정.
exe.php 1460줄
if($wt1 == "" && $wt5) $wt1 = substr($wt5, 2);에서
if($wt1 == "" && $wt5) $wt1 = substr($wt5, 1);

rss리더에서,
게시자이름이 없을때, 카테고리로 대체하는데,
그때 카테고리에 포함된, 구분자를 분리할때 1byte만 짤라야하는데,
(옛날처럼) 2byte가 잘리도록 되어서, 문제가 있었습니다.


압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

간단한 채팅소스(또는 메모장)  (0) 2008.05.26
데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 제로보드스킨 버전(1.8)입니다. - 오류수정  (0) 2008.05.26
srboard 1.7 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.7)입니다.  (0) 2008.05.26
srboard 1.6 버전입니다.  (0) 2008.05.26
srboard 1.5 버전입니다.  (1) 2008.05.26
by Anna 안나 2008. 5. 26. 17:28
srboard의 업데이트 아닙니다...
제로보드의 스킨을 사용하는 버전입니다.

압축파일에 업데이터는 포함하지 않았습니다. 업데이터링크

첫째. 게시물일괄선택에서,, 오류가 있었습니다.
해결되었는데,,,
1. 스킨에서 내려오는 <form>을 닫아주지 않아서, 생겼던 문제
2. 게시물 제목앞 체크박스(관리자에게만 보임)의 번호가.. 안맞았던 문제
였습니다.

둘째. rss리더에서 <author>가 없는경우, <category>로 글쓴이를 대신합니다.
구분자를 기존에 2byte 특수문자로 쓰다가,
srboard로 되면서 1byte의 \x1b로 바꿨는데,
이름이 없을때 카테고리에서 1byte를 짤라줘야 하는데, 옛날처럼 2byte를 짤라서..
한글이 깨지는 문제,, 등등이 있었습니다.



수정했습니다.

압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

데이타 파일  (0) 2008.05.26
게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
srboard 1.7 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.7)입니다.  (0) 2008.05.26
srboard 1.6 버전입니다.  (0) 2008.05.26
srboard 1.5 버전입니다.  (1) 2008.05.26
srboard 1.4 버전입니다.  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:28
방문자 카운트추가할때,
본문 출력속도에 영향을 주지 않기 위해서, iframe으로 처리하도록 했습니다.
(게시물의 조회수를 그렇게 하고 있던거와 마찬가지로)

그렇게하니까, $_SERVER[QUERY_STRING], $_SERVER[HTTP_REFERER]를
iframe에 넘겨줘야 했습니다.
하여튼..

수정한게 그거 하납니다.
다른 것은 별로 수정할게 보이질 않는군요..

---------- 제로보드스킨버전도 이 부분이 변경되었는데,
겨우 요거갖고, 금방 새버전 올리기는 뭐하니까,,,
그냥 이거 수정한 것으로 대체해놨습니다. 아래에...

압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

게시판 설명3  (0) 2008.05.26
게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.8)입니다. - 오류수정  (0) 2008.05.26
srboard 제로보드스킨 버전(1.7)입니다.  (0) 2008.05.26
srboard 1.6 버전입니다.  (0) 2008.05.26
srboard 1.5 버전입니다.  (1) 2008.05.26
srboard 1.4 버전입니다.  (0) 2008.05.26
스킨 수정하는 방법  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:27
srboard의 업데이트 아닙니다...
제로보드의 스킨을 사용하는 버전입니다.

제로보드4의 스킨을 사용할수 있는 버전이 아마 수요가 많은거 같아서,,
또 srboard이전버전에 에러도 있다고 하고,,, 해서
만들었습니다.

그냥 srboard하고, admin.php, exe.php 파일은 거의 비슷합니다. - 아주 약간만 다르고-
index.php는 많이 다릅니다.
데이타파일은 완전히 똑같습니다.

제로보드 스킨은 list_head.php, list_main.php, view.php, comment_view.php
하고 style.css만을 사용합니다.
(다른건, 구조가 워낙달라서..)

덧글에서 수정하고, 덧글의 덧글이 안되는데,
원래 제로보드스킨에 삭제버튼만 있더군요.
거기에 맞추다보니 그렇게 되었습니다.

목록의 요약형하고 본문형은 거기에 해당하는 제로보드스킨은 원래 없고,
그래서 srboard 의 모양대로 해놨는데,
뺄까말까 하다가.... (없으면 허전할거 같아서 안뺐습니다.)
그러다보니까 등등해서, 제로보드의 스킨에서 제공하는 style.css만으로는 다 표현할수가 없어서,
skin폴더에 default.css파일을 포함했습니다.

default.css파일은 이름이나 위치가 바뀌면 안됩니다.-- 내용은 (당연히) 수정되어도 되구요-

제로보드스킨은,, 게시판마다 각각 설정하도록 했습니다.
전체게시물은,, default.css를 통해서,,,사용하는 제로보드스킨에 맞춰서 수정-사용해야 합니다.

나머지 구조는 srboard하고 같습니다.
덧글이 iframe으로 된다거나,, 하는 것들..

------- 압축풀면 _update.php 파일이 포함되어 있습니다.
srboard 이전버전을 사용하던 경우에는,
srboard하고 데이타구조가 달라서- 변환시켜줘야 합니다.

우선 게시판파일 교체하지 않은 상태에서, _update.php만 업로드하고,
게시판에 관리자로그인한 상태에서 _update.php를 실행시킵니다.
그 뒤에 index.php, 등등의 파일을 업데이트-교체하고,
사용하면 됩니다..

_update.php는 한번만 실행시켜주고, 삭제하세요.
두번 실행시키면, 데이타파일 엉망됩니다.
(관리자기능에서 사전에 데이타파일을 압축해놓으면,, 좀 더 안전하겠군요.)

제로보드4의 스킨은 skin폴더에 업로드합니다.

압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.

'웹스터디 > nosqlboardchat' 카테고리의 다른 글

게시판 설명2  (0) 2008.05.26
게시판 설명1  (0) 2008.05.26
srboard 1.8 버전입니다.  (0) 2008.05.26
srboard 제로보드스킨 버전(1.8)입니다. - 오류수정  (0) 2008.05.26
srboard 1.7 버전입니다.  (0) 2008.05.26
srboard 1.6 버전입니다.  (0) 2008.05.26
srboard 1.5 버전입니다.  (1) 2008.05.26
srboard 1.4 버전입니다.  (0) 2008.05.26
스킨 수정하는 방법  (0) 2008.05.26
srboard 1.3 버전입니다.  (0) 2008.05.26
by Anna 안나 2008. 5. 26. 17:27
개괄 :
관리자기능 - 파일/폴더 관리에서 copy,rename,일괄[삭제] 기능을 향상시켰습니다.
그리고 모든 소스의 javascript:; 이 부분을 #none으로 바꿨습니다.
스킨수정사항 :
default.php에 쓰인 javascript:; 라는 문구가 전부 #none으로 바뀌었습니다.
- - ie,FF에서는 안그러는데, webma나 donutp등의 브라우저로 열어보니까 인식을 못하더군요.
index.php에 $red = "#FF6633"; 라는 문구가 위쪽에 있었고,
- - 그게 현재 목록페이지를 강조할때 쓰였었는데, default.css의 맨밑에 .p_no {}로 뺐습니다.
따라서 default.css 파일이 한줄 늘었습니다.

- - skin/default.php 232줄
if($level == 9) {
if($level) {
으로 수정 == 회원이면 방문자내역 볼수 있도록..

관리자기능 - 파일/폴더 관리
- - copy. rename :
그동안 파일외에 폴더는 copy,rename이 안됐는데,
copy는 원래 안되고, rename은 되는걸 막아둔거였습니다.
원래 안되던거 되도록했고, 막아둔거 풀었습니다.

- - 일괄선택 [삭제] :
그동안 폴더 - 오직 개별적인 폴더삭제로만 되었고,
일괄선택 삭제에서는안됐었는데. 되도록 했습니다.
폴더내의 파일까지 모두 삭제합니다.

- - 압축,해제:
그동안 압축은 되고 해제는 안됐었는데, 해제를 추가했습니다.
: 압축할때도, 압축되어 생성되는 파일 자신은 포함되지 않도록 했습니다.
(data폴더 자체를 압축하면, 새압축파일이 data폴더 안에 생성되어서, 그거까지 압축되는 일이 있었는데.. 해결됨)
: 압축해제할때는 경로를 넣도록 칸이 뜹니다.
유의할 점은 data 폴더내에서 파일을 압축했을때, data폴더채로(선택된 파일/폴더가) 압축된다는 것입니다.
(실행파일이 data폴더밖의 admin.php라서 그런거 같은데,,)

그래서 압축해제할때 경로에 data가 들어있으면
data폴더안에 또 data폴더를 만들어서, 그 안에 압축이 풀립니다.

기타 :
방문자 카운터를 달았는데,
쿠키와 세션이 둘다 없을때, 카운트를 추가하고, 쿠키와 세션을 생성시켜서
다음에는 방문자 카운팅하지 않도록 하고 있는데,
yeti -- 네이버검색봇 라는게 있더군요.
수정한 예제게시판에 카운트가 180여개 였는데, 내역을 보니까, 두개빼고 나머지는 전부 네이버봇이었습니다.
그래서 $_SERVER[HTTP_USER_AGENT]를 체크해서,
네이버봇이면 카운팅하지 않도록 했습니다.. 그렇다고 접속을 막진 않았습니다만..
필요하다면 추가할수는 있습니다.
index.php 51줄 "if(strchr($_SERVER[HTTP_USER_AGENT],'Yeti') =='') {" 에 대응하는 괄호
}
} else exit;
이렇게 바꾸면 접속이 차단(?)됩니다.

$dxr = "./data/"; 였던걸 전부(index exe admin)
$dxr = "data/"; 로 바꿨습니다.. 별 의미는 없는거구요...

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
출력되는 곳의 머리부분에 이거 추가했는데,
이게 1.5 버전에서 추가한건지,, 1.6에서 추가한건지 헷갈립니다.


압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.
by Anna 안나 2008. 5. 26. 17:26
스킨은 각자가 수정해서 쓰라고 넣어둔거라서,,
바뀐 곳은 일일이 지적하고 있습니다.
(당연히 업로드된 파일에는 반영된 내용입니다)

skin/default.php 바뀐 곳
92~97줄
<a href='javascript:;' title='목록' onclick="location.href='?' + location.search.slice(1).replace(/&type=[^&]*/gi,'').replace(/&p=[^&]*/gi,'') + '&type=a&p=1'">▤</a>&nbsp;
<a href='javascript:;' title='본문' onclick="location.href='?' + location.search.slice(1).replace(/&type=[^&]*/gi,'').replace(/&p=[^&]*/gi,'') + '&type=b&p=1'">□</a>&nbsp;
<a href='javascript:;' title='요약' onclick="location.href='?' + location.search.slice(1).replace(/&type=[^&]*/gi,'').replace(/&p=[^&]*/gi,'') + '&type=c&p=1'">▦</a>&nbsp;
이렇게 바뀌었습니다.
목록형태(제목형,요약형,본문형)가 바뀔때, 페이지번호가 1로 되도록 한겁니다.
왜냐면, 형태마다 목록에 출력하는 갯수가 달라서(관리자기능 맨 아래에서 설정됨)
형태를 달리할때마다 페이지번호의 갯수가 늘었다, 줄었다하는데,
없는 페이지번호에서는 목록이 안나오기 때문입니다.

▤, □, ▦ 는..
인터넷에 적당한 아이콘이 있으니까, 다운로드해서,
이미지로 바꿔서 쓰길 권하겠습니다.



skin/default.php
161줄, 173줄에
<?=$re?>요거 늘었습니다.
답글일때,, re: 표시입니다.

skin/default.css
끝에
.quot {background-color:#F7F5EF;margin:10 10 0 30;padding:10;border:1px dashed #9A9487}
.quot2 {border:0;height:0;border-top:1px dashed #9A9487;}
이 두줄 추가했습니다.
답글을 달때, 본문 인용되는 부분의 스타일입니다.
위에는 박스, 아래는 <hr>의 스타일입니다.

그동안 답글을 달때, 본문인용이 안됐는데,
추가했습니다.
아래쪽에 <div>안에 원문을 넣었고,
그 스타일의 class가 "quot" 입니다.
"quot2" 는 ~~~님의 글입니다. 라는 문구아래 <hr> 의 스타일 입니다.



일괄선택해서 범주이동할때, [제목없는게시물]이 맨밑에 생성되는 오류가 있었습니다.
수정했습니다.

1.4버전에서
$_GET[keyword] 가 있을때, 목록앞번호를 가상번호가 아닌 실제 게시물번호로 하도록 했었는데,
거기에 더해서 1.5버전에서는
$_GET[date]길이가 6보다 클때(=날짜지정),
$_GET[c] = 회원의 회원번호(가입순)로 덧글검색 할때
실제 게시물번호로 목록앞번호를 하도록 했습니다.
///왜냐면 검색을 전체 다하는게 아니고,
목록에 출력될 갯수 + 1개만 해서,
출력된 것보다 검색될게 더 있는건, 그걸로 알수 있으니까
[계속검색]의 링크로 그 다음을 검색하도록 하는게,,,, 훨씬 빠르기 때문입니다.

갠적으로 테스트용으로 만든 용량 970mb짜리 - 게시물수 50만개쯤 되는 게시판에서도
그럭저럭 검색을 무리없이 쓸수 있습니다. -- 물론 검색될게 많아서,
아래쪽까지 다 훑어볼 필요가 없을때.. 그렇지만. --

그리고...
게시판에서 방문자기록하는데,
접속시간, ip, query_string (방문한 페이지), referer(어디에서 들어왔는지 알아보는거)
에 덧붙여 user_agent(브라우저구분)도 추가했습니다.
예제 게시판에 조회수가 많이 올라가길래 봤더니,
거의 네이버봇이더군요..


압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.
by Anna 안나 2008. 5. 26. 17:25
skin/default.php가 두군데 바뀌었습니다.
97줄
if($type =='b'||$type == 'c') { 이게
if(($type =='b'||$type == 'c') && !$_GET[keyword] && !$_GET[c]) { 이걸로
-- keyword가 있는 경우(=검색) 정렬을 동시에 사용할수 없기 때문에,,,,

85줄
} 이게
} else if($i == 1 && $_GET[p]) echo "<script>alert('덧글 권한이 없습니다');self.resizeTo(0,0);</script>"; 이걸로


1.3버전 index 773줄에
} else if($xx == 0 && $type != 'b'){ 이것을
} else if($xx == 0){ 이거로 바꿨는데,

이상하게 검색을 할때 &type=b 로 링크를 줘서,
결과를 바로 본문으로 열리게 하면,
전혀 엉뚱한 결과가 나오는 문제가 있었습니다.
&type=c나 $type=c로 주면 멀쩡하면서...

그래서 원인을 찾긴 찾았는데, 위에서처럼.
겸사겸사 검색이나 정렬, 목록에 관한 부분을 싹 뒤집었습니다.

전에 그 전에는,
검색할때, 검색된 갯수를 그 즉시 얻어낼라고
목록에 출력되지 않는 부분까지 통틀어서 검색했었는데,,
그 뒤에 목록에 출력될 갯수 + 1개만 검색해서,
검색된 총 갯수는 당장 모르더라도, 검색처리가 훨씬 빠르게 이뤄지도록 수정했는데,,
그렇게 해놓으니까, 목록에서 번호배정하는 부분이,
모두 검색할때와는 달라진 것입니다.
-- 전에 전에는 모두 검색하니까, 갯수나오고, 그 갯수로 번호를 매겨주면 되었는데,
그 뒤론 검색된 갯수가 바로 안나오니까,,,--

하여튼 그래가지고.
검색할때 번호는 게시물 번호로 표시되도록 했습니다. (가상번호가 아니고)

그리고 keyword가 있는 검색하고 항목별 정렬(날짜순,번호순..)이
동시에 되지 않습니다. 원래.
-- 가장 큰 이유는 배열을 그렇게 자유자재로 다루질 못해서 --

요약형,본문형에서는 항목이름이 안나오니까,
대신 선택상자(select)로 항목별로 정렬할수 있도록 하고 있는데,
그래서 $_GET[keyword]가 있을때는, 그 선택상자가 출력되지 않도록 수정했고(위에 스킨97줄),
그리고, 제목형 목록의 항목이름 클릭해서, 정렬하는 부분에서는 alert()가 뜨도록 했습니다.

어떤 게시판의 경우, 덧글을 잠궈놓고 쓰고 있었는데,
덧글이 iframe으로 바뀌면서,
요약형, 본문형에서 덧글갯수 링크를 통해서, 바로 출력할수 있도록 되었습니다.
-- 그거 할라고 iframe으로 바꾼거니까..

이때 덧글이 없고, 쓸권한도 묶여있는 경우에,
그냥 작동안하고, 고장난것처럼 가만히 있는거보다, 뭔가 상황을 통지하는게 좋을거 같애서,
(위에 스킨 85줄 수정한 것)
alert가 뜨도록 했습니다.

이 게시판에서 권한제한은,
목록보기, 본문보기, 본문쓰기, 덧글쓰기 -- 이 네개로 이뤄지는데,
덧글보기는 따로 권한 설정없이 본문보기하고 같이 되도록 했습니다.

그래서 덧글을 열어서 호출할때, 덧글이 올라온 것도 없으면서 쓸권한도 없을때,,
뭔가 상황을 통지하면서--
요약형,본문형의 목록에서가 아니고, 본문이 바로 열렸을때는
덧글창이 자동으로 열리니까 -- 클릭해서 여는게 아니고--
이때는 alert가 안떠야 하니까..
&p=1을 더 붙여서, $_GET[p]가 있으면, 요약형이나 본문형에서 수동으로 열린 것으로,,
본문에서 자동으로 열릴때와 구분되도록 했습니다.
-- 이게 지금 위에 85줄 수정한 얘기.

덧글이 iframe으로 열리는만큼..
디시인사이드의 게시판처럼, 덧글을 페이징 하는 것도
어떨까 하는 생각을 해봅니다.
앞으로....


게시판이 분화되었을때는,
통상적인 검색이나, 항목별 정렬에서 이전의 기록이 제외되는데,
데이타가 분산저장(?)된 게시판에서 $_GET[keyword]가 있는 검색일때는
검색을 하고, 검색버튼이름이 [다음검색]으로 바뀌면서,
그걸 클릭하면 분산저장된 이전 기록을 검색하도록...
++++ 했던게 옛날인데 ++++
더해서 항목별 정렬의 경우에도, [이전] [다음] 링크가 보이면서,
분산저장된 기록을 항목별로 정렬할수 있도록 했습니다.

---- 목록번호에 [계속검색]은, 그냥 검색된게 목록출력갯수보다 더 많을때,
목록번호를 바꿔주는 것입니다. (&p=1 -> &p=2 로)
검색버튼이 이름바꾼 [다음검색]하곤 다릅니다.
계속검색 : 기존에 찾는 곳에서 더 찾는 것.
다음검색 : 찾는 곳을 바꾸는 것.
---- 이 구분은 게시판이 분화(데이타분산저장) 되었을때의 얘깁니다.


기능이 등등등 너무 많다보니까,,
구석구석에 오류가 많았는데(주로 잘 안쓰는 기능쪽으로)
뭐 어지간히... 그런 오류들도 거의 수정한 버전이 srboard입니다.

압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.
by Anna 안나 2008. 5. 26. 17:25
srboard로 되면서, 기존에 게시판목록에 항목
넓이조정으로 항목을 보였다/말았다 하는 기능이 사라지니까,
게시판마다 항목을 달리되도록 하는게 어렵게 되었습니다.
스킨에 목록에 해당하는게 하나니까..

항목 갯수나 넓이를 달리하고 싶을때는,
스킨을 수정해서, 이름을 달리해서 skin폴더에 저장한담에-- php파일,css파일 두개가 한쌍, 이름도 동일--
게시판마다 스킨을 달리 선택할수 있으니까, 거기서 수정한 스킨을 선택하면 될거 같습니다.
-- 그러고보니 별로 어려운일이 아니었군요....

... 게시판 첫화면 = 전체최근게시물(-- 이름이 너무 길어서 좀 불편합니다.지칭하기가)
에서 요약형만 약간 다를뿐( 조그만 썸네일이 나온다는 점에서),
목록이 너무 단순합니다. 전부 같고....
그게 아쉬웠는데, 그래서 어떻게 특정게시판만 (제로보드xe처럼)
다른거 두배넓이로 출력하는 방법이 없을까,, 모색해봤는데,
스킨을 수정하면 가능합니다.

예를 들어서 게시판 id가 ccc 인 것은,
다른거 두배넓이로 출력하고 싶다고 할때는,

skin/default.php 211~212줄이
?>
<td valign=top>이렇게 되어 있는데, 이 부분을 아래내용으로 바꿉니다.
if($mid == 'ccc') {
$f++;
?>
<td valign=top colspan=2>
<?
} else {
?>
<td valign=top>
<?
}
?>
if($mid == 'ccc') {// $mid는 게시판id를 가리킵니다. (게시판id가 ccc라면)
$f++; // 이것은 출력된 게시판 숫자를 세서 2로 나눠서
</tr>을 출력한다거나, <tr>을 출력한다거나 하는게 쓰는건데,
여기서는 colspan=2로 주고, 두칸을 차지하게 했기 때문에, 그담에 바로 </tr>이 나오도록
$f 에 1을 더해준 것입니다.

근데 이렇게만 해서는, 넓이만 두 칸을 차지할뿐, 출력되는 길이나 내용은 다른거와 같습니다.
목록에 출력되는 내용을 수정할려면,

skin/default.php 220~223 줄의 다음 내용을 수정해야 합니다.
// 최근 게시물
?>
<font class="f7" color="#D7D7D7"><font size=1>■</font> <?=$datte?></font> &nbsp;
<?=$smg?><?=$url?><?=strcut($subject[0], 43)?><?=$rlink?></a> <font class=t7><?=$zzz[3]?></font><br>
예를들어서, 제목도 없이 썸네일에 링크걸어서 출력하고 싶다고 할때는,
// 최근 게시물
if($mid == 'ccc') {
$rlmt = 10;
?>
<?=$url?><?=str_replace('=100', '=80', $simg)?></a>
<?
} else {
?>
<font class="f7" color="#D7D7D7"><font size=1>■</font> <?=$datte?></font> &nbsp;
<?=$url?><?=strcut($subject[0], $cut)?><?=$rlink?></a> <font class=t7><?=$zzz[3]?></font><br>
<?
}
?>
이렇게 하면 됩니다.
- - - str_replace('=100', '=80', $simg) 이 부분은,
$simg 라는 변수가 "<img width=100 height=100 src" 이런식으로 되어 있는데,
여기서 =100을 =80으로 바꿔서 사이즈를 줄인 것입니다.
사이즈를 줄이지 않고 그냥 100x100으로 출력할때는
<?=str_replace('=100', '=80', $simg)?> 대신 <?=$simg?> 이렇게 해주면 됩니다.

- - - $rlmt = 10; 이 부분은, 출력갯수입니다.
원래는 요약형은 3, 제목형-목록형은 5개 출력하게 되어 있는데 (index.php 1300, 1301줄)
10개로 늘린겁니다.

지금 얘기한대로 수정한 예제는 http://www2.ssam.biz/bd/
전체최근게시물의 스킨도 따로 정할수 있습니다. (관리자기능- 맨밑에...)
예제는 default.php를 수정해서 2.php로 저장하고,
default.css는 2.css로 저장하고, 레이아웃스킨을 2로 변경한 것입니다.

게시판의 배치순서는..
관리자기능-파일관리에서
data/boards.dat파일을 [크기/수정]으로 열어서
각 줄의 순서를 바꿔주면 됩니다.




srboard 이전 게시판의 blog.php는 못씁니다.
데이타처리가 달라져서--특히 구분자.
새로 수정해서 올리겠습니다.


1.3버전 index 773줄 } else if($xx == 0 && $type != 'b'){
} else if($xx == 0){ 이거로 바꿈..
그리고..
by Anna 안나 2008. 5. 26. 17:24
1. index.php 301~302줄
<?=join('',file($dxr.$id."/head.dat"))?>
<?
<?
if(!$_GET[comment]) echo join('',file($dxr.$id."/head.dat"));
이렇게 바꿨습니다..
덧글을 iframe으로 불러들이는데,, 덧글프레임에 저 부분까지 포함되어서 나오길래,,,

2. index.php 534줄
function rrp(no,cc,mt) { 함수 끝나기전에
self.resizeTo(document.body.scrollWidth,document.body.scrollHeight);
이거 추가했습니다.
덧글의 덧글을 열거나 닫으면, 코멘트창의 높이가 늘고/줄고 하는데,
IE에서는 코멘트창의 높이에 따라서, iframe의 높이가 달라집니다.
(FF에서는 안됩니다:다만 사용상의 큰 어려움은 없습니다.)

3. admin.php 788~ 832사이의 두어군데
admin.php 에서 bno.dat파일의 줄수를 세서 분화여부+갯수 파악하던거 저장된 값으로 대체했습니다.
srboard 1.0에서부터 이 값을 저장하기 시작했는데,,
그때 같이 수정했어야 하는걸, 이제야 .. 수정했습니다.

4. exe.php에서 rss출력하는 부분에
에러는 아니지만, ,에 필요없는 줄바꿈이 섞이길래, trim(줄바꿈,앞뒤공백삭제) 시켰습니다.

5. 게시판전체에 조회수 달았는데, 내역(관리자만 볼수 있음)을 봤더니
같은 ip가 무척 많은게, 세션으로 처리했더니, 브라우저 닫히면 세션이 사라져서..
쿠키도 병행되도록 했습니다.
- - 3일간의 기록은 시간,ip,QUERY_STRING,HTTP_REFERER 의 항목으로 보여지고,
- - data/count_3d.dat에 저장됩니다.
- - 3일이 지난 기록은 삭제되고, 그 날에 기록한 갯수만 data/count.dat에 저장됩니다.
- - count.dat 도 어떻게 해볼라다가,
- - 생각해보니 1년이 365일이니까, 1년 사용해서 365줄 누적되는 정도라면,
- - 뭐 별다른 정리가 필요없을거 같아서,, 그냥 뒀습니다.
- - 다음에 뭐 주간통계나 월별통계 같은걸.. 추가할까 생각중입니다.

6. 전체최근게시물에서
1.2버전에서 게시물링크가 $url이란 변수에 작은 썸네일을 포함했던걸,, 빼서
$smg로 스킨에 따로 출력하도록 했습니다.
- - 스킨을 개조하다보니까, http://www2.ssam.biz/bd/
- - 링크주소에 작은 썸네일이 포함되니까, 불편하더군요. 일일이 분리해줘야할 필요성도 있고.
- - 간편함을 위해서, $url 하나에 합쳤던건데,,
- - 기능적 제약이 더 큰거 같애서, 따로 뺐습니다.

7. <nobr> 태그와 클래스로 주로 길이를 잘랐는데,
제목에서는 같이 붙어있는 덧글수 같은게 먼저 짤려서,
글자수 자르는 함수로, 제목길이를 조정하고 있습니다.
그게 1.2버전에서는 -목록에서는 52, 최근게시물에서는 43이었는데,
rss리더게시판의 경우엔, 읽기권한이 있을때는 제목옆에 링크표시가 붙어있어서, 길이를 더 잡아먹어서,
$cut = 얼마;
if($type == 'r') $cut = 얼마;
하는식으로 바꿨는데, 그게 스킨파일입니다.

그래서 1.2버전의 skin/default.php 파일의 (이하 계속)
- - 120줄 위에
$cut = 46;
if($type =='r') $cut = 44;
이거 추가,

- - 146줄에 <?=strcut($subject[0], 52)?> 이거는
<?=strcut($subject[0], $cut)?> 이것으로,

- - 207줄 위에
$cut = 40;
if($type =='r') $cut = 38;
이거 추가.

- - 219~220줄에
<?=$url?><?=strcut($subject[0], 43)?><?=$rlink?></a> <font class=t7><?=$zzz[3]?></font>
<textarea name='<?=$mid?>' style='display:none;'><?=$simg?><?=$mmb?></textarea><br>
이거는
<?=$smg?><?=$url?><?=strcut($subject[0], $cut)?><?=$rlink?></a> <font class=t7><?=$zzz[3]?></font><br>
<textarea name='<?=$mid?>' style='display:none;'><?=$simg?> &nbsp;<?=$mmb?></textarea>
이걸로,,, 바뀌었습니다.


압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.
by Anna 안나 2008. 5. 26. 17:23
기존에 여기서 배포한 게시판을 쓰던 분들에게 해당되는 것입니다.


/*
* srboard 1.2 데이타형으로 변환하는 프로그램입니다.
* 대상은 http://www2.ssam.biz/blog/ 여기서 배포한 게시판인데..
* 어느버전부터 변환이 가능한지.. 잘 모르겠습니다. 데이타형태가 이전에 어떻게 되어 있는지 몰라서
* 하지만 꽤 오래전의 것도 변환가능할겁니다.
* .........
* 관리자로 로그인한 후에, 이걸 실행시키고, srboard 1.2로 파일을 바꿉니다.
* 관리자로그인했을때 실행할수 있고,-- 중복실행하면 안됩니다. 변환후에 이 파일은 삭제하세요.
*/


기존의 제로보드스킨형 게시판도 변환 가능합니다.
(데이타형태는 노스킨버전하고 다를바가 없었으니까)
다만,, 그렇게 되면, 더이상 제로보드스킨을 사용할수 없게 됩니다.

srboard로 파일 업데이트하지 않은 상태 = 기존의 게시판인 상태에서
_update1.2.rar 파일을 압축풀고,
exe.php 등이 위치한 곳에 FTP로 업로드하고,
게시판에서 관리자로그인을 한 담에,
열어서, 실행시킵니다. -- 관리자가 아니면 실행되지 않도록 해놨기 때문에 --
그리고 그 즉시 srboard로 게시판을 업데이트합니다.
... 데이타를 변환한 뒤에 기존 게시판 파일인 상태에서 접속하면,, 당연히 에러가 나겠는데,
그게 일부 데이타파일을 혹시 변조시킬지도 몰라서,....
변환뒤에 그 즉시 업데이트하시길 권합니다.
by Anna 안나 2008. 5. 26. 17:22
srboard 1.0 에서 뭔가 많이 수정했습니다.

1 - - 우선 index.php 1373줄 + 86400 을 - 86400으로 수정 // 오류수정 한게 하나있고,,

2 - - exe.php 173줄 부근에 있던
if($_POST[x] > 0) $x = "^".$_POST[x];
else if($_GET[x] > 0) $x = "^".$_GET[x];
else $x = '';
이 세줄을 15줄로 옮김

3 - - index.php에 data함수를 없애고
if($x > 0) $idd = $id."^".$x;
else $idd = $id;
이 두줄로 교체

4 - - 분화한 이전게시물에서 트랙백주소받는거 원활히 되도록 여기저기 수정.

5 - - 분화하기 전에 공지사항이 있었을때,
공지삭제는 관리자기능 - 게시판관리에서만 가능한데, ( 번호^ 형식의 추가삭제 )
거기서 분화한 이전 게시물을 공지로 등록할수는 없습니다.
에러납니다.

6 - - 덧글칸 엔터누르면 높이 늘어나는거 - ie에만 적용되도록 수정+ iframe 높이도 자동으로 늘어나도록 수정
---FF에서는 덧글칸높이는 늘어나는데, 창자체 높이가 그대로여서, 안보이게 되기 때문에...

7 - - 전체최근게시물에서.. 스킨에 $simg 노출시킴.. : 수정해서 활용할때 쓰라고..

등등....
+ 스킨도 두어군데 바뀌었습니다. 변수이름하고,, 내용
앞으로는 스킨의 골조(?)가 바뀌게 되면 어디가 어떻게 바뀌었는지
먼저꺼하고 비교해서, 설명하겠지만
이번엔 밤사이에 다운로드해서, 수정해서 사용하는 분 없으리라고보고....
그냥 넘어가겠습니다.

압축풀어 계정에 업로드하고, data폴더의 권한을 777주고,
admin.php 접속해서 관리자회원가입을 합니다(첫번째 가입자를 관리자로 인식합니다.)
그리고 index.php 접속해서 사용합니다.
by Anna 안나 2008. 5. 26. 17:22
| 1 2 3 |