[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблемка с чтением из файла. AJAX+PHP
Faantoom
Всем доброго времени суток.
Сегодня начал писать простенький движок AJAX чата на jQuery и PHP, и столкнулся с небольшой проблемкой:
Все сообщения у меня сохраняются в файл в таком формате:
...
4|16:52:06|Катя|привет
5|16:52:18|Fantom|хай))
...
первая колонка - номер сообщения
вторая - время
третья - никнейм
четвертая - сообщение

Загружаются сообщения переодическим запуском вот такой JS функции:
function loadMessage()
{
var lastmsg = $('span:last').attr("id");

$.post('get.php', 'msgid='+lastmsg, function(message)
{
$('#messagebox').append(message);
}, 'html');

};
Вот сам get.php:
<?php
$database = file('data.txt');
$msgid = htmlspecialchars($_POST['msgid']);
$msgid = $msgid + 1;
foreach ($database as $v)
{
$data = explode('|', $v);
if (trim($data[0]) == $msgid)
{
if ($data[2] != 'Гость' && $data[2] != 'Чат-робот')
{
echo '<span id="' . $data[0] . '">' . $data[1] . ' <a href="#" onclick="selectNickname(\'' . $data[2] . '\');">' . $data[2] . '</a>: ' . $data[3] . '</span><br />';
}
else
{
echo '<span id="' . $data[0] . '">' . $data[1] . ' <i>' . $data[2] . '</i>: ' . $data[3] . '</span><br />';
}
}

unset($data);
}
?>
Однако, таким способом читается только одно сообщение из файла за один цикл JS функции loadMessage().

Подскажите пожалуйста, как дополнить PHP обработчик, чтобы из файла считывались все новые сообщения после найденого $msgid, а не только одно? Весь день пытаюсь что-то придумать, не получается((
Заранее благодарен.



Спустя 34 минуты, 52 секунды (11.06.2011 - 23:33) Потрашитель написал(а):
Если данные заносятся в бд mysql,то надо тебе через sql Запрос - SELECT.
Короче тебе весь код приедтсья изменять.я бы на твоем месте сделал бы занесение сообщение в бд с помощью обычной html формы и sql запроса INSERT.Код не большой получится,и чтобы сверху поля добавления сообщения на товей странице сделал бы sql запрос SELECT и поставил бы LIMIT ввыводимых сообщений,например 2..короче если хочешь я тебе могу написать скрипт,оформишь его сам.За не большую сумму.100рублей.Если тебя устраивает,пиши в личку.

Спустя 1 минута, 55 секунд (11.06.2011 - 23:35) Faantoom написал(а):
Потрашитель, на sql я и сам написать могу =) Тут вся фишка какраз в том, чтобы всё хранить в файле))

Спустя 3 минуты, 52 секунды (11.06.2011 - 23:38) Потрашитель написал(а):
Тогда тут только ajax Надо использовать.ПО моему мнению,смысл использовать ещё и php,Если можно обойтись ajax.Это все спокойно и без php реализуется.
Извини,в ajax не оч силен.Так поверхностно

Спустя 41 секунда (11.06.2011 - 23:39) Потрашитель написал(а):
Почему ты решил хранить данные в файле?У тебя mysql на хосте не подключен чтоли?

Спустя 4 минуты (11.06.2011 - 23:43) sharki написал(а):
Faantoom
Сделал бы ты лучше сериализованным массивом, было бы круче. Ты бы смог и фильтровать и написать некий движок выборки

Спустя 39 секунд (11.06.2011 - 23:44) sharki написал(а):
Потрашитель
Есть разные типы хранилищ , не только Mysql...

Спустя 2 минуты, 28 секунд (11.06.2011 - 23:46) Faantoom написал(а):
Потрашитель, мне кажется, что просто AJAX-ом тут не обойтись...
Мускул не использую изза того, что чат является частью cms, которая тоже его не использует. А если чат сделать на мускуле, то cms теряет своё основное преимущество - отсутствие БД.

sharki, тоже хорошая мысль) но это придётся с самого начала всё переписывать... тот кусок скрипта что приведён здесь, лишь малая часть... а кроме этого уже написано достаточно много... и всё это переделывать долго, да и лень чесно говоря))

Спустя 5 минут, 58 секунд (11.06.2011 - 23:52) sharki написал(а):
Faantoom
а если ты уберешь это? unset($data);

Спустя 4 минуты, 30 секунд (11.06.2011 - 23:57) Faantoom написал(а):
sharki, хмм.... мысль.... ща попробую))
а хотя... смысл?) всё-равно не пройдёт через условие if (trim($data[0]) == $msgid)

Спустя 12 минут, 17 секунд (12.06.2011 - 00:09) sharki написал(а):
как это не пройдет? у тебя unset($data); находятся в самом форече. т.е первый раз итерацию прошел, и удалил массив..

Спустя 11 часов, 16 минут, 59 секунд (12.06.2011 - 11:26) Faantoom написал(а):
sharkisharki, всё-равно, $msqid то не меняется... попробовал удалить $unset($data), не работает...

Появилась еще одна идея... хоть так делать может и не совсем правильно...
сразу после вывода сделать $msgid = $msgid + 1; тогда по идее циклом должно прочитать все следующие сообщения по одному... ща попробую...

Спустя 10 минут, 30 секунд (12.06.2011 - 11:36) Faantoom написал(а):
Действительно заработало) Получилось примерно вот так:
<?php
$database = file('data.txt');
$msgid = htmlspecialchars($_POST['msgid']);
$msgid = $msgid + 1;
foreach ($database as $v)
{
$data = explode('|', $v);
if (trim($data[0]) == $msgid)
{
if ($data[2] != 'Гость' && $data[2] != 'Чат-робот')
{
echo '<span id="' . $data[0] . '">' . $data[1] . ' <a href="#" onclick="selectNickname(\'' . $data[2] . '\');">' . $data[2] . '</a>: ' . $data[3] . '</span><br />';
$msgid = $msgid + 1;
}
else
{
echo '<span id="' . $data[0] . '">' . $data[1] . ' <i>' . $data[2] . '</i>: ' . $data[3] . '</span><br />';
$msgid = $msgid + 1;
}
}

unset($data);
}
?>
Спасибо всем, вопрос снят.

Спустя 2 минуты, 52 секунды (12.06.2011 - 11:39) neadekvat написал(а):
Для первой версии, кажется, пойдет.
Но я бы посоветовал потом переписать: отправлять данные скрипту в формате json, а клиентская сторона уже пусть сама вставляет новые данные как нужно.

Спустя 7 минут, 28 секунд (12.06.2011 - 11:47) Faantoom написал(а):
neadekvat
Ну это моя первая серьёзная работа с AJAX) Всех тонкостей не знаю) Со временем конечно перепишу))

Спустя 4 минуты, 13 секунд (12.06.2011 - 11:51) neadekvat написал(а):
Отцепитесь от слова "ajax". Это всего лишь метод.
json - это формат передачи данных, и его удобно использовать. Познакомся обязательно. Вещь!

Спустя 2 минуты, 14 секунд (12.06.2011 - 11:53) Faantoom написал(а):
Окей)) Познакомлюсь)) Спасибо))

Спустя 3 часа, 38 минут, 24 секунды (12.06.2011 - 15:32) vadimk написал(а):
Faantoom
Пробовал отправлять сообщение со знаком "|" ?

Спустя 6 минут, 37 секунд (12.06.2011 - 15:38) Faantoom написал(а):
vadimk, знаю) уже исправил) сделал разделитель <|> =)
htmlspecialchars() не пропустит =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.