Сегодня начал писать простенький движок AJAX чата на jQuery и PHP, и столкнулся с небольшой проблемкой:
Все сообщения у меня сохраняются в файл в таком формате:
...первая колонка - номер сообщения
4|16:52:06|Катя|привет
5|16:52:18|Fantom|хай))
...
вторая - время
третья - никнейм
четвертая - сообщение
Загружаются сообщения переодическим запуском вот такой JS функции:
function loadMessage()Вот сам get.php:
{
var lastmsg = $('span:last').attr("id");
$.post('get.php', 'msgid='+lastmsg, function(message)
{
$('#messagebox').append(message);
}, 'html');
};
<?phpОднако, таким способом читается только одно сообщение из файла за один цикл JS функции loadMessage().
$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);
}
?>
Подскажите пожалуйста, как дополнить PHP обработчик, чтобы из файла считывались все новые сообщения после найденого $msgid, а не только одно? Весь день пытаюсь что-то придумать, не получается((
Заранее благодарен.
Спустя 34 минуты, 52 секунды (11.06.2011 - 23:33) Потрашитель написал(а):
Если данные заносятся в бд mysql,то надо тебе через sql Запрос - SELECT.
Короче тебе весь код приедтсья изменять.я бы на твоем месте сделал бы занесение сообщение в бд с помощью обычной html формы и sql запроса INSERT.Код не большой получится,и чтобы сверху поля добавления сообщения на товей странице сделал бы sql запрос SELECT и поставил бы LIMIT ввыводимых сообщений,например 2..короче если хочешь я тебе могу написать скрипт,оформишь его сам.За не большую сумму.100рублей.Если тебя устраивает,пиши в личку.
Короче тебе весь код приедтсья изменять.я бы на твоем месте сделал бы занесение сообщение в бд с помощью обычной 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 не оч силен.Так поверхностно
Извини,в ajax не оч силен.Так поверхностно
Спустя 41 секунда (11.06.2011 - 23:39) Потрашитель написал(а):
Почему ты решил хранить данные в файле?У тебя mysql на хосте не подключен чтоли?
Спустя 4 минуты (11.06.2011 - 23:43) sharki написал(а):
Faantoom
Сделал бы ты лучше сериализованным массивом, было бы круче. Ты бы смог и фильтровать и написать некий движок выборки
Сделал бы ты лучше сериализованным массивом, было бы круче. Ты бы смог и фильтровать и написать некий движок выборки
Спустя 39 секунд (11.06.2011 - 23:44) sharki написал(а):
Потрашитель
Есть разные типы хранилищ , не только Mysql...
Есть разные типы хранилищ , не только Mysql...
Спустя 2 минуты, 28 секунд (11.06.2011 - 23:46) Faantoom написал(а):
Потрашитель, мне кажется, что просто AJAX-ом тут не обойтись...
Мускул не использую изза того, что чат является частью cms, которая тоже его не использует. А если чат сделать на мускуле, то cms теряет своё основное преимущество - отсутствие БД.
sharki, тоже хорошая мысль) но это придётся с самого начала всё переписывать... тот кусок скрипта что приведён здесь, лишь малая часть... а кроме этого уже написано достаточно много... и всё это переделывать долго, да и лень чесно говоря))
Мускул не использую изза того, что чат является частью cms, которая тоже его не использует. А если чат сделать на мускуле, то cms теряет своё основное преимущество - отсутствие БД.
sharki, тоже хорошая мысль) но это придётся с самого начала всё переписывать... тот кусок скрипта что приведён здесь, лишь малая часть... а кроме этого уже написано достаточно много... и всё это переделывать долго, да и лень чесно говоря))
Спустя 5 минут, 58 секунд (11.06.2011 - 23:52) sharki написал(а):
Faantoom
а если ты уберешь это? unset($data);
а если ты уберешь это? unset($data);
Спустя 4 минуты, 30 секунд (11.06.2011 - 23:57) Faantoom написал(а):
sharki, хмм.... мысль.... ща попробую))
а хотя... смысл?) всё-равно не пройдёт через условие if (trim($data[0]) == $msgid)
а хотя... смысл?) всё-равно не пройдёт через условие 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; тогда по идее циклом должно прочитать все следующие сообщения по одному... ща попробую...
Появилась еще одна идея... хоть так делать может и не совсем правильно...
сразу после вывода сделать $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, а клиентская сторона уже пусть сама вставляет новые данные как нужно.
Но я бы посоветовал потом переписать: отправлять данные скрипту в формате json, а клиентская сторона уже пусть сама вставляет новые данные как нужно.
Спустя 7 минут, 28 секунд (12.06.2011 - 11:47) Faantoom написал(а):
neadekvat
Ну это моя первая серьёзная работа с AJAX) Всех тонкостей не знаю) Со временем конечно перепишу))
Ну это моя первая серьёзная работа с AJAX) Всех тонкостей не знаю) Со временем конечно перепишу))
Спустя 4 минуты, 13 секунд (12.06.2011 - 11:51) neadekvat написал(а):
Отцепитесь от слова "ajax". Это всего лишь метод.
json - это формат передачи данных, и его удобно использовать. Познакомся обязательно. Вещь!
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() не пропустит =)
htmlspecialchars() не пропустит =)