#javascript #php #ajax
#javascript #php #ajax
Вопрос:
Итак, у меня есть эта задача, когда я должен показывать данные на больших экранах телевизора. Я думаю, что я понял это, но некоторые «особенности» или некоторые говорят, что появляются ошибки. Я не эксперт ни на одном уровне, но застрял и не знаю, куда идти.
Некоторый код:
<?php
require(db_conn.php);
$tv_ip = mysqli_real_escape_string($conn,$_SERVER['REMOTE_ADDR']);
$tv_select = mysqli_query($conn, "SELECT LocationName FROM busyrooms WHERE IpAddress='$tv_ip'");
$tv_row= mysqli_fetch_row($tv_select);
$tvname=$dock_row[0];
$sql=mysqli_query($conn,"SELECT Location, Status, Date_Time FROM location_status WHERE Location='$tvname' ORDER BY Date_Time DESC LIMIT 1");
$row = mysqli_fetch_row($sql);
$sql2=mysqli_query($conn,"SELECT parameter_value FROM parameters WHERE parameter_name='Normal_Meeting_time'");
$row2 = mysqli_fetch_row($sql2);
$name = $row[0];
$status_from_table =$row[1];
$target_time=$row2[0];
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="cache-control" content="no-cache">
<link rel="stylesheet" href="CSS/pacemaker_styles.css">
<title>MANAGEMENT SYSTEM</title>
</head>
<body>
<div id="name"><?=$name ?></div>
<div id="target">Target</div>
<div id="target-time"><?=$target_time?></div>
<div id="status_now"><?=$status_from_table?></div>
<div id="timer">00:00:00</div>
<script src="LIB/jquery.min.js"></script>
<script>
$(document).ready(function(){
let status_now = document.getElementById('status_now').innerHTML;
let targetTime = document.getElementById('target-time');
let dataTargetTime = targetTime.textContent;
let actualTime = dataTargetTime.split(':').reduce((acc,time) => (60 * acc) time);
let timerVar = setInterval(countTimer, 1000);
let totalSeconds = 0;
function countTimer() {
totalSeconds;
let hour = Math.floor(totalSeconds /3600);
let minute = Math.floor((totalSeconds - hour*3600)/60);
let seconds = totalSeconds - (hour*3600 minute*60);
if(hour < 10)
hour = "0" hour;
if(minute < 10)
minute = "0" minute;
if(seconds < 10)
seconds = "0" seconds;
document.getElementById("timer").innerHTML = hour ":" minute ":" seconds;
if(actualTime == totalSeconds){
document.getElementById('status_now').style.backgroundColor="#cc0000";
document.getElementById('status_now').style.color="#ffffff";
document.getElementById('status_now').innerHTML="Delayed Meeting";
}
}
document.getElementById('status_now').value = status_now;
setInterval(() => {
$.ajax({
type: "POST",
url: 'check.php',
data: {'status': $('#status_now').prop('value')},
success: function(result) {
switch (result) {
case 'ROOM_IN':
document.getElementById("status_now").innerHTML = "Meeting in progress";
break;
case 'Room_OUT':
document.getElementById("status_now").innerHTML = "The room is empty";
break;
default:
document.getElementById("status_now").innerHTML = " There was an error!";
document.getElementById('status_now').style.backgroundColor="#cc0000";
break;
}
}
});
}, 1000);
});
</script>
</body>
</html>
The check.php
<?php
session_start();
require ('functions.php'); //check_input comes from here
require ('db_conn.php');
$status = check_input($_POST["status"]);
$tv_ip = mysqli_real_escape_string($conn,$_SERVER['REMOTE_ADDR']);
$tv_select = mysqli_query($conn, "SELECT LocationName FROM busyrooms WHERE IpAddress='$tv_ip'");
$tv_row= mysqli_fetch_row($tv_select);
$tvname=$tv_row[0];
$sql=mysqli_query($conn,"SELECT Status FROM location_status WHERE Location='$tvname' ORDER BY Date_Time DESC LIMIT 1");
$row = mysqli_fetch_row($sql);
$actual_status =$row[0];
if ($status == "RoomIn") {
echo "ROOM_IN";
} elseif ($status == "DockOut") {
echo "ROOM_OUT";
}
?>
Таким образом, ajax проверяет базу данных каждую секунду в поисках изменений.(Я думаю, я не уверен)
Если он получает ROOM_OUT, я просто хочу, чтобы div «status_now» сообщал «Комната пуста» и не запускал таймер.
Если он получает Room_In, я хочу запустить таймер и сказать «Совещание продолжается», как всегда, когда достигается целевое время, мне нужно изменить цвет фона таймера div на красный, и если они покинули комнату, то первое, что произойдет. Может кто-нибудь дать мне подсказку, где я ошибся в этом?
Спасибо всем.
Ответ №1:
Запуск и остановка интервального таймера в функции успеха в зависимости от результата.
Кроме того, чтобы не запускать несколько таймеров, я проверяю, установлен ли timerVar
он уже перед повторным запуском таймера.
Другая проблема заключается в том, что $("#status_now").prop("value")
это неверно. value
Свойство существует только во входных элементах, но #status_now
является DIV. Используется .text()
для получения содержимого DIV.
$(document).ready(function() {
let status_now = document.getElementById('status_now').innerHTML;
let targetTime = document.getElementById('target-time');
let dataTargetTime = targetTime.textContent;
let actualTime = dataTargetTime.split(':').reduce((acc, time) => (60 * acc) time);
let timerVar;
let totalSeconds = 0;
function countTimer() {
totalSeconds;
let hour = Math.floor(totalSeconds / 3600);
let minute = Math.floor((totalSeconds - hour * 3600) / 60);
let seconds = totalSeconds - (hour * 3600 minute * 60);
if (hour < 10)
hour = "0" hour;
if (minute < 10)
minute = "0" minute;
if (seconds < 10)
seconds = "0" seconds;
document.getElementById("timer").innerHTML = hour ":" minute ":" seconds;
if (actualTime == totalSeconds) {
document.getElementById('status_now').style.backgroundColor = "#cc0000";
document.getElementById('status_now').style.color = "#ffffff";
document.getElementById('status_now').innerHTML = "Delayed Meeting";
}
}
document.getElementById('status_now').value = status_now;
setInterval(() => {
$.ajax({
type: "POST",
url: 'check.php',
data: {
'status': $('#status_now').text()
},
success: function(result) {
switch (result) {
case 'ROOM_IN':
document.getElementById("status_now").innerHTML = "Meeting in progress";
clearInterval(timerVar);
timerVar = null;
break;
case 'Room_OUT':
document.getElementById("status_now").innerHTML = "The room is empty";
if (!timerVar) {
timerVar = setInterval(countTimer, 1000);
}
break;
default:
document.getElementById("status_now").innerHTML = " There was an error!";
document.getElementById('status_now').style.backgroundColor = "#cc0000";
break;
}
}
});
}, 1000);
});
В вашем PHP вы используете $status
для создания выходных данных. Результат запроса находится внутри $actual_status
. Так и должно быть:
if ($actual_status == "RoomIn") {
echo "ROOM_IN";
} elseif ($actual_status == "DockOut") {
echo "ROOM_OUT";
}
Комментарии:
1. Какой хороший совет. Это было действительно полезно, спасибо. Теперь осталось только понять, почему status_now не меняется при изменении данных в БД.
2. Убедитесь, что скрипт AJAX не повторяет ничего другого. Проверьте вкладку Сеть, чтобы увидеть полный ответ.
3. К сожалению, скрипт больше ничего не повторяет.
4. Может быть, есть пробелы, попробуйте
switch(result.trim())
. Если это не сработает, добавьтеconsole.log(result)
, чтобы увидеть, что он на самом деле получает.5. Я зарегистрировал его, сначала он получает его прямо из БД при загрузке страницы, но когда я меняю данные в БД не на странице на ROOM_OUT, страница не распознает изменение. Я думаю, что в коде может быть логическая ошибка. Он просто продолжает регистрировать первое, что он получает.