Web Programming >> PHP Programming
|
[목차] |
제19장 대화방 만들기(MySQL)
2. 대화방 수정(대화중인 회원 목록 보기)
1. 대화방의 개체 관계도
앞에서 만든 대화방은 위와 같이 개체가 서로 관계되는 부분이 없습니다. 그러므로, 대화방의 입실한 회원를 알 수가 없게 됩니다. 그러므로, 회원이 대화방에 입실했다는 관계를 테이블로 저장해야 합니다.
2. 대화방 입실회원 목록보기 기능 추가
지금까지 만든 대화방은 대화방에 들어가 대화가 가능하나, 이대화방에 누가 입실하였는지 알 수가 없어 대화가 잘이루어지지 못하는 문제가 있습니다. 이번에는 이것을 수정해 보도록 하겠습니다.
2.1 대화방 입실 회원 저장용 테이블 만들기 CREATE TABLE room_login ( uid int(10) unsigned DEFAULT '1' NOT NULL auto_increment, chat_id varchar(30) DEFAULT '' NOT NULL, room_uid int(10) unsigned DEFAULT '' NOT NULL, PRIMARY KEY (uid) );
2.2 대화방 목록보기 (room_list.html)
<? if(!$user_id || !$user_name) { echo "<SCRIPT>self.close();</SCRIPT>"; exit; } ?>
<center><h1>Lee LAB 대화방 </h1><center> <hr width=80%> <? ########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; }
$message = "님께서 입장하였습니다."; $result= mysql_query ("select * from room ", $dbconn);
$Total = mysql_num_rows($result);
if (!$Total){ echo ("<center><h1>아직 생성된 방이 없네요 </h1><center>"); }else{ echo (" <center> <table width='52%' border='0' cellspacing='0' cellpadding='0'> <tr bgcolor='#000000'> <td height='26' width='90%'> <div align='center'><font color='#FFFFFF' size='2'>생성된 대화방 이름 </font></div> </td> </tr> "); $counter = 0;
while ($counter < $Total): $room_uid = mysql_result($result, $counter, "uid"); $room = mysql_result($result, $counter, "room"); echo (" <tr> <td height='36' width='90%'><a href='room_login.html?room_uid=$room_uid&message=$message'>$room</td> </tr> "); $counter = $counter +1; endwhile; }
echo(" <center> <FORM ACTION='room_create.html' METHOD='POST'> <table width='37%' border='1' cellspacing='0' cellpadding='0' height='86' bordercolor='#000000'> <tr bgcolor='#999999'> <td height='29'> <div align='center'><font color='#FFFFFF' size='2'>◈ 대화방 ◈</font></div> </td> </tr> <tr> <td> <div align='center'><font size='2'>대화방제목 <input type=text name=room size=15> <input type=submit value='대화방만들기' name='submit'> </font> </div> </td> </tr> </table> <font size='2'>대화방제에 공백이 있으면 안됩니다. </font> </form> </center> "); ?>
2.3 대화방 만들기 (room_create.html) <? if(!$user_id || !$user_name) { echo "<SCRIPT>self.close();</SCRIPT>"; exit; }
if (!$room) { echo (" <script> window.alert ('대화방제목은?') history.go(-1) </script> "); exit; }
$message_dir = "./data"; //message 디랙토리의 절대경로
########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; }
$result= mysql_query ("select * from room where room = '$room'", $dbconn); $Total = mysql_num_rows($result);
if($Total) { echo (" <script> window.alert ('같은 대화방 제목이 있습니다.') history.go(-1) </script> "); exit; }
$room_uid = time(); mysql_query("insert into room (uid,room) values($room_uid,'$room')", $dbconn);
mysql_query("insert into room_login (chat_id,room_uid) values('$user_id',$room_uid)", $dbconn);
if($tomsg == "") { $tomsg = all; }
$newmessage = "$tomsg|$user_id|<font size=-1 color=$ucolor><B>$user_name</B>님께서 대화방을 만들었습니다.</font><br>";
$fp=fopen ("$message_dir/${room_uid}.html", "w"); fwrite($fp, "$newmessage\n"); fclose($fp); echo (" <script> location.replace('room_login.html?room_uid=$room_uid'); </script> ");
?>
2.4 대화방 입실하기 (room_in.html) <? if(!$user_id || !$user_name) { echo "<SCRIPT>self.close();</SCRIPT>"; exit; }
$message_dir = "./data"; //message 디랙토리의 절대경로
########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; } $query = "select * from room_login where room_uid = '$room_uid' AND chat_id = '$user_id'"; //echo $query; $result= mysql_query ($query, $dbconn); $Total = mysql_num_rows($result); if($Total) { echo (" <script> location.replace('room_login.html?room_uid=$room_uid'); </script> "); exit; }
mysql_query("insert into room_login (chat_id,room_uid) values('$user_id',$room_uid)", $dbconn);
$lines = file("${message_dir}/${room_uid}.html");
if($tomsg == "") { $tomsg = all; }
$newmessage = "$tomsg|$user_id|<font size=-1 color=$ucolor><B>$user_name</B>님께서 대화방에 입실하였습니다.</font><br>";
$fp=fopen ("${message_dir}/${room_uid}.html", "w");
fwrite($fp, "$newmessage\n");
for ($i = 0; $i < 20; $i++) { fwrite($fp, "$lines[$i]"); } fclose($fp);
echo (" <script> location.replace('room_login.html?room_uid=$room_uid'); </script> ");
?>
2.5 대화창 프래임화면 (room_login.html) <? if(!$user_id || !$user_name) { echo "<SCRIPT>self.close();</SCRIPT>"; exit; }
echo (" <frameset rows='*,145' frameborder='NO' border='0' framespacing='0'> <frameset cols='*,200' frameborder='NO' border='0' framespacing='0'> <frame name='msg_list' src='say.html?room_uid=$room_uid'> <frame name='chat_list' src='chat_list.html?room_uid=$room_uid' scrolling='NO' noresize > </frameset> <frame name='msg_input' scrolling='NO' noresize src='chat.html?room_uid=$room_uid'> </frameset> <noframes><body bgcolor='#FFFFFF'> "); ?>
파일명 : say.html <?
//message 디랙토리의 절대경로 $message_dir = "./data";
$lines = file("${message_dir}/${room_uid}.html"); header("Content-type: text/html");
print "<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='5; url=$PHP_SELF?room_uid=$room_uid'></HEAD><BODY BGCOLOR='FFFFFF'>";
for($i=0; $i<=20;$i++) { $talk = $lines[$i]; $lsat = split('\|', $talk); if(($lsat[0] == "") || ($lsat[0] == "all")){ print "$lsat[2]"; } else{ if($lsat[0] == $user_name) print "☎귓속말:$lsat[2]"; elseif($lsat[1] == $user_name) print "☏귓속말:$lsat[2]"; } } exit; ?>
파일명 : chat.html 대화내용입력을 처리하는 프로그램 <? if(!$user_id || !$user_name) { echo "<SCRIPT>self.close();</SCRIPT>"; exit; }
########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; }
//message 디랙토리 절대경로 $message_dir = "./data";
//대화방 퇴장시 연결될 페이지 URL $redirect_url = "./room_list.html";
// 서브루틴 function error() { header("Content-type: text/html"); return print"<body bgcolor=ffffff><h1>에러임돠 열심히 해보세요</body></html>"; exit;
}
function write($username, $ucolor, $room_uid, $message, $tomsg, $ear,$message_dir){ $lines = file("${message_dir}/${room_uid}.html");
if($tomsg == "") { $tomsg = all; } $newmessage = "$tomsg|$username|<font size=-1 color=$ucolor><B>$username:</B>$message</font><br>";
$fp=fopen ("${message_dir}/${room_uid}.html", "w");
fwrite($fp, "$newmessage\n");
for ($i = 0; $i < 20; $i++) { fwrite($fp, "$lines[$i]"); } fclose($fp);
}
// if($room == "") { error; }
// 글자색 지정
$ucolor=$ucolor; if($ucolor == "") { $uc1 = "checked"; } if($ucolor == "blue") { $uc1 = "checked"; } if ($ucolor == "brown") { $uc2 = "checked"; } if ($ucolor == "black") { $uc3 = "checked"; } if ($ucolor == "green") { $uc4 = "checked"; } if ($ucolor == "magenta") { $uc5 = "checked"; } if ($ucolor == "RED") { $uc6 = "checked"; }
// LOG OUT if (!strcmp($logoff ,"ok")) { $date = date( "l dS of F Y h:i:s A" ); $message = "$message($date)"; write($user_name, $ucolor, $room_uid, $message, $tomsg, $ear,$message_dir);
// $query="delete from room_login where chat_id='$user_id' "; $result= mysql_query($query, $dbconn);
// 대화방에 입실한 회원이 없으면 대화방을 삭제하는 부분 $result= mysql_query("select * from room_login where room_uid='$room_uid' ", $dbconn); $Total = mysql_num_rows($result); if(!$Total) { $query="delete from room where uid='$room_uid' "; $result= mysql_query($query, $dbconn);
unlink("${message_dir}/${room_uid}.html");
}
print "<META HTTP-EQUIV=Refresh CONTENT='0; url=$redirect_url'>"; exit; }
header("Content-type: text/html"); print" <HTML> <HEAD> <TITLE>대화방</TITLE> <style> a:link, a:visited, a:active { text-decoration:none; color:#003366; } A:hover{color:blue;} body, tr, td { font-size : 10pt;} </style>
<SCRIPT LANGUAGE='JavaScript'> <!-- function FocusOn() { document.form_submit.message.focus(); return; }
function chat() { form_submit.submit();
}
//--> </SCRIPT>
</HEAD> <BODY bgcolor=#FFFFFF text=#000000 topmargin=5 onLoad=FocusOn()> <table cellspacing=0 cellpadding=1 border=0> <tr> <td valign=top>
<table cellspacing=0 cellpadding=3 border=0> <tr> <td> 글자색선택 : </td> <form name='form_submit' action='chat.html' method='post'> <td> <input type=radio name=ucolor value=#003366 checked><font color=#003366>♥</font> <input type=radio name=ucolor value=brown ><font color=brown>♥</font> <input type=radio name=ucolor value=black ><font color=black>♥</font> <input type=radio name=ucolor value=green ><font color=green>♥</font> <input type=radio name=ucolor value=magenta ><font color=magenta>♥</font> <input type=radio name=ucolor value=red ><font color=red>♥</font> <input type=radio name=ucolor value=#ff9900 ><font color=#ff9900>♥</font> <input type=radio name=ucolor value=blue ><font color=blue>♥</font> <input type=radio name=ucolor value=gold ><font color=gold>♥</font> </td> </tr> <tr> <td> 대 화 입 력 : </td> <td> <input name=room_uid type=hidden value='$room_uid'> <input type=text name=message value='' size=45> <a href='javascript:form1.submit()'>Logout</a> </td> </form> <form name= form1 action='chat.html' method='post' target=_top> <input name=room_uid type=hidden value='$room_uid'> <input name='logoff' type=hidden value='ok'> <input type=hidden name=message value='님이 퇴장하셨습니다!'> </form> </tr> </TABLE> </td> </tr> </table> ";
if ($message) { write($user_id, $ucolor, $room_uid, $message, $tomsg, $ear,$message_dir); echo(" <SCRIPT LANGUAGE='JavaScript'> <!-- top.msg_list.document.location.href='say.html?room_uid=$room_uid&message=$message' //--> </SCRIPT>"); } exit;
?>
파일명 : chat_list.html 대화방 입실회원 목록 출력 프로그램 <? if(!$user_id || !$user_name) { echo "<SCRIPT>top.close();</SCRIPT>"; exit; }
########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; }
$result= mysql_query ("select room from room where uid='$room_uid' ", $dbconn); $room_name = mysql_result($result,0,0);
$result= mysql_query ("select * from room_login where room_uid='$room_uid' ", $dbconn); $Total = mysql_num_rows($result);
if ($Total){ echo (" <center> <table width='150' border='0' cellspacing='0' cellpadding='0'> <tr bgcolor='#000000'> <td height='26' > <div align='center'><font color='#FFFFFF' size='2'><b>$room_name </b></font></div> </td> </tr> "); $counter = 0;
while ($counter < $Total) { $chat_id = mysql_result($result, $counter, "chat_id"); $result1= mysql_query ("select name from member where id='$chat_id' ", $dbconn);
$chat_name = mysql_result($result1,0,0);
echo (" <tr> <td height='26'>$chat_name</td> </tr> "); $counter = $counter +1; } } ?> </table> <? echo(" <META HTTP-EQUIV='Refresh' CONTENT='5; url=chat_list.html?room_uid=$room_uid'> "); exit; ?>
3. 대화내용 출력창 수정하기 대화내용 출력창에서는 대화내용이 위에서 아래로 내려가면서 대화내용이 나타납니다. 이것을 아래에서 위로 스크롤되면서 나타나게 수정하는 것이 이장에서의 문제입니다. 대화내용저장하는 프로그램을 수정해야 하므로, 수정해야할 파일명은 chat.html입니다. chat.html프로그램은 대화내용의 20줄만을 저장합니다. file()함수를 통해 $lines배열에 파일의 내용을 저장합니다. 이 배열의 전체 수를 구하기 위해 count()함수를 사용합니다. 그러면 $total값이 나옵니다. $total = count($lines); 대화 내용의 아래부분의 20줄를 저장해야하므로, 아래와 같이 저장하는 반복문의 시작($start)와 끝($end)를 구합니다. $start = $total - 20; if($start < 0) $start = 0; $end = $total; 기존의 대화내용을 저장하고, 방금입력한 대화내용을 추가로 저장하면 됩니다. for ($i = $start; $i < $end; $i++) { fwrite($fp, "$lines[$i]"); } fwrite($fp, "$newmessage\n");
파일명 : chat.html
<? if(!$user_id || !$user_name) { echo "<SCRIPT>self.close();</SCRIPT>"; exit; }
########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; }
//message 디랙토리 절대경로 $message_dir = "./data";
//대화방 퇴장시 연결될 페이지 URL $redirect_url = "./room_list.html";
// 서브루틴 function error() { header("Content-type: text/html"); return print"<body bgcolor=ffffff><h1>에러임돠 열심히 해보세요</body></html>"; exit;
}
function write($username, $ucolor, $room_uid, $message, $tomsg, $ear,$message_dir){ $lines = file("${message_dir}/${room_uid}.html");
if($tomsg == "") { $tomsg = all; } $total = count($lines); $start = $total - 20; if($start < 0) $start = 0; $end = $total;
$newmessage = "$tomsg|$username|<font size=-1 color=$ucolor><B>$username:</B>$message</font><br>";
$fp=fopen ("${message_dir}/${room_uid}.html", "w");
for ($i = $start; $i < $end; $i++) { fwrite($fp, "$lines[$i]"); } fwrite($fp, "$newmessage\n"); fclose($fp);
}
// if($room == "") { error; }
// 글자색 지정
$ucolor=$ucolor; if($ucolor == "") { $uc1 = "checked"; } if($ucolor == "blue") { $uc1 = "checked"; } if ($ucolor == "brown") { $uc2 = "checked"; } if ($ucolor == "black") { $uc3 = "checked"; } if ($ucolor == "green") { $uc4 = "checked"; } if ($ucolor == "magenta") { $uc5 = "checked"; } if ($ucolor == "RED") { $uc6 = "checked"; }
// LOG OUT if (!strcmp($logoff ,"ok")) { $date = date( "l dS of F Y h:i:s A" ); $message = "$message($date)"; write($user_name, $ucolor, $room_uid, $message, $tomsg, $ear,$message_dir);
// $query="delete from room_login where chat_id='$user_id' "; $result= mysql_query($query, $dbconn);
// 대화방에 입실한 회원이 없으면 대화방을 삭제하는 부분 $result= mysql_query("select * from room_login where room_uid='$room_uid' ", $dbconn); $Total = mysql_num_rows($result); if(!$Total) { $query="delete from room where uid='$room_uid' "; $result= mysql_query($query, $dbconn);
unlink("${message_dir}/${room_uid}.html");
}
print "<META HTTP-EQUIV=Refresh CONTENT='0; url=$redirect_url'>"; exit; }
header("Content-type: text/html"); print" <HTML> <HEAD> <TITLE>대화방</TITLE> <style> a:link, a:visited, a:active { text-decoration:none; color:#003366; } A:hover{color:blue;} body, tr, td { font-size : 10pt;} </style>
<SCRIPT LANGUAGE='JavaScript'> <!-- function FocusOn() { document.form_submit.message.focus(); return; }
function chat() { form_submit.submit();
}
//--> </SCRIPT>
</HEAD> <BODY bgcolor=#FFFFFF text=#000000 topmargin=5 onLoad=FocusOn()> <table cellspacing=0 cellpadding=1 border=0> <tr> <td valign=top>
<table cellspacing=0 cellpadding=3 border=0> <tr> <td> 글자색선택 : </td> <form name='form_submit' action='chat.html' method='post'> <td> <input type=radio name=ucolor value=#003366 checked><font color=#003366>♥</font> <input type=radio name=ucolor value=brown ><font color=brown>♥</font> <input type=radio name=ucolor value=black ><font color=black>♥</font> <input type=radio name=ucolor value=green ><font color=green>♥</font> <input type=radio name=ucolor value=magenta ><font color=magenta>♥</font> <input type=radio name=ucolor value=red ><font color=red>♥</font> <input type=radio name=ucolor value=#ff9900 ><font color=#ff9900>♥</font> <input type=radio name=ucolor value=blue ><font color=blue>♥</font> <input type=radio name=ucolor value=gold ><font color=gold>♥</font> </td> </tr> <tr> <td> 대 화 입 력 : </td> <td> <input name=room_uid type=hidden value='$room_uid'> <input type=text name=message value='' size=45> <a href='javascript:form1.submit()'>Logout</a> </td> </form> <form name= form1 action='chat.html' method='post' target=_top> <input name=room_uid type=hidden value='$room_uid'> <input name='logoff' type=hidden value='ok'> <input type=hidden name=message value='님이 퇴장하셨습니다!'> </form> </tr> </TABLE> </td> </tr> </table> ";
if ($message) { write($user_id, $ucolor, $room_uid, $message, $tomsg, $ear,$message_dir); echo(" <SCRIPT LANGUAGE='JavaScript'> <!-- top.msg_list.document.location.href='say.html?room_uid=$room_uid&message=$message' //--> </SCRIPT>"); } exit;
?>
파일명 : room_in.html <? if(!$user_id || !$user_name) { echo "<SCRIPT>self.close();</SCRIPT>"; exit; }
$message_dir = "./data"; //message 디랙토리의 절대경로
########## 데이터베이스 서버에 연결한다. ########## $dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");
########## 작업 데이터베이스로 sample을 선택한다. ########## $status = mysql_select_db("sample",$dbconn); if(!$status) { $errNO = mysql_errno($dbconn); $errMSG = mysql_error($dbconn);
echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>"); echo("에러코드 $errNO : $errMSG<br>"); exit; } $query = "select * from room_login where room_uid = '$room_uid' AND chat_id = '$user_id'"; //echo $query; $result= mysql_query ($query, $dbconn); $Total = mysql_num_rows($result); if($Total) { echo (" <script> location.replace('room_login.html?room_uid=$room_uid'); </script> "); exit; }
mysql_query("insert into room_login (chat_id,room_uid) values('$user_id',$room_uid)", $dbconn);
$lines = file("${message_dir}/${room_uid}.html");
if($tomsg == "") { $tomsg = all; }
$total = count($lines); $start = $total - 20; if($start < 0) $start = 0; $end = $total;
$newmessage = "$tomsg|$user_id|<font size=-1 color=$ucolor><B>$user_name</B>님께서 대화방에 입실하였습니다.</font><br>";
$fp=fopen ("${message_dir}/${room_uid}.html", "w"); for ($i = $start; $i < $end; $i++) { fwrite($fp, "$lines[$i]"); }
fwrite($fp, "$newmessage\n"); fclose($fp);
echo (" <script> location.replace('room_login.html?room_uid=$room_uid'); </script> ");
?>
|
[목차] |