Пишем свой чат на 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 - прописываем данные для доступа к БД
И смотрим в броузере.

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

таймаут

немного не понял принцип работы таймаута

Технологии

Vaulter's picture

Технологии ускакали далеко вперед за эти года, статья была написана в 2004 году, а сам скрипт в 2003 в качестве прототипа.

Если имелся ввиду таймаут на удаление пользователей, то принцип таймаута был простой -
При очередном обновлении dummy фрейма и дергания dummy.php, вычислялась точка времени, находящаяся в прошлом на 5 минут от текущего момента.
$now = mktime() - 5 * 60; и далее делалась попытка удалить из таблиц сообщений и пользователей все что старше этой метки. Если такие записи были, то:

 if( mysql_affected_rows() ) {
        echo setlocation( 'nicklist', 0, 'users.php' );//если есть удаленные записи то обновить ник лист
    }

Поставил этот чат у себя на

Поставил этот чат у себя на компе. К сожалению не работает автообновление окна чата и списка юзеров. Окно чата обновляется если только что-либо написать в чат. Если юзер ничего не пишет, то он не видит, что написали другие.
Список юзеров обновляется - только если вручную обновить фрейм.

да эм. славный 2003! :)

Vaulter's picture

С Новым Годом, россияне.
Ну и все остальные хорошие люди дважды.
А хорошие россияне - трижды!

Спасибо!!

Спасибо огромное))) Очень хорошо и подробно все описано теперь все понятно а то по книгам ничего не понятно видимо автор непутевый или я тупил)))... побольшебы таких скриптов с подробным описанием его создания))))

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <p><a> <em> <strong> <b> <cite> <q> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <h2><h3> <abbr>
  • Lines and paragraphs break automatically.
  • Images can be added to this post.
  • Mark language-dependent sections with == lc == where lc (or lc-xx) is a language code, other or all.
  • Links to specified hosts will have a rel="nofollow" added to them.

More information about formatting options

CAPTCHA
who are you
Image CAPTCHA
Enter the characters shown in the image.