Чат на PHP
| |
simtiko | Дата: Суббота, 20 Марта 2010, 15:07 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| Прошу помочь с чатом на PHP. Я начал учить PHP пару дней назад, так что сильно не кусайте. Вот код Index.php Code <?php echo readfile("counter.txt"); echo "<br><form action='asd.php'><br>"; echo "<input type='text' name='text'><br> "; echo "<input type='submit'><br>"; echo "</form>"; ?> asd.php Code
<?php $fp = fopen("counter.txt", "a"); $test = fwrite($fp, $text); if ($test) echo "<script>location.href='index.php'</script>"; fclose($fp); ?> Все кажется работает, но вот в index.php не выводится содержимое counter.txt. Причем если обновитсь страницу, все отлично выводится на страницу.
Сообщение отредактировал simtiko - Суббота, 20 Марта 2010, 15:09 |
|
| |
Assasin | Дата: Суббота, 20 Марта 2010, 16:45 | Сообщение # 2 |
web-coder
Сейчас нет на сайте
| Вот мой код, все работает asd.php Code <?php $fp = fopen("counter.txt", "a"); $test = fwrite($fp, $_POST['text']); if ($test) echo "<script>location.href='index.php'</script>"; fclose($fp); ?> index.php Code <?php echo readfile("counter.txt"); echo "<br><form method='post' action='asd.php'><br>"; echo "<input type='text' name='text'><br> "; echo "<input type='submit'><br>"; echo "</form>"; ?>
|
|
| |
maker-rus | Дата: Вторник, 08 Июня 2010, 15:20 | Сообщение # 3 |
Гений
Сейчас нет на сайте
| Вот что я могу предложить. Создаём Бд Quote CREATE TABLE `messages` ( `id` int(5) NOT NULL AUTO_INCREMENT, `name` char(255) character SET utf8 NOT NULL, `text` text character SET utf8, PRIMARY KEY (`id`) ); Потом файл index.php Quote <!-- Указываем DOCTYPE --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Php Ajax chat</title> <!-- У нас всё работает в UTF-8 --> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!-- Загружаем стили для чата --> <link rel="stylesheet" type="text/css" media="screen" href="css.css" /> <!-- Подключаем jQuery --> <script type="text/javascript" src="jquery.js"></script> <!-- Сам код нашего чата --> <script type="text/javascript"> $(document).ready(function () { $("#pac_form").submit(Send); // вешаем на форму с именем и сообщением событие которое срабатывает кодга нажата кнопка "Отправить" или "Enter" $("#pac_text").focus(); // по поле ввода сообщения ставим фокус setInterval("Load();", 2000); // создаём таймер который будет вызывать загрузку сообщений каждые 2 секунды (2000 миллисекунд) }); // Функция для отправки сообщения function Send() { // Выполняем запрос к серверу с помощью jquery ajax: $.post(адрес, {параметры запроса}, функция которая вызывается по завершению запроса) $.post("ajax.php", { act: "send", // указываем скрипту, что мы отправляем новое сообщение и его нужно записать name: $("#pac_name").val(), // имя пользователя text: $("#pac_text").val() // сам текст сообщения }, Load ); // по завершению отправки вызываем функцию загрузки новых сообщений Load() $("#pac_text").val(""); // очистим поле ввода сообщения $("#pac_text").focus(); // и поставим на него фокус return false; // очень важно из Send() вернуть false. Если этого не сделать то произойдёт отправка нашей формы, те страница перезагрузится } var last_message_id = 0; // номер последнего сообщения, что получил пользователь var load_in_process = false; // можем ли мы выполнять сейчас загрузку сообщений. Сначала стоит false, что значит - да, можем // Функция для загрузки сообщений function Load() { // Проверяем можем ли мы загружать сообщения. Это сделано для того, чтобы мы не начали загрузку заново, если старая загрузка ещё не закончилась. if(!load_in_process) { load_in_process = true; // загрузка началась // отсылаем запрос серверу, который вернёт нам javascript $.post("ajax.php", { act: "load", // указываем на то что это загрузка сообщений last: last_message_id, // передаём номер последнего сообщения который получил пользователь в прошлую загрузку rand: (new Date()).getTime() }, function (result) { // в эту функцию в качестве параметра передаётся javascript код, который мы должны выполнить eval(result); // выполняем скрипт полученный от сервера $(".chat").scrollTop($(".chat").get(0).scrollHeight); // прокручиваем сообщения вниз load_in_process = false; // говорим что загрузка закончилась, можем теперь начать новую загрузку }); } } </script> <body> <div style="padding: 100px;"> <h1>Php Ajax Chat</h1> <!-- Вот в этих 2-х div-ах будут идти наши сообщения из чата --> <div class="chat r4"> <div id="chat_area"><!-- Сюда мы будем добавлять новые сообщения --></div> </div> <form id="pac_form" action=""><!-- Наша форма с именем, сообщением и кнопкой для отправки --> <table style="width: 100%;"> <tr> <td>Имя:</td> <td>Сообщение:</td> <td></td> </tr> <tr> <!-- Поле ввода имени --> <td><input type="text" id="pac_name" class="r4" value="Гость"></td> <!-- Поле ввода сообщения --> <td style="width: 80%;"><input type="text" id="pac_text" class="r4" value=""></td> <!-- Кнопка "Отправить" --> <td><input type="submit" value="Отправить"></td> </tr> </table> </form> </div> </body> </html> Создаем файл ajax.php Quote <?php // настройки для подключения к MySQl $config = array( 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'pacdb' ); // подключаемся к MySQL, если не вышло то выходим if( !mysql_connect($config['hostname'], $config['username'], $config['password']) ) { exit(); } // Выбираем базу данных, если не вышло то выходим if( !mysql_select_db($config['dbname']) ) { exit(); } mysql_query("SET NAMES 'utf8'"); // говорим MySQl'у то что мы будем работать с UTF-8 Header("Cache-Control: no-cache, must-revalidate"); // говорим браузеру что-бы он не кешировал эту страницу Header("Pragma: no-cache"); Header("Content-Type: text/javascript; charset=utf-8"); // говорим браузеру что это javascript в кодировке UTF-8 // проверяем есть ли переменная act (send или load), которая указываем нам что делать if( isset($_POST['act']) ) { // $_POST['act'] - существует switch ($_POST['act']) { case "send" : // если она равняется send, вызываем функцию Send() Send(); break; case "load" : // если она равняется load, вызываем функцию Load() Load(); break; default : // если ни тому и не другому - выходим exit(); } } // Функция выполняем сохранение сообщения в базе данных function Send() { // тут мы получили две переменные переданные нашим java-скриптом при помощи ajax // это: $_POST['name'] - имя пользователя // и $_POST['text'] - сообщение $name = substr($_POST['name'], 0, 200); // обрезаем до 200 символов $name = htmlspecialchars($name); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные $name = mysql_real_escape_string($name); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query() $text = substr($_POST['text'], 0, 200); // обрезаем до 200 символов $text = htmlspecialchars($text); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные $text = mysql_real_escape_string($text); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query() // добавляем новую запись в таблицу messages mysql_query("INSERT INTO messages (name,text) VALUES ('" . $name . "', '" . $text . "')"); } // функция выполняем загрузку сообщений из базы данных и отправку их пользователю через ajax виде java-скрипта function Load() { // тут мы получили переменную переданную нашим java-скриптом при помощи ajax // это: $_POST['last'] - номер последнего сообщения которое загрузилось у пользователя $last_message_id = intval($_POST['last']); // возвращает целое значение переменной // выполняем запрос к базе данных для получения 10 сообщений последних сообщений с номером большим чем $last_message_id $query = mysql_query("SELECT * FROM messages WHERE ( id > $last_message_id ) ORDER BY id DESC LIMIT 10"); // проверяем есть ли какие-нибудь новые сообщения if( mysql_num_rows($query) > 0 ) { // начинаем формировать javascript который мы передадим клиенту $js = 'var chat = $("#chat_area");'; // получаем "указатель" на div, в который мы добавим новые сообщения // следующий конструкцией мы получаем массив сообщений из нашего запроса $messages = array(); while ( $row = mysql_fetch_array($query) ) { $messages[] = $row; } // записываем номер последнего сообщения // [0] - это вернёт нам первый элемент в массиве $messages, но так как мы выполнили запрос с параметром "DESC" (в обратном порядке), // то это получается номер последнего сообщения в базе данных $last_message_id = $messages[0]['id']; // переворачиваем массив (теперь он в правильном порядке) $messages = array_reverse($messages); // идём по всем элементам массива $messages foreach ( $messages as $value ) { // продолжаем формировать скрипт для отправки пользователю $js .= 'chat.append("<span>' . $value['name'] . '» ' . $value['text'] . '</span>");'; // добавить сообщние (<span>Имя » текст сообщения</span>) в наш div } $js .= "last_message_id = $last_message_id;"; // запишем номер последнего полученного сообщения, что бы в следующий раз начать загрузку с этого сообщения // отправляем полученный код пользователю, где он будет выполнен при помощи функции eval() echo $js; } } ?> создаем таблицу стилей css.css Quote * { margin: 0; padding: 0; } body { font: normal normal normal 16px "Trebuchet MS", Arial, Times; color: #000000; } /* Важное свойство */ .chat { height: 500px; overflow: auto; /* Это позволяет отображать полосу прокрутки */ position: relative; /* Это позволяет съезжать тексту в слое, не растягивая страницу */ text-align: left; border: solid #818181 1px; } .chat div { position: absolute; /* Страница остаётся того же размера */ } .chat span { display: block; } input[type=text],textarea { width: 100%; font: normal normal normal 16px "Trebuchet MS", Arial, Times; border: solid #818181 1px; } /* Для CSS 3 */ .r4 { -moz-border-radius: 4px; -khtml-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } потом скачиваем файл jquery.js Скачать И всё ваш чат работает Можно плюсиГ за помощь © журнал phpinside.ru
Сообщение отредактировал maker-rus - Вторник, 08 Июня 2010, 23:05 |
|
| |
MaTRoSkin | Дата: Вторник, 08 Июня 2010, 15:44 | Сообщение # 4 |
был не раз
Сейчас нет на сайте
| maker-rus, Во! Умный человек, ajax для чата использует.... Не то что некоторые. Хотя я с аяксом не в ладах..... ну ниче, + заслужил
Усы, лапы и хвост - вот мои документы!
|
|
| |
maker-rus | Дата: Вторник, 08 Июня 2010, 15:59 | Сообщение # 5 |
Гений
Сейчас нет на сайте
| Quote (MaTRoSkin) maker-rus, Во! Умный человек, ajax для чата использует.... Не то что некоторые. Хотя я с аяксом не в ладах..... ну ниче, + заслужил Спасибо!
|
|
| |
Lucasito | Дата: Вторник, 08 Июня 2010, 16:38 | Сообщение # 6 |
участник
Сейчас нет на сайте
| чтобы чат постоянно обновлялся используется технология AJAX. Аякс - это смесь javascript и какого-нибудь серверного языка, наподобие php. В яваскрипте используется объект XMLHttpRequest и на нем все и строится. Так же есть очень древний способ- это через обновление страницы по команде javascript setTimeout, которой в качестве параметра задается время обновление и функция, которая будет вызывать обновление страницы. Через АЯКС удобнее и лучше, но программить дольше. И по второму методу если делать, то пользователи будут много ругаться, и нагрузка на сервак больше идет. Протокол обмена для аякса можно выбирать какой угодно, обычно берут XML или просто plain-text. XML проще и удобнее, но трафик будет чуть больше и нагрузка на клиента тоже немного побольше. Конкретно по твоему вопросу- у тебя файл index.php запустился, выполнился и всё. Больше никаких действий не происходит, поэтому ничего и не обновляется. Вот если туда обновление страницы по setTimeout сделаешь, то тогда начнет обновлятся
Скриншоты. Приглашаем бета-тестеров! Помог? Ставь "+" мне в репу :)
|
|
| |
maker-rus | Дата: Вторник, 08 Июня 2010, 16:53 | Сообщение # 7 |
Гений
Сейчас нет на сайте
| Lucasito, во первых здравствуйте. Во вторых - я предложил исходник, а вы делайте с ним что хотите! Хотите вставляйте js, хотите нет. Надеюсь я вам объяснил всё подробно!
|
|
| |
Lucasito | Дата: Вторник, 08 Июня 2010, 18:40 | Сообщение # 8 |
участник
Сейчас нет на сайте
| maker-rus, здраствуй По поводу исходника- ты бы хоть упомянул что там нужна библиотека jquery. Оно конечно хорошо, но для новичка лучше чтобы он сам сделал обмен с сервером, чтобы понял как оно работает.
Скриншоты. Приглашаем бета-тестеров! Помог? Ставь "+" мне в репу :)
|
|
| |
Assasin | Дата: Вторник, 08 Июня 2010, 18:42 | Сообщение # 9 |
web-coder
Сейчас нет на сайте
| maker-rus, копипаст не приветствуется. Так что переделай исходники, либо бан.
|
|
| |
maker-rus | Дата: Вторник, 08 Июня 2010, 22:59 | Сообщение # 10 |
Гений
Сейчас нет на сайте
| Assasin, всё! Извините забыл добавить!
Сообщение отредактировал maker-rus - Вторник, 08 Июня 2010, 23:06 |
|
| |
|