система сообщений с временными метками

  • Автор темы InstantVDS
  • 15
  • Обновлено
  • 18, May 2024
  • #1
Привет, Я добавляю систему сообщений в игру, но у меня возникают проблемы с сопоставлением меток времени и выполнением запросов.

В основном у меня есть пара столов.

Тот, который содержит временную метку персонажа.

Другой хранит сообщения.

Временная метка персонажа обновляется, поэтому старые сообщения больше не приходят.

Сейчас я постоянно получаю одни и те же сообщения, независимо от того, сколько им лет. Вот данные из моих реальных таблиц: характер 1491806607 Сообщения 1491799854 1491800178 Имеет смысл, что я получаю одни и те же сообщения.

Штамп символа всегда новее штампа сообщения.

Так как же правильно это настроить? Я не был уверен в этом запросе, но, похоже, он поступает правильно.
 header('Content-Type: application/json');

session_start();

if(isset($_SESSION['ID']) && isset($_SESSION['serial']))

{

include('../classes/Character.php');

include('../classes/TimeObject.php');

include(__DIR__ . '/../../../sqldata/sqldata.php');

try{

$db = new PDO($dsn, $dbUsername, $dbPassword);

}catch(\PDOException $e){}

$character = new Character;

$character->set_db($db);

$character->set_character();

$character->set_location();

$time = new TimeObject;

$sqlStamp = $db->prepare('SELECT `stamp` FROM `characters_message_stamps_36933753` WHERE `character` = ?');

$sqlStamp->execute(array($character->return_name()));

$stamp = $sqlStamp->fetch();

if($time->minutes_passed($stamp['stamp']) >= 2)

{

// update the stamp

$sqlUpdate = $db->prepare('UPDATE `characters_message_stamps_36933753` SET `stamp` = ? WHERE `character` = ?');

$sqlUpdate->execute(array(time(), $character->return_name()));

}else{

// fetch all messages to the character, including OOC message if OOC is on

// Fetch where messages stamp is newer than current character_message_stamps stamp

$sqlFetch = $db->prepare('SELECT `channel`, `character`, `message`, `icon`, `token` FROM `world_messages_36933753` WHERE `roomToken` = ? AND `channel` = ? OR `channel` = ? AND `stamp` > ?');

$sqlFetch->execute(array($character->return_room_token(), 'all', $character->return_name(), $stamp['stamp']));

$messages = $sqlFetch->fetchAll();

if($_POST['ocObj'] == 'on'){

// fetch occ too

$sqlFetchOC = $db->prepare('SELECT `channel`, `character`, `message`, `icon`, `token` FROM `world_messages_36933753` WHERE `channel` = ? AND `stamp` > ?');

$sqlFetchOC->execute(array('oc', $stamp['stamp']));

$ocMessages = $sqlFetchOC->fetchAll();

// splice this to other messages

$messageList = array_merge($messages, $ocMessages);

}else{

$messageList = $messages;

}

// Reset the stamp to current

$sqlUpdate = $db->prepare('UPDATE `characters_message_stamps_36933753` SET `stamp` = ? WHERE `character` = ?');

$sqlUpdate->execute(array(time(), $character->return_name()));

}

echo json_encode($messageList);

}
Код (разметка): Это немного забавно. А также та часть, где я обновляю штамп, если он старый, прежде чем что-либо получить.
  $sqlStamp = $db->prepare('SELECT `stamp` FROM `characters_message_stamps_36933753` WHERE `character` = ?'); $sqlStamp->execute(array($character->return_name())); $stamp = $sqlStamp->fetch(); if($time->minutes_passed($stamp['stamp']) >= 2) { // update the stamp $sqlUpdate = $db->prepare('UPDATE `characters_message_stamps_36933753` SET `stamp` = ? WHERE `character` = ?'); $sqlUpdate->execute(array(time(), $character->return_name())); }
Код (разметка):
 'SELECT `channel`, `character`, `message`, `icon`, `token` FROM `world_messages_36933753` WHERE `roomToken` = ? AND `channel` = ? OR `channel` = ? AND `stamp` > ?'
Код (разметка):

InstantVDS


Рег
28 Jan, 2012

Тем
1

Постов
2

Баллов
12
  • 04, Jun 2024
  • #2
Хорошо, Я немного отредактировал.

Я изменил временную отметку символа в конце, чтобы она соответствовала последней временной отметке для извлеченных сообщений, но по какой-то причине есть небольшая разница.

Я получаю сообщения с этим запросом, но все старые.

Если я изменю знак равенства в запросе, я не получу никаких сообщений. комната: 50a80e41ccdba416b3b28390 персонаж: Рагнок штамп персонажа: 1491816864 1491816588 1491816728 1491816779 1491816834 <- отметка последнего сообщения.
 <?php

header('Content-Type: application/json');

session_start();

if(isset($_SESSION['ID']) && isset($_SESSION['serial']))

{

include('../classes/Character.php');

include('../classes/TimeObject.php');

include(__DIR__ . '/../../../sqldata/sqldata.php');

try{

$db = new PDO($dsn, $dbUsername, $dbPassword);

}catch(\PDOException $e){}

$character = new Character;

$character->set_db($db);

$character->set_character();

$character->set_location();

$time = new TimeObject;

$sqlStamp = $db->prepare('SELECT `stamp` FROM `characters_message_stamps_36933753` WHERE `character` = ?');

$sqlStamp->execute(array($character->return_name()));

$stamp = $sqlStamp->fetch();

if($time->minutes_passed($stamp['stamp']) >= 2)

{

// update the stamp

$sqlUpdate = $db->prepare('UPDATE `characters_message_stamps_36933753` SET `stamp` = ? WHERE `character` = ?');

$sqlUpdate->execute(array(time(), $character->return_name()));

}else{

// fetch all messages to the character, including OC message if OC is on

// Fetch where messages stamp is newer than current character_message_stamps stamp

// fetch messages to character

$sqlFetchMessages = $db->prepare('SELECT `channel`, `character`, `message`, `icon`, `stamp`, `token` FROM `world_messages_36933753`

WHERE `roomToken` = ? AND `channel` = ? AND `stamp` > ?

UNION

SELECT `channel`, `character`, `message`, `icon`, `stamp`, `token` FROM `world_messages_36933753`

WHERE `roomToken` = ? AND `channel` = ? AND `stamp` > ?

UNION

SELECT `channel`, `character`, `message`, `icon`, `stamp`, `token` FROM `world_messages_36933753`

WHERE `roomToken` = ? AND `channel` = ? AND `stamp` > ?');

$sqlFetchMessages->execute(array($character->return_room_token(),

$character->return_name(),

$stamp['stamp'],

$character->return_room_token(),

'all',

$stamp['stamp'],

$character->return_room_token(),

'system',

$stamp['stamp']));

$messages = $sqlFetchMessages->fetchAll();

// Fetch OC messages

if($_POST['ocObj'] == 'on'){

$sqlFetchOC = $db->prepare('SELECT `channel`, `character`, `message`, `icon`, `stamp`, `token` FROM `world_messages_36933753` WHERE `channel` = ? AND `stamp` > ?');

$sqlFetchOC->execute(array('oc', $stamp['stamp']));

$ocMessages = $sqlFetchOC->fetchAll();

// splice this to other messages

$messageList = array_merge($messages, $ocMessages);

}else{

$messageList = $messages;

}

$count = count($messageList);

// Reset the stamp to current

$sqlUpdate = $db->prepare('UPDATE `characters_message_stamps_36933753` SET `stamp` = ? WHERE `character` = ?');

$sqlUpdate->execute(array($messageList[$count - 1]['stamp'], $character->return_name()));

}

echo json_encode($messageList);

?>
Код (разметка):
 

Дима Александров


Рег
16 Jan, 2013

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966

Интересно