Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проблемы с чатом


Автор: ST_Falcon 3.3.2005, 15:55
вот он http://zmiy2.iswith.us/kiev.php
состоит весь чат с одной функции. при вызове функции на локации я передаю ей название локации и потом при выводе сообщений фильтрую сообщения по этому названию....
в форме есть скрытое поле newpost. если при обновлении страницы эта переменная истинна то текст мессаги добавляется в базу. проблема в том что когда я просто хочу обновить страницу, то все данные формы передаются по новой и сообщения дублируются... как этого можно избежать? может можно сразу после вывода сообщений очищать масив $_POST?

зы. и второй маленький вопрос. не совсем по пыхпыху... как при наведении курсора на ячейку "приподнимать" ее, тоесть менять цвет ячейки и двух границ (нижней и правой)?

Автор: korob2001 3.3.2005, 16:03
А я получаю такую ошибку при вооде сообщения:

INSERT INTO comment (section, usid, usname, message, postdate)
VALUES('village', ,' ', 'Ïðèâåò', now())
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' ', 'Привет', now())' at line 2

Автор: IZ@TOP 3.3.2005, 16:38
Ага, по моему usid должен быть чем то заполнен smile

Автор: ST_Falcon 3.3.2005, 18:16
korob2001
а. ну это... сначало зарегестрироваться нужно. потому что данные все с сесии берутся. это я пока что всех пускаю smile потом проверку поставлю.

Автор: IZ@TOP 3.3.2005, 19:29
ST_Falcon, ну вот он ошибку и пишет. Сделай аккаунт гостя и пускай гостей по нему.

Автор: ST_Falcon 3.3.2005, 23:22
IZ@TOPтоесть акаунт гостя? типа значения по дефлоту подставить?

Автор: korob2001 4.3.2005, 00:06
Цитата

IZ@TOPтоесть акаунт гостя? типа значения по дефлоту подставить?

Да, если юзер не авторизован.
Цитата

зы. и второй маленький вопрос. не совсем по пыхпыху... как при наведении курсора на ячейку "приподнимать" ее, тоесть менять цвет ячейки и двух границ (нижней и правой)?

Этот вопрос задай в разделе JavaScript или DHTML. А вообще не понятно что именно ты хочешь приподнять?
Вот по такому приципу можно менять цвет ячейки и отлавливать в какой из них произошло событие onClick:
Код

<html>
 <head>
   <title>Test</title>
     <script language="JavaScript" defer type="text/javascript">
      <!--//
        function chCol( check ) {
           var thisTg, parTg;
           thisTg  = window.event.srcElement.tagName
           if ( thisTg == "TD" ) {
                document.all( window.event.srcElement.sourceIndex).bgColor = "#999999";
           }
        }

        function chBack( check ) {
           var thisTg, parTg;
           thisTg  = window.event.srcElement.tagName
           if ( thisTg == "TD" ) {
                document.all( window.event.srcElement.sourceIndex).bgColor = "#555555";
           }
        }

        function showMess( check ) {
         window.alert("Вы нажали на ячейку с номером " + check );
        }

       //-->
     </script>
 </head>
 <body>
   <table width="50%" border="1" bgcolor='#555555' cellpadding='10'>
     <?php
       $td =  "";
       echo "<tr align='center'>\n";
       for ( $i = 1; $i <= 10; $i++ ) {
           if ( $i % 2 ) {
             echo "</tr><tr align='center'>\n";
           }
           $td .= "<td id='td" . $i . "' width='50%' onMouseOver='chCol(";
           $td .= $i . ")' onMouseOut='chBack(" . $i . ")' ";
           $td .= "onClick='showMess(" . $i . ")'>";
           $td .= "<div id='bl" . $i . "'>Ячейка</div> ";
           $td .= $i . "</td>\n";
           echo  $td;
           $td = '';
       }
     ?>
   </table>
 </body>
</html>

Повторяю это только принцип, я не особо силён в JavaScript и DHTML. Это всё на что меня хватило. Если хочешь чего-то более, то я уже сказал куда нужно писать.
Цитата

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

Вообще-то нужно делать перенаправление, можно ещё вводимую строку сравнивать с последней записью в базе или файле, если они совпали, значит юзер перезагрузил страницу и сообщение игнорируется, либо вывести сообщение о том, что не стоит повторяться так резко.
Хотя может это только я так думаю, просто я PHP изучаю меньше недели.

Удачи.

Автор: Opik 4.3.2005, 01:39
по поводу дублирования... делай
Header("Location: url");
после добавления в базу, где url - url чата.

Автор: ST_Falcon 4.3.2005, 16:56
Opr
тогда он два раза грузиться будет...
хотя выход.

Автор: ST_Falcon 5.3.2005, 01:06
вот так сделал:

Код

// чат
function viewchat($section, $talkline="`6говорит")
{
 global $session, $HTTP_POST_VARS;
 $sql = "Select * from comment where section = '$section'";
 $result = db_query($sql) or (die($sql));
 $num_rows = db_num_rows($result);

 // выводим сообщения
 for ($i=0; $i < $num_rows; $i++)
   {
     $comment = db_fetch_assoc($result);
     output("`^ <img src='images/new_online.gif'> $comment[usname] <a href=info.php?usid=$comment[usid]><img src='images/info.gif' class=noborder></a> $talkline: `# ".$comment[message].'`n');
   }
 // строка "сказать"
 if (!$session[user][speakban])
 {
   output("`@<br>
   <form action='chat.php' method='POST'>
     cказать: <br>
     <input name='message' accesskey='m' size='50'>
     <input type='submit' class='button' value='сказать'>
     <input name='section' type='hidden'  value='$section'>
   </form>
   <script language='JavaScript'>
   <!--
   top.document.forms[0].message.focus()
   //-->
   </script>
   ");
 }
 output("<a href=$SCRIPT_NAME>обновить</a>");
}

это функция которую добавляем на локацию. вызываем вот так viewchat('village');

и листинг файла chat.php
Код

<?
// 04.03.2005

require_once("common.inc");

$smile = array(
        ':D'=>'sm_01.gif',
        ':)'=>'sm_02.gif',
        ':('=>'sm_03.gif',
        ':eek:'=>'sm_04.gif',
        ':shock:'=>'sm_05.gif',
        ':?'=>'sm_06.gif',
        '8-)'=>'sm_07.gif',
        ':lol:'=>'sm_08.gif',
        ':razz:'=>'sm_09.gif',
        ':oops:'=>'sm_10.gif',
        ':cry:'=>'sm_11.gif',
        ':evil:'=>'sm_12.gif',
        ';)'=>'sm_13.gif');

// создаем коротние имена переменных
$message = $HTTP_POST_VARS['message'];
$message = htmlspecialchars($message, ENT_QUOTES);
// добавляем смайлики
foreach($smile as $k=>$v)
{
 $message = str_replace($k, "<img src=images/smail/$v>", $message);
}

$location = $session[user][restorepage];
$usid = $session[user][usid];
$usname = $session[user][title].' '.$session[user][name];

// формируем запрос к БД
$sql = "INSERT INTO comment (section, usid, usname, message, postdate)
       VALUES('$section', $usid,' $usname', '$message', now())";
$result = db_query($sql) or (die($sql));
header("Location: $location");
exit();

?>

Добавлено @ 01:09
функция добавки смайликов меня смущает... во первых в базу добавляется жесткий путь к картинке, а это не хорошо по двум причинам:
1. под мессагу отводится только 255 символов. и теги имаджа их хавают.
2. путь к картинке получается жесткий. что неудобно.
во вторых сколько смайлов столько раз работает цыкл...

слушаю ваши ИМХИки smile

Автор: korob2001 5.3.2005, 03:25
Цитата

1. под мессагу отводится только 255 символов. и теги имаджа их хавают.

А если в базу сохранять смайлы в таком виде как они есть и на выходе заменять их???

Автор: IZ@TOP 5.3.2005, 10:06
Во первых:
Код

// ...
foreach($smile as $k=>$v)
{
$message = str_replace($k, "<img src=images/smail/$v>", $message);
}

Заменяем на:

Код

$smile = array(
   ';)' => '<img src="%smilePath%/smile01.gif">',
   // ...
)

$message = str_replace(array_keys($smile), $smile, $message);

При генерации странички ессно надо будет заменить в документе %smilePath% на путь к смайлам. В этом случае у тебя не будет конкретной привязки к какому-то пути.

Автор: Opik 5.3.2005, 12:15
IZ@TOP
дык, ему надо через JavaScript менять смайлы... что бы не:
Цитата
1. под мессагу отводится только 255 символов. и теги имаджа их хавают.

Автор: IZ@TOP 5.3.2005, 12:24
Opr, можно и на выводе smile Но это загрузит сервак по полной если большая посещаемость smile

Автор: ST_Falcon 5.3.2005, 15:07
IZ@TOP
сенкс smile.
наверное лучше пожертвую местом под мессаги чем скоростью работы сервака... один раз текст обработал и порядок smile.

тут вопрос возник. как можно '/ ' экранировать? а то когда пощу два подряд '//' то получается некоретный запрос...

Автор: Opik 5.3.2005, 17:24
ST_Falcon
stripslashes();
IZ@TOP
не нагрузит, это грузит клиент smile) в этом и фишка.

Автор: ST_Falcon 5.3.2005, 19:37
Oprсенкс. попробую
Цитата
не нагрузит, это грузит клиент ) в этом и фишка

не хочу мешать яву с пыхпыхом...

Автор: Opik 6.3.2005, 02:05
ST_Falcon
не Java, а JavaScript.
И запомни: при граммотном использовании JavaScript может в десятки раз улучшить твою страницу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)