Делал по уроку ajax чат. Решил переделать его под консультанта, как JivoSite.
Но при отправке сообщения - форма блокируется и...ничего.
<?php
if( !function_exists('ftok') )
{
// взята с php.net
function ftok($pathname, $proj_id) {
$st = stat($pathname);
if (!$st) {
return -1;
}
$key = sprintf("%u", (($st['ino'] & 0xffff) | (($st['dev'] & 0xff) << 16) | (($proj_id & 0xff) << 24)));
return $key;
}
}
try {
// тут конект к СУБД
// получаем id последнего сообщения
$last_id = isset($_REQUEST['last_id']) ? (int)$_REQUEST['last_id'] : 0;
// текст
$text = isset($_POST['text']) ? trim($_POST['text']) : '';
$name = isset($_POST['user']) ? trim($_POST['user']) : '';
// преобразуем имя файла в идентификатор блока памяти
$key = ftok(__FILE__, 't');
// получаем доступ к памяти
// мы будем хранить максимальный ID, а значит, нам хватит 4 байта памяти
$memory = shmop_open($key, 'c', 0600, 4);
if (!empty($text)) {
// вставка новой записи
$sth = $dbh->prepare("INSERT INTO `chat` (`text`,`from`) VALUES (:text,$name)");
$sth->execute(array(':text' => $text));
// последний сгенерированный ID
$id = $dbh->lastInsertId();
// пишем его в разделяемую память
// используем pack, так как данные нужно передать как строку
shmop_write($memory, pack('I', $id), 0);
}
// результирующий массив
$result = array();
//достаём id из памяти
$data = unpack('I', shmop_read($memory, 0, 4));
// если id = 0, возможно сервер перезапускали
if (!$data[1]) {
// получим последний id
$sth = $dbh->query("SELECT MAX(`id`) FROM `chat`");
$max = (int)$sth->fetchColumn();
if ($max) {
// запишем максимальный ID в память
shmop_write($memory, pack('I', $max), 0);
$data[1] = $max;
}
}
// если ид в памяти меньше того что мы знаем
while ($data[1] <= $last_id) {
// зацикливаем в ожидании ид который мы не знаем, но что бы не грузить процессор ставим sleep в 1 секунду
sleep(3);
$data = unpack('I', shmop_read($memory, 0, 4));
}
// загружаем сообщения, которые были после последнего полученного нами, но не более 20
$sth = $dbh->prepare("SELECT * FROM `chat` WHERE `id` > :last_id ORDER BY `id` DESC LIMIT 20");
$sth->bindParam(':last_id', $last_id, PDO::PARAM_INT);
$sth->execute();
$result = array_reverse($sth->fetchall());
// отдаём массив сообщений в формате JSON
echo json_encode($result);
} catch (PDOException $e) {
echo 'Ошибка подключения: ' . $e->getMessage();
}
<?php
//Создаем юзера
//if (!isset($_COOKIE['user']))
//{
//$name = uniqid();
//$y2k = time()+3600;
//setcookie('user', $name);
//}
//else
//{
//$name = $_COOKIE['user'];
//}
//?>
<script src="jquery.min.js"></script>
<script>
$(function(){
var chat = $('#chat')[0]; // Окно чата
var form = $('#chat-form')[0]; // форма
var xhr; // запрос
// вешаем обработчик на отправку формы
$('#chat-form').submit(function(event){
// поле ввода
var text = $(form).find('input[type="text"]');
var user = $(form).find('input[type="hidden"]');
// выключаем форму пока не пришел ответ
$(form).find('input').attr("disabled", true);
// отправка сообщения
update(text, user);
// что бы форма не перезагружала страницу
return false;
});
function update(text, user) {
// что шлём
var send_data = { last_id: $(chat).attr('data-last-id') };
if (text)
send_data.text = $(text).val();
send_data.user = $(user).val();
if (xhr) {
xhr.abort();
}
// шлём запрос
xhr = $.post(
'ajax.php',
send_data, // отдаём скрипту данные
function (data) {
// ссылка пришла?
if (data && $.isArray(data)) {
$(data).each(function (k) {
// формируем наше сообщение
var msg = $('<div>' + data[k].created + ': ' + data[k].text + '</div>');
// и цепляем его к чату
$(chat).append(msg);
// если ласт ид меньше пришедшего
if (parseInt($(chat).attr('data-last-id')) < data[k].id)
// запоминаем новый ласт ид
$(chat).attr('data-last-id', data[k].id);
});
// если это отправка, то при получении ответа, включаем форму
if (text) {
// вклчюаем форму
$(form).find('input').attr("disabled", false);
// и очищаем текст
$(text).val('');
}
// прокрутка
$(chat).scrollTop(chat.scrollHeight);
// зацикливаем вызов обновления
update();
}
},
'JSON' // полученные данные рассматривать как JSON объект
);
}
// что бы при загрузке получить данные в чат, вызываем сразу апдейт
update();
});
</script>
<style>
#chat { overflow-x: scroll; height: 200px; }
</style>
<div id="chat" data-last-id="0"></div>
<form id="chat-form">
<input type="hidden" id="name" value="test"/>
<input type="text" id="chat-msg"/>
<input type="submit" value="написать"/>
</form>
Убрал параметр Last-id - все заработало. Но нет загрузки сообщений. Как исправить ?