
Задался я мыслью, написать подобие чата. как и все великое, начнется это с простых вещей....
UML диаграмма последовательности
Итак, начнем.
заглав пага у нас будет index.html куда и будет попадать юзер при заходе на chat.test1.ru допустим ):
index.html
обьясняю - это страница фреймсет - набор фреймов,
для чата нам понадобятся всего две таблицы (да, да ))):
CREATE TABLE `user` (
`username` varchar(50) default NULL,
`userid` int(10) unsigned NOT NULL auto_increment,
`lastactivity` int(10) unsigned NOT NULL default '0',
`lastupdate` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`userid`)
) TYPE=MyISAM;
тут кажется должно быть просто:
chat - три поля:
user
ну еще подготовимся...чтобы уж быть во всеоружие. Напишем...functions.php всего с парой функций )
functions.php
<?php
/**
* (c) Vaulter 2003 )))))
*/
/**
* Sets the location of browser window
* used for jumping to other location
* or for refreshing page
*
* Устанавливает адрес окна броузера
* используется для перехода к другому адресу
* или для обновления страницы
* @param string $window name of window (frame)
* @param $time delay before refresh
* @param $url location to go
*/
function setlocation( $window, $time, $url ) {
if( $time ) {
echo "<script type='text/javascript'>
top.$window.document.write( \"<meta http-equip=Refresh content='$time; URL=$url'>\" );
</script>";
} else {
echo "<script type='text/javascript'>top.$window.location='$url';</script>";
}
}
/**
* Возвращает строку даты
* @param unsigned int date timestamp
* @return string representation of date
*/
function getdatestring( $datest ) {
global $GMT;
if( 0 == $datest ) {
return "никогда";
}
$now = mktime() + $GMT;
$datest += $GMT;
$strdate = strftime( "%H:%M:%S", $datest );
return $strdate;
}
?>
первая просто выводит в страничку тег META REFRESH для перезагрузки какого либо фрейма, через указанный тайм, на указанный урл, вторая возвращает читаемую строку из UNIX TIMESTAMP....
поехали дальше?
далее...начнем наш нелегкий труд...
напишем скриптик, который будет вызыватся для каждого скриптика...
в нем мы будет
фух...
global.php
<?php
/**
* Script that will include to all others
* common header file
*
* Скрипт, который будет включатся во все остальные
* общий заголовочный файл
*/
error_reporting( E_ALL ^ E_NOTICE );
session_start();
/** DB settings - CHANGE IT TO YOUR
*
* БД настройки - ИЗМЕНИТЬ НА СВОИ
*/
$dbhost = "localhost";
$dblogin = "root";
$dbpass = "";
$dbname = "chat";//имя БД где наши таблицы
$dbconnect = mysql_connect( $dbhost, $dblogin, $dbpass ) or
myexit( __FILE__." (".__LINE__."): cannot connect to $dblogin@$dbhost/$dbname" );
mysql_select_db( $dbname );
/**
* тут нет никаких проверок на ошибки, поэтому лучше чтобы
* 1. mySQL user с логином root был
* 2. chat БД была )
*/
//set activity if user loginned
if( $_SESSION['userid'] ) {
$query = "UPDATE `user` SET `lastactivity` = '".mktime()."' WHERE `userid` = '$_SESSION[userid]'";
@mysql_query( $query );//апдейтим lastactivity и глушим вывод об ошибках
$query = "SELECT * FROM `user` WHERE `userid` = '$_SESSION[userid]'";
global $user;
$user = mysql_fetch_assoc( $res = mysql_query( $query ) );//берез данные о юзере
mysql_free_result( $res );
}
?>
далее, а очереди dummy.php, чуть ли не самый хлавный тут скрипт, в его задачу входит
все просто:
dummy.php
<?php
/**
* engine to check new messages and reload chat window if need
* this script will contantly refreshed by self or others
*
* Скрипт, который будет постоянно обновлятся и при
* наличии обновлений обновлять другие фреймы
*/
set_time_limit( 0 );
if( connection_aborted() ) {//we have to delete user from DB
$query="INSERT INTO `chat`
( `userid`, `message`, `date` )
VALUES
( '$user[userid]', 'я ушел!!!!', '".mktime()."' )";
@mysql_query( $query );
exit;
}
include 'functions.php';
include 'global.php';
echo setlocation( 'dummy', 10, 'dummy.php' );
/**
* We will check for need of update frames
*/
$r = 0;
$now = mktime() - 5 * 60;//ten minutes
$query = "DELETE FROM chat WHERE `date` < $now";
mysql_query( $query );
$query = "DELETE FROM user WHERE `lastactivity` < $now";
mysql_query( $query );
if( mysql_affected_rows() ) {
echo setlocation( 'nicklist', 0, 'users.php' );//если есть удаленные записи то обновить ник лист
}
$query="SELECT count(*) FROM `chat`,`user`
WHERE `chat`.`date` > `user`.`lastupdate` AND `user`.`userid` = $_SESSION[userid]";
list( $row ) = mysql_fetch_array( $res = mysql_query( $query ) );
mysql_free_result( $res );
if( $row ) {
echo setlocation( 'main', 0, 'main.php' );
}
?>
следующий на очереди input.php скрипт подхватывающий сообщения юзера и заносящий их в БД...
input.php
<?php
/**
* Script that load to input window
*
* Скрипт выводящий в окно ввода
*/
include 'functions.php';
include 'global.php';
if( $_SESSION['userid'] ) {
if(
"POST" == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['message'] ) ) {//parse form
$query = "INSERT INTO `chat` VALUES ( '$user[userid]', '".addslashes( $_POST['message'] )."', '".mktime()."' )";
@mysql_query( $query );
echo setlocation( 'main', 0, 'main.php' );
}
echo "<center>
<form method='post'>
<input name='message' type='text' maxsize='250' size='50' />
<input type='submit' value='Send' />
</form>
</center>"
;
//выводим js скрипт переводящий фокус куды надо
echo "<script type='text/javascript'>top.chat.document.forms[0].message.focus();</script>";
} else {
echo "<center>Введи ник</center>";
}
?>
далее users.php
здесь мы просто выводим кто сейчас у нас есть!
если кого нет, то я не виноват )
users.php
<?php
/**
* Script that just output online users of chat
*
* Скрипт выводящий пользователей онлайн
*/
include 'functions.php';
include 'global.php';
$query = "SELECT * FROM `user`";
$result = mysql_query ( $query ) or exit( __FILE__." (".__LINE__.") ".$query );
print "<ul class='users'>".PHP_EOL;
while( $line = mysql_fetch_assoc( $result ) ) {
echo "<li><a onclick='top.chat.document.forms[0].message.value+=\"$line[username], \"'>$line[username]</a></li>";
}
print "</ul>".PHP_EOL;
echo setlocation( "nicklist", 60, $_SERVER['PHP_SELF'] );//60 - second for refresh
mysql_free_result( $result );
?>
было бы логично тут же проверять старых юзеров, но я как то забыл об этом ))))
ну и наконец! main.php!!! который:
итак:
main.php
<?php
/**
* Main script that will logon and logout users
*
* Скрипт, который будет логинить и разлогинивать
* пользователей
*/
error_reporting( E_ALL ^ E_NOTICE );
session_start();
session_register( "userid" );
@$action = $_GET['action'];
include
'functions.php';
include 'global.php';
global $user;
echo "<html><body>";
if( empty( $_SESSION['userid'] ) ) {
if( 'POST' == $_SERVER['REQUEST_METHOD'] ) {//catch incoming nick
if( !empty( $_POST['username'] ) ) {//check for existence
$query = "SELECT `userid` FROM `user` WHERE `username` = '".htmlspecialchars( $_POST['username'] )."'";
$r = mysql_query( $query ) or exit( __FILE__." (".__LINE__.") ".$query );
if( mysql_num_rows( $r ) ) {//if exists
echo "<center>Уже есть</center>";
} else {//reg
$query = "INSERT INTO `user`
( `username`, `lastactivity` )
VALUES
( '".htmlspecialchars( $_POST['username'] )."',".mktime()." )";
mysql_query( $query ) or exit( __FILE__." (".__LINE__.") ".$query );
$_SESSION['userid'] = mysql_insert_id();
echo "<center>Привет, $_POST[username]</center>".
setlocation( 'chat', 0, 'input.php' ).
setlocation( 'main', 2, 'main.php' );
echo "</body></html>";
$query = "INSERT INTO `chat` VALUES ( $_SESSION[userid], 'я пришел!!!!', '".mktime()."' )";
@mysql_query( $query );
}//if( mysql_num_rows( $r ) )
}//if( !empty( $_POST['username'] ) )
} else {
echo
"<form method='POST'>
<input type='text' name='username' size='30' />
<input type='submit' value='Enter' />
</form>
</body></html>";
}//if( 'POST' == $_SERVER['REQUEST_METHOD'] )
exit;
}//if( empty( $_SESSION['userid'] ) )
if( "exit" == $action ) {
session_destroy();
$query = "INSERT INTO `chat` VALUES ( $user[userid], 'я ушел!!!!', '".mktime()."' )";
@mysql_query( $query );
$query = "DELETE FROM `user` WHERE `userid`='$user[userid]'";
mysql_query( $query );
echo setlocation( 'main', 0, 'main.php' );
exit;
}//if( "exit" == $action )
echo "<center>Чат для $user[username] <a href='main.php?action=exit'>выйти</a></center>";
$query = "SELECT * FROM `chat` LEFT JOIN `user` USING (`userid`) ORDER BY `date` DESC";
$result = mysql_query ( $query ) or die ( "Query failed: $query" );
echo "<ul>".PHP_EOL;
while( $line = mysql_fetch_assoc( $result ) ) {
echo "<li><span class='ts'>".getdatestring( $line['date'] )."</span>
<span class='un'>$line[username]:</span>
<span class='msg'>$line[message]</span></li>";
}//while
print "</ul>".PHP_EOL;
mysql_free_result( $result );
$query = "UPDATE `user` SET `lastupdate` = '".mktime()."' WHERE `userid` = $_SESSION[userid] ";
@mysql_query( $query );
echo "</body></html>";
?>
ну вот....все скрипты...
ничего сложного ;)
Установка на рабочий сервер занимает около 1 минуты, если, конечно, знать что делать.
Загружаем дамп таблиц в БД,
Настраиваем global.php - прописываем данные для доступа к БД
И смотрим в броузере.
Комментарии
да эм. славный 2003! :)
С Новым Годом, россияне.
Ну и все остальные хорошие люди дважды.
А хорошие россияне - трижды!
Спасибо!!
Спасибо огромное))) Очень хорошо и подробно все описано теперь все понятно а то по книгам ничего не понятно видимо автор непутевый или я тупил)))... побольшебы таких скриптов с подробным описанием его создания))))
Отправить комментарий