Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите AJAX+ЧАТ
 
 автор: staglu   (01.05.2007 в 22:09)   письмо автору
 
 

Я долго лазил по форум, нашел документацию по AJAX но у меня ничего не работает.
Такая проблемма, если можете помогите. Есть чат, он на фреймах но я понял что посетитлям он не понравиться, очень он долгий на фреймах. Есть файл к примеру msg.php где генерируються
последиия сообщения из чата. Что мне нужно сделать, чтобы сообщения выводились не обновлением страницей, а с помошью AJAX. Чтоб AJAX СМОТРЕЛ В СКРИПТ И ДОБОВЛЯЛ В ОКНО ТОЛЬКО НОВЫЕ СООБЩЕНИЯ ПОЯВИВЩЕСЯ В НЕМ. Помогите пожайлуста!!!

Заранее спасибо!!!

   
 
 автор: shkryab   (01.05.2007 в 22:54)   письмо автору
 
   для: staglu   (01.05.2007 в 22:09)
 

Что именно в AJAX-е у тебя не работает?

   
 
 автор: Staglu   (01.05.2007 в 23:00)   письмо автору
 
   для: shkryab   (01.05.2007 в 22:54)
 

-

   
 
 автор: Staglu   (01.05.2007 в 23:00)   письмо автору
 
   для: shkryab   (01.05.2007 в 22:54)
 

Вот смотрите, есть скрипт:

<?php
session_start
();//Стартуем сесию
?>

<head>
<meta http-equiv=\"Refresh\" content=\"5; url=msg.php\">
<title></title>
</head>
<BODY onLoad='window.scrollBy(0,9999)'>

<?php



include("admin/conf/config.php");//Подключаем файл конфигурации


//************************************************************************************
//                                      Функции                                      *
//************************************************************************************


 
function err($msge//Функция вывода ошибки
        
{
         
$server $_SERVER['SERVER_NAME'];
        echo 
"
                  <center>
                  <TABLE width=600 cellpadding = 0 cellspacing = 0 border = 0 >


                  <TR>
                    <TD width=\"2%\"><IMG src='http://
$server/graf/1.gif' width=14 height=12 border=0></TD>
                    <TD width=\"96%\" background='http://
$server/graf/2.gif'></TD>
                     <TD width=\"2%\"><IMG src='http://
$server/graf/3.gif' width=14 height=12 border=0></TD>
                   </TR>

                  <TR>
                    <TD background='http://
$server/graf/4.gif'></TD>

                    <TD>

                     <table width=100% border = 0 >

                         <tr>
                       <TD colspan=3 >\n"
;

              echo 
'<center><font color =red><img src=http://'.$server.'/graf/error.png align = middle><b>'.$msge.'</b></font></center>';

             echo 
"
                  </TD>
                  </tr>

                  </TABLE>

                    </TD>



                    <TD background='http://
$server/graf/8.gif'></TD>

                  <TR>
                    <TD width='2%'><IMG src='http://
$server/graf/5.gif' width=14 height=12 border=0></TD>
                    <TD width='96%' background='http://
$server/graf/6.gif'></TD>
                    <TD width='2%'><IMG src='http://
$server/graf/7.gif' width=14 height=12 border=0></TD>
                    </TR></center>\n"
;
             exit();
        }

 function 
ok($msge//Функция  подтверждения

              
{
              
$server $_SERVER['SERVER_NAME'];
              echo 
"

                  <center>
                  <TABLE width=600 cellpadding = 0 cellspacing = 0 border = 0 >


                  <TR>
                    <TD width=\"2%\"><IMG src='http://
$server/graf/1.gif' width=14 height=12 border=0></TD>
                    <TD width=\"96%\" background='http://
$server/graf/2.gif'></TD>
                     <TD width=\"2%\"><IMG src='http://
$server/graf/3.gif' width=14 height=12 border=0></TD>
                   </TR>

                  <TR>
                    <TD background='http://
$server/graf/4.gif'></TD>

                    <TD>

                     <table width=100% border = 0 >

                         <tr>
                       <TD colspan=3 >\n"
;

              echo 
'<center><font color =green><img src=http://'.$server.'/graf/ok.png align = middle><b>'.$msge.'</b></font></center>';

             echo 
"
                  </TD>
                  </tr>

                  </TABLE>

                    </TD>



                    <TD background='http://
$server/graf/8.gif'></TD>

                  <TR>
                    <TD width='2%'><IMG src='http://
$server/graf/5.gif' width=14 height=12 border=0></TD>
                    <TD width='96%' background='http://
$server/graf/6.gif'></TD>
                    <TD width='2%'><IMG src='http://
$server/graf/7.gif' width=14 height=12 border=0></TD>
                    </TR></center>\n"
;

        }

//******************************************************************************
//                            Проверяем введенные данные                       *
//******************************************************************************

$id_session session_id();

$sql "SELECT * FROM session_chat
        WHERE s_id = '
$id_session';";

$db mysql_query($sql);

$massiv mysql_fetch_array($db);

if(
mysql_num_rows($db) <= )
{
   
err("У вас нет прав! Возможно вы не авторизовались.<br><a href=http://".$server."/chat/chat.php>Авторизоваться</a>&nbsp;<a href=http://".$server."/register/index.php>Регистрация</a>");
}
else
{


echo 
" <table width='100%' border=0>";

$sql="SELECT * FROM chat";
$sql mysql_query($sql);

while(
$mass mysql_fetch_array($sql))
{

$time substr($mass['time'],10,18);
$msg "<font size=4 color=".$massiv['color_log']."><b>".$massiv['login'].":&nbsp;</b></font><font color=".$massiv['color_msg'].">".$msg."</font>";

echo  
"

<TR>
  <TD background='http://"
.$server."/graf/2.png'></TD>
</TR>
       <tr>
         <td><font color='66666' size='1'>
$time</font></td>
         <td>
$mass[msg]</td>
       </tr>"
;

}


echo 
"</table>";

    echo 
" <html><head>
           <meta http-equiv = \"Refresh\" content = \"5; url=
$mass[link]\">
           </head></html>\n"
;


}



?>

<html>
</body>
</html>


Мне нужно, чтоб его содержимое не обновлялось с поиощью meta тега. А выводилась через ajax

   
 
 автор: Staglu   (01.05.2007 в 23:01)   письмо автору
 
   для: shkryab   (01.05.2007 в 22:54)
 

Вот в этом скрипте извлекаються сообщения из БД. Но в чате,чтоб просмотреть новые сообщения от пользователей, приходилось обновлять страницу с помощью meta тега. Но как сделать чтоб сообшения обновлялись без meta тега

   
 
 автор: shkryab   (01.05.2007 в 23:29)   письмо автору
 
   для: Staglu   (01.05.2007 в 23:01)
 


var req;
function loadXMLDoc(url,data)
{
    if (window.XMLHttpRequest)
    {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("POST", url, true);
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=cp1251");
        req.send(data);
    }
    else if (window.ActiveXObject)
    {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req)
        {
            req.onreadystatechange = processReqChange;
            req.open("POST", url, true);
            req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=cp1251");
            req.send(data);
        }
    }
}
function processReqChange()
{
    if (req.readyState == 4)
    {
        if (req.status == 200)
        {
            //всякие действия с полученными данными например:
            document.getElementById('elem').innerHTML=req.responseText;
        }
        else
        {
            alert("Не удалось получить данные:\n" + req.statusText);
        }
    }
}

Ответ от сервера будет находиться в req.responseText. В нем будет содержаться то, что в php скрипете выводилось на экран (echo "бла бла бла" - бла бла бла и будет содержаться в req.responseText). Параметры функции loadXMLDoc(url,data):
url - файл на сервере к которому Вы обращаетесь;
data - данные которые передаёте на сервер.
Переданные данные будут находиться в массиве $_POST[]. Данные должны передаваться в виде переменная=значение.
К примеру:
В файле 1.html вызываеться функция

...
loadXMLDoc("qwerty.php","msg=12345")
...

файл qwerty.php содержит такое:

...
echo $_POST[msg];
...

тогда ответ от сервера (который содержиться в req.responseText) будет содержать текст "12345".

   
 
 автор: Staglu   (01.05.2007 в 23:36)   письмо автору
 
   для: shkryab   (01.05.2007 в 23:29)
 

Спаибо, понял!!! А если информация в файле qwerty.php добавиться, то и в 1.html она тоже отоброзиться. И некаких обновленний страници 1.html делать не нужно??? Я праильно вас поня???

   
 
 автор: shkryab   (01.05.2007 в 23:44)   письмо автору
 
   для: Staglu   (01.05.2007 в 23:36)
 

Всмысле добавиться? То что в файле будет выводиться на страницу (echo или теги вне скрипта) будут содержаться в ответе от сервера. Сам скрипт может свершать какие угодно действия.

   
 
 автор: coloboc66   (01.05.2007 в 23:42)   письмо автору
 
   для: shkryab   (01.05.2007 в 23:29)
 

Все не так просто, как кажется:аякс - это только средство связи между клиентом и броузером. А обработку данных нужно делать либо на РНР на сервере, либо и на сервере и в броузере с помощью ява-скрипт. Здесь так просто никто не поможет, если только не отдаст свой собственный готовый скрипт чата.

   
 
 автор: Staglu   (01.05.2007 в 23:48)   письмо автору
 
   для: coloboc66   (01.05.2007 в 23:42)
 

Что мне делать, у меня работает только с помошью <meta> тега кажде 5 секун происходит обновления. Можно сделать так, чтобы данные не обновлялись всей страницей, а докачивались только те которые только которые новые.

   
 
 автор: shkryab   (01.05.2007 в 23:54)   письмо автору
 
   для: Staglu   (01.05.2007 в 23:48)
 

meta надо в таком случае ваще убрать, да и фреймы тоже не нужны... Чат ниразу не писал и не видел ни одного кода чата :) но думаю, что необходимо через некоторые интервалы времени обращаться к скрипту на сервере, передавая ему о сообщении которое являеться последним или сообщение клиента в соответствии с этим в скрипте должен формироваться ответ, который буде обрабатываться на клиенте.

   
 
 автор: shkryab   (01.05.2007 в 23:49)   письмо автору
 
   для: coloboc66   (01.05.2007 в 23:42)
 

Дык на сколько я понял вопрос стоял о том как по средствам AJAX-а обменяться данными между клиентом и сервером. Это я и попытался объяснить как можно более кратко и полно. Надеюсь получилось...

   
 
 автор: coloboc66   (02.05.2007 в 00:20)   письмо автору
 
   для: shkryab   (01.05.2007 в 23:49)
 

При работе с аяксом нужно полностью отказаться от фреймов и от рефрешей. И начать заново изучать ява-скрипт и DOM. Такая вот беда...

   
 
 автор: bronenos   (02.05.2007 в 05:35)   письмо автору
 
   для: coloboc66   (02.05.2007 в 00:20)
 

неправда. я пишу чат, без хвастовства говорю, успешно
у меня 3 ифрейма, потому что если делать без них, то сообщения и список пользователей всю страницу опустят вниз, их надо делать с прокруткой
от дом я тоже отказался
в ответе с сервера я первой строчкой пишу md5 хэш всех сообщений и потом сравниваю его с последним полученным
если отличается, то разбиваю сообщения которые идут на следующих строках с помощью split ('\n'), а данные каждого сообщения при помощи split ('\t')
о доме можно забыть! только лишние проблемы с совместимосью!

   
 
 автор: coloboc66   (02.05.2007 в 09:49)   письмо автору
 
   для: bronenos   (02.05.2007 в 05:35)
 

Не могу понять, зачем использовать аякс с фреймами, это вещи, друг друга взаимоисключающие. Зачем эти фреймы нужны, если сообщения можно сразу выводить на страницу? К тому же броузеры ифреймы блокируют. Если каждое новое сообщение выводить вверх страницы, то никаких прокруток не нужно.
...а данные каждого сообщения при помощи split ('\t') - можно подробней? Что здесь понимается под данными? Это имеется ввиду табуляция строки по длине?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования