Задать вопрос
Android97
@Android97
Бэкенд и немного фронтенд разработчик

Почему не отправляется сообщение?

Делал по уроку 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 - все заработало. Но нет загрузки сообщений. Как исправить ?
  • Вопрос задан
  • 2352 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@zildarius
Нужно больше данных. Что именно происходит? Приходит ли вообще ответ от сервера? Если да, то какой?
Вообще происходит ли отправка запроса?
Если запрос нормально уходит - то дело в php. Если ненормально, то в js.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽