채팅방 예제에 보면
채팅방목록에 방문자목록없는 작은 채팅창이 있는데,
홈페이지나 등등에 넣어서 쓸수 있게,
그 부분만 짤라봤습니다.
소스길이는 143줄

다운로드 : http://www2.ssam.biz/blog/img/c.rar

아래가 소스입니다.
<?
session_start();
header ("Content-Type: text/html; charset=UTF-8");
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
if($_POST[xname] && $_POST[text]) {
if(!$_SESSION[name] || $_SESSION[name] != $_POST[xname]) {
$_POST[xname] = str_replace('<', '&lt;', str_replace(' ', '', stripslashes(trim($_POST[xname]))));
$_POST[xname] = preg_replace("` [\s]`i", "", $_POST[xname]);
$_POST[xname] = preg_replace("`[\x1b\x18\x7f\t]`", "", $_POST[xname]);
$nickc = "";
if($_SESSION[name]) $nickc = "--\x1b<font class=mc><font class=mm>".$_SESSION[name]."</font> → <font class=mm>".$_POST[xname]."</font>로 닉변경함</font>\n";
session_unregister("name");
$name = $_POST[xname];
session_register("name");
}
if($_POST[xname] && $_POST[text]) {
$_POST[text] = preg_replace("`[\x1b\x18\x7f<]`", "", stripslashes($_POST[text]));
$fp = fopen("./_text", "a");
fputs($fp, $nickc.$_POST[xname]."\x1b".$_POST[text]."\n");
fclose($fp);
if(filesize("./_text") > 2048) {
$fp = fopen("./_text", "r");
fread($fp, 1536);
fgets($fp);
while(!feof($fp)) $fpo .= fgets($fp);
fclose($fp);
$fp = fopen("./_text", "w");
fputs($fp, $fpo);
fclose($fp);
}
}
exit;
}
if($_GET[tex]) {
if(file_exists("./_text")){
if($_GET[tex] == -1) $_GET[tex] = 0;
$fze = filesize("./_text");
if($fze != $_GET[tex]) {
echo $fze."\x7f";
$fp = fopen("./_text", "r");
while(!feof($fp)) {
if($_GET[tex] && $fze > $_GET[tex]) fread($fp, $_GET[tex]);
if($fpo = trim(fgets($fp))) echo $fpo."\x7f";
}
fclose($fp);
}
}
exit;
}
if($_GET[delete] == "text" && $_SESSION[admin_pass]) {
$fp = fopen("./_text", "w");
fclose($fp);
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>채팅방</title>
</head>
<body>
<script>
function go() {
var url = '?tex=' + document.getElementsByName('ntim')[0].value;
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
var str = xmlHttp.responseText;
if(str) {
var vew = str.split("\x7f");
allc = vew.length -1;
if(allc > 1) {
document.getElementsByName('ntim')[0].value = vew[0];
if(document.getElementById('AA').innerHTML == '') str = "<table border=0 cellspacing=0 cellpadding=0 width=100% style='margin-bottom:20;table-layout:fixed'>";
else str = "";
for(i = 1;i < allc;i++){
var nam = vew[i].split("\x1b");
str += "<tr class=trh><td class=name>"+ nam[0] +"</td><td width=10>:</td><td class=memo>"+ nam[1] +"</td></tr>";
str += "<tr><td colspan=3 bgcolor=#E6E6E6 height=1><img height=1></td></tr>";
}
str += "</table>";
document.getElementById('AA').innerHTML = document.getElementById('AA').innerHTML.substring(0,document.getElementById('AA').innerHTML.length-8) + str;
document.getElementById('AA').scrollTop = 10000000;
}
} else window.status = '새 글이 없습니다.';
setTimeout('go()', 1000);
delete xmlHttp;
}
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}

function wte(){
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
var param = '?&xname='+ document.getElementsByName("xname")[0].value.replace(/[&'"]/gi,"") +'&text='+ document.getElementsByName("text")[0].value.replace("&","%26");
xmlHttp.open("POST", param, false);
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlHttp.setRequestHeader("Content-length", param.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.send(param);
document.getElementsByName('text')[0].value = '';
document.getElementsByName('text')[0].focus();
return false;
}
window.onload = function(){setTimeout("document.getElementsByName('ntim')[0].value='-1';", 50);}
setTimeout('go()', 100);
</script>
<center>
<table border=0 cellspacing=0 cellpadding=5 width=330 style='border:1px solid black'>
<tr height=200><td colspan=3><div id=AA style='width:320;height:200'></div></td></tr>
<tr height=30><td colspan=3><input type=text name='xname' maxlength=10 style='width:65' value='<?=$_SESSION[name]?>'>
<input type='text' name='text' style='width:200;'>
<input type='submit' value='쓰기' onclick="wte()" class='button'>
<input type='hidden' name='ntim' value='-1'>
</td></tr>
</table>
</center>
<style>
body {font-size:9pt;font-family:gulim;word-break:break-all;}
td {word-break:break-all;font-size:9pt;}
.mm {color:#D7D7D7;font-weight:bold;font-family:gulim;text-align:center;padding-top:5}
.mc {color:#D7D7D7;font-family:gulim;text-align:center;padding-top:5}
.button {background-color:#D7D7D7;border:0;border:1px solid black;margin-right:4px;margin-left:4px;width:35px}
.name {width:50;padding-left:5;font-weight:bold;}
.memo {padding:5px 0px 5px 5px;width:210;}
.trh {padding:6px 0px 6px 0px;}
#AA {overflow-x: hidden; overflow-y: auto;background-color:#FFFFFF;border:1px solid black; }
</style>
</body>
</html>
보기 / 닫기

소스 53줄에 데이타초기화하는 부분이 있는데,
이건 각 홈페이지의 관리자만 가능해야 하니까,,
링크도 현재 안넣었습니다.

<a href='?delete=text'>본문초기화</a>
이렇게 링크를 적당한 곳에 넣어주면 됩니다.

인코딩이 이건 utf-8로 저장되어야 합니다.
아마 홈페이지들하고 인코딩이 다를거 같은데,
iframe으로 불러들이면 되잖을까 합니다.
높이가 고정된 것이니까..

소스에 데이타를 "_text" 파일에 저장하도록 되어 있는데,
하여튼 쓰기권한이 열린( -- 707 또는 777) 폴더로 경로를 잡으면 됩니다.
by Anna 안나 2008. 5. 26. 18:10