- 18, May 2024
- #1
Привет,
Я добавляю систему сообщений в игру, но у меня возникают проблемы с сопоставлением меток времени и выполнением запросов.
В основном у меня есть пара столов.
Тот, который содержит временную метку персонажа.
Другой хранит сообщения.
Временная метка персонажа обновляется, поэтому старые сообщения больше не приходят.
Сейчас я постоянно получаю одни и те же сообщения, независимо от того, сколько им лет. Вот данные из моих реальных таблиц: характер 1491806607 Сообщения 1491799854 1491800178 Имеет смысл, что я получаю одни и те же сообщения.
Штамп символа всегда новее штампа сообщения.
Так как же правильно это настроить? Я не был уверен в этом запросе, но, похоже, он поступает правильно.
В основном у меня есть пара столов.
Тот, который содержит временную метку персонажа.
Другой хранит сообщения.
Временная метка персонажа обновляется, поэтому старые сообщения больше не приходят.
Сейчас я постоянно получаю одни и те же сообщения, независимо от того, сколько им лет. Вот данные из моих реальных таблиц: характер 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` > ?'
Код (разметка):