유창화님의 채팅수정소스중에서

· 2007-04-12 (목) 22:54:29 · 1986 · 5
현재 접속자 부분만을 뺄려면 어떻게 하면 되나요?
 
한줄씩 빼보니  접속자 부분만을 남기게 되면 접속자가 보이지 않는군요.
 
일반접속스킨의 경우 홈페이지에 접속한 전체 접속자가 보이는 반면
 
채팅소스에서는 페이지에 접속한 사람만 보이는 것 같아 유용한 면이 많이 있네요.
|

댓글 5개

가장 간단한 방법은 <div> 크기 조정하고
보여주고 싶지않은 부분을 모두 type=hidden 으로 처리하시면 되지않을까요?

실제 출력을 담당하는 부분은 chat.php 파일의 상단부근에 있습니다...^^
2007-04-13 (금) 10:21:14
히든으로 감추어도 채팅창 내용나오는 부분이 커집니다. 메시지 입력창이나 이름부분은 히든으로 감추면 접속자가 안보이네요. ㅠㅠ
<?
include_once("_common.php");
include_once("../head.sub.php");
?>
<br>

<!----------------------------------------------------------------------------------->
<!-- 채팅 -->
<!----------------------------------------------------------------------------------->
<center>
<div id='chatting' style="width=220px;text-align:center;float:center;">
<span style='width:200px;padding:5px;font-size:9pt;font-family:굴림;line-height:130%;text-align:left;'><b>현재접속자</b></span>
<div id='chat_members' style='width:200px;height:300px;overflow-y:scroll;border:1px solid #000000;padding:5px;font-size:9pt;font-family:굴림;line-height:130%;text-align:left;float:right;' onmouseover='is_scroll=true;' onblur='is_scroll=false'></div>
<div style="clear:both; padding:5px 0 0 0;"></div>
<input type='hidden' id='last_id'>
<input type='hidden' id='chat_name'>
</div>

<script>
// request 객체 생성
var req = null;
function create_request() {
var request = null;
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml12.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = null;
}
}
}
if (request == null)
alert("Error creating request object!");
else
return request;
}

var req = create_request();

var timer_id;
var is_scroll = false;

function chat_update() {

var last_id = document.getElementById('last_id').value;

var url = 'chat_update.php';
var param = '';
param += '&last_id=' + escape(last_id);
param += '&chat_ss=' + escape('<?=session_id()?>');

req.open("POST", url, true);
req.onreadystatechange = chat_update_complete;
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(param);
}

function chat_update_complete() {
if (req.readyState == 4) {
if (req.status == 200) {
chat_result_display(req);
}
}
}

function chat_get() {
var chat_name = document.getElementById('chat_name').value;
var last_id = document.getElementById('last_id').value;

var url = 'chat_update.php';
var param = '';
param += 'name=' + encodeURIComponent(chat_name);
param += '&last_id=' + last_id;
param += '&chat_ss=' + escape('<?=session_id()?>');

req.open("POST", url, true);
req.onreadystatechange = chat_get_complete;
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(param);
}

function chat_get_complete() {
if (req.readyState == 4) {
if (req.status == 200) {
chat_result_display(req);

timer_id = setTimeout("chat_get()", 1000);

}
}
}

function chat_result_display(req) {

var chat_members = req.responseXML.getElementsByTagName("chat_members");
//alert(req.responseText);

document.getElementById('chat_members').innerHTML = '';
for (i=0; i<chat_members.length; i++) {
document.getElementById('chat_members').innerHTML += chat_members[i].getElementsByTagName("ch_name")[0].firstChild.nodeValue + "(" + chat_members[i].getElementsByTagName("ch_ip")[0].firstChild.nodeValue + ")</br>";
}
}

document.getElementById('chat_name').value = "<?=$member[mb_id]?$member[mb_nick]:'손님_'.rand(1,1000)?>";

chat_get();
</script>
<!----------------------------------------------------------------------------------->
</center>
<?
include_once("../tail.sub.php");
?>
<?
/*******************************************************************************
** 공통 변수, 상수, 코드
*******************************************************************************/
error_reporting(E_ALL ^ E_NOTICE);

// 보안설정이나 프레임이 달라도 쿠키가 통하도록 설정
header('P3P: CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"');

if (!isset($set_time_limit)) $set_time_limit = 0;
@set_time_limit($set_time_limit);

// 짧은 환경변수를 지원하지 않는다면
if (isset($HTTP_POST_VARS) && !isset($_POST)) {
$_POST = &$HTTP_POST_VARS;
$_GET = &$HTTP_GET_VARS;
$_SERVER = &$HTTP_SERVER_VARS;
$_COOKIE = &$HTTP_COOKIE_VARS;
$_ENV = &$HTTP_ENV_VARS;
$_FILES = &$HTTP_POST_FILES;

if (!isset($_SESSION))
$_SESSION = &$HTTP_SESSION_VARS;
}

//
// phpBB2 참고
// php.ini 의 magic_quotes_gpc 값이 FALSE 인 경우 addslashes() 적용
// SQL Injection 등으로 부터 보호
//
if( !get_magic_quotes_gpc() )
{
if( is_array($_GET) )
{
while( list($k, $v) = each($_GET) )
{
if( is_array($_GET[$k]) )
{
while( list($k2, $v2) = each($_GET[$k]) )
{
$_GET[$k][$k2] = addslashes($v2);
}
@reset($_GET[$k]);
}
else
{
$_GET[$k] = addslashes($v);
}
}
@reset($_GET);
}

if( is_array($_POST) )
{
while( list($k, $v) = each($_POST) )
{
if( is_array($_POST[$k]) )
{
while( list($k2, $v2) = each($_POST[$k]) )
{
$_POST[$k][$k2] = addslashes($v2);
}
@reset($_POST[$k]);
}
else
{
$_POST[$k] = addslashes($v);
}
}
@reset($_POST);
}

if( is_array($_COOKIE) )
{
while( list($k, $v) = each($_COOKIE) )
{
if( is_array($_COOKIE[$k]) )
{
while( list($k2, $v2) = each($_COOKIE[$k]) )
{
$_COOKIE[$k][$k2] = addslashes($v2);
}
@reset($_COOKIE[$k]);
}
else
{
$_COOKIE[$k] = addslashes($v);
}
}
@reset($_COOKIE);
}
}


// PHP 4.1.0 부터 지원됨
// php.ini 의 register_globals=off 일 경우
@extract($_GET);
@extract($_POST);
@extract($_SERVER);

// 완두콩님이 알려주신 보안관련 오류 수정
// $member 에 값을 직접 넘길 수 있음
$config = array();
$member = array();
$board = array();
$group = array();
$g4 = array();

$g4['path'] = '../';

include_once("$g4[path]/lib/constant.php"); // 상수 정의
include_once("$g4[path]/config.php"); // 설정 파일
include_once("$g4[path]/lib/common.lib.php"); // 공통 라이브러리

//-------------------------------------------
// SESSION 설정
//-------------------------------------------
ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.)

session_save_path("{$g4['path']}/data/session");

if (isset($SESSION_CACHE_LIMITER))
@session_cache_limiter($SESSION_CACHE_LIMITER);
else
@session_cache_limiter("no-cache, must-revalidate");

ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분)
ini_set("session.gc_maxlifetime", 1440); // session data의 gabage collection 존재 기간을 지정 (초)

session_set_cookie_params(0, "/");
ini_set("session.cookie_domain", $g4['cookie_domain']);

@session_start();



class chat {

var $cfg;//그누보드 환경설정
var $g4;//그누보드 환경설정
var $chat_file_member;

var $chat_member = Array();//현재 사용중인 사람 정보

var $chat_members = Array();//현재 접속자 정보
var $xml_members;//현재접속자 xml
var $list = Array();

function chat($cfg, $g4, $chat_member){

$this->cfg = $cfg;
$this->g4 = $g4;
$this->chat_file_members = $this->g4['path'] . '/data/chat_members.dat';

$this->chat_member = $chat_member;
if (strtoupper($g4['charset']) != 'UTF-8') {//인코딩이 다른경우 인코딩 변환

if (!empty($this->chat_member['name']) && is_utf8($this->chat_member['name']))
$this->chat_member['name'] = convert_charset('UTF-8','CP949',$this->chat_member['name']);

}

$this->get_chat_member();


}
//파일에서 현재 접속자 뽑아옴
function get_chat_member(){

$text_members = '';
$xml_members = '';
$temp = @file($this->chat_file_members);
if (is_array($temp)){

$i = 0;
foreach($temp as $val){

list($save_chat_ss, $save_name, $save_time, $save_ip) = explode("\t", trim($val));
if ($save_chat_ss == $this->chat_member['chat_ss']) {

continue;
}
else {

if (time() > $save_time + 2) continue;

$this->chat_members[$i]['chat_ss'] = $save_chat_ss;
$this->chat_members[$i]['name'] = $save_name;
$this->chat_members[$i]['time'] = $save_time;
$this->chat_members[$i]['ip'] = $save_ip;

$text_members .= $this->chat_members[$i]['chat_ss'] . "\t" . $this->chat_members[$i]['name'] . "\t" . $this->chat_members[$i]['time'] . "\t" . $this->chat_members[$i]['ip'] . "\n";

$xml_members .= "<chat_members>\n";
$xml_members .= "<ch_name>".get_text(addslashes(strip_tags($this->chat_members[$i]['name'])))."</ch_name>\n";
$xml_members .= "<ch_time>".get_text(addslashes(strip_tags($this->chat_members[$i]['time'])))."</ch_time>\n";
$xml_members .= "<ch_ip>".get_text(addslashes(strip_tags($this->chat_members[$i]['ip'])))."</ch_ip>\n";
$xml_members .= "</chat_members>\n";
$i++;
}
}
}

$this->chat_members[$i]['chat_ss'] = $this->chat_member['chat_ss'];
$this->chat_members[$i]['name'] = $this->chat_member['name'];
$this->chat_members[$i]['time'] = time();
$this->chat_members[$i]['ip'] = $_SERVER['REMOTE_ADDR'];

$text_members .= $this->chat_members[$i]['chat_ss'] . "\t" . $this->chat_members[$i]['name'] . "\t" . $this->chat_members[$i]['time'] . "\t" . $this->chat_members[$i]['ip'] . "\n";

$xml_members .= "<chat_members>\n";
$xml_members .= "<ch_name>".get_text(addslashes(strip_tags($this->chat_members[$i]['name'])))."</ch_name>\n";
$xml_members .= "<ch_time>".get_text(addslashes(strip_tags($this->chat_members[$i]['time'])))."</ch_time>\n";
$xml_members .= "<ch_ip>".get_text(addslashes(strip_tags($this->chat_members[$i]['ip'])))."</ch_ip>\n";
$xml_members .= "</chat_members>\n";

//파일에 저장
$fp = fopen ($this->chat_file_members, 'w');
fwrite($fp, $text_members);
fclose($fp);

$this->xml_members = $xml_members;
}

function print_xml(){

header("Content-Type:text/xml;");

$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml .= "<chatting>";
if (!empty($this->xml_members))$xml .= $this->xml_members;
$xml .= "</chatting>";
if (strtoupper($g4['charset'])!='UTF-8') $xml = convert_charset('CP949','UTF-8',$xml);
echo $xml;
}

}

/*
-----------------------------------------------------------
텍스트가 utf-8 인지 검사하는 함수
-----------------------------------------------------------
*/
function is_utf8($string) {

// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}

/*
-----------------------------------------------------------
Charset 을 변환하는 함수
-----------------------------------------------------------
iconv 함수가 있으면 iconv 로 변환하고
없으면 mb_convert_encoding 함수를 사용한다.
둘다 없으면 사용할 수 없다.
*/
function convert_charset($from_charset, $to_charset, $str) {
if( function_exists('iconv') )
return iconv($from_charset, $to_charset, $str);
elseif( function_exists('mb_convert_encoding') )
return mb_convert_encoding($str, $to_charset, $from_charset);
else
die("Not found 'iconv' or 'mbstring' library in server.");
}

$chat_member = Array();
$chat_member['name'] = $name;
$chat_member['last_id'] = $last_id;
$chat_member['chat_ss'] = $chat_ss;
$chat = new chat($cfg, $g4, $chat_member);
$chat->print_xml();

?>
2007-04-13 (금) 13:07:11
감사합니다. 질문올려서 해결된 몇안되는 답이네요.
[http://lll.djcic.net]
댓글을 작성하시려면 로그인이 필요합니다.

그누4 질문답변

66,531건

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기 기존 게시물은 열람만 가능합니다.

+
제목 글쓴이 날짜 조회
07-04-13 조회 1,828
07-04-13 조회 1,283
07-04-13 조회 2,567
07-04-13 조회 1,600
07-04-13 조회 1,656
07-04-13 조회 1,789
07-04-13 조회 1,679
07-04-13 조회 1,658
07-04-13 조회 1,607
07-04-13 조회 2,052
07-04-13 조회 1,761
07-04-13 조회 1,682
07-04-13 조회 1,644
07-04-12 조회 1,987
07-04-12 조회 1,603
07-04-12 조회 1,532
07-04-12 조회 1,614
07-04-12 조회 1,606
07-04-12 조회 1,603
07-04-12 조회 2,586