|
|
|
| 1. Требуется создать онлайн викторину.
2. Управлять викториной должен ведущий, он же администратор.
3. Необходимо задать синхронный старт для заявившихся на участие игроков.
а именно - установил я время начала игры в 20:00 10 декабря 2008 года по московскому
времени и каждый открывший мою страницу до 20:00 MSK 10 декабря 2008 года должен
увидеть - сколько дней:часов:минут:секунд до начала игры осталось и у каждого, кто будет на
странице с 20:00 до 20:05 MSK 10 декабря 2008 года, должна появиться форма с логином/
паролем. Кто отстал на старте - ждать не станем.
4. Необходима синхронная смена вопросов.
От пользователя не требуется отвечать на вопрос нажатием на какую-либо кнопку.
Смена вопросов представляет собой просто показ текста, который пользователь будет
только читать.
6. Обработка ответов не требуется. на этом
7. Вывод результатов викторины вручную. и на этом внимания не заострять | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Надеюсь теперь более понятно что я имел ввиду! | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Тема сисек цена вопроса не раскрыта.
| |
|
|
|
|
автор: DEM(универ) (09.12.2008 в 10:41) |
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Средньненькое ТЗ скажу я вам... Видите ли этот форум создан и особено раздел создан для ВОПРОСОВ по РНР а не просьба НАПИШИТЕ МНЕ ТО-ТО :) | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Ну да :)
Просто так Вам писать этот скрипт никто не будет, это во-первых.
Ну и форум этот не для этого
Если есть какие-то наработки, и непонятки в чем-то, пишите будем разбиратся | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Тут просто только вариант накупить книжек о пхп,яваскрипт[,аякс]
Сесть и позубрить. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Ну чего вы все напали то... Он сам напишет, надо помочь просто. Это я попросил алгоритм расписать.
Вот теперь следующий вопрос. База данных есть? Если есть, то структуру. А если ругаться будут - ко мне в аську. | |
|
|
|
|
|
|
|
для: Николай2357
(09.12.2008 в 15:55)
| | Ты какую именно базу данных имеешь ввиду?
И спасибо за помощь эту и будущую. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 17:16)
| | Для того, что бы сделать синхронное управление, нужно на сервере оставлять информацию, к которой браузеры участников будут обращаться. Им нужно задать режим. Это тот "таймер", о котором ты так много посал. Вопросы для викторины откуда берутся? | |
|
|
|
|
|
|
|
для: Николай2357
(09.12.2008 в 17:35)
| | Вопросы будут регулярно обновляться вручную мной в базе данных через админку. Поля: id, date, time, vopros1, vopros2, ..., vopros10 (думаю так). | |
|
|
|
|
|
|
|
для: Dmitry_RM
(10.12.2008 в 17:54)
| | Вот в эту таблицу надо добавить еще одно поле, куда писать временную метку. И на её основе уже строить логику. Уже подсказали, что нужно расчитать время между этой меткой и текущим временем. это и будет время до старта. Его и нужно задать браузеру на рефреш. | |
|
|
|
|
|
|
|
для: Николай2357
(11.12.2008 в 18:46)
| | Там как минимум нужно будет добавить еще одну таблицу, вместо этого безобразия с vopros1...vopros10
Не в коня корм. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Я с удовольствием выслушаю предложение любого по этому поводу. Может у кого мысли какие есть? | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Может кто-нибудь что-нибудь подскажет. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(11.12.2008 в 16:35)
| | $delay = ... ;// тут нужно рассчитать, сколько секунд осталось до очередного вопроса.
Header("Refresh: $delay; url=test.php"); | |
|
|
|
|
|
|
|
для: Trianon
(11.12.2008 в 16:48)
| | >$delay = ... ;// тут нужно рассчитать, сколько секунд осталось до очередного вопроса.
Как можно это сделать, что-то у меня не получается. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(12.12.2008 в 19:03)
| | что-то я не вижу как у вас не получается.
вижу, что в тырите куски кода откуда ни попадя, и пытаетесь их присобачивать, объединять, изменять...
Загляните в справочник функций, отберите пару штук нужных,
напишите пару строк сами - это не так сложно. | |
|
|
|
|
|
|
|
для: Trianon
(12.12.2008 в 19:31)
| | Самому писать с самого начала для меня пока сложно. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(12.12.2008 в 20:13)
| | хорошо, я подскажу. Потребуются функции time() и strtotime() | |
|
|
|
|
|
|
|
для: Trianon
(12.12.2008 в 20:28)
| | time - Возвращает текущую метку времени
strtotime - Преобразует текстовое представление даты на английском языке в метку времени Unix
Ну хоть пример какой-нибудь напишите. То что у меня получается даже показывать не хочется. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(12.12.2008 в 20:40)
| | вот если из одного вычесть другое - будет как раз интервал в секундах.
важнее то, что strtotime может преобразовать представление не только на английском языке, но и представление, в котором выдает дату-время сервер MySQL . | |
|
|
|
|
|
|
|
для: Trianon
(12.12.2008 в 21:46)
| | См. ниже. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(11.12.2008 в 16:35)
| | Тут уже много чего наподсказывали, и если никаких выводов вы не сделали угадайте чьи это проблемы? Вам надо учить мат часть. Без базовых (хотя бы) знаний вы не только ничего сделать не сможете, но даже не сможете (именно это и происходит сейчас) понять что вам говорят. И не факт что выучив "на зубок" все операторы языка, у вас "попрёт"... ведь главное это логика. | |
|
|
|
|
|
|
|
для: Valick
(11.12.2008 в 16:50)
| | У меня уже получается, скоро выложу что получилось. Подкорректируете? (если что) | |
|
|
|
|
|
|
|
для: Dmitry_RM
(11.12.2008 в 20:48)
| | Базара нема.... уже и руки чешутся чёнть подкорректирровать))) | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Для начала разберемся с появлением блока авторизации по прошествии определенного времени:
Я весь блок авторизации вынес в отдельный файл, и в этот файл поставил скрипт счетчика, который мне дали получилось так:
<script>
var TA = 60; //тайм-аут в секундах
var CT = 1; //период изменения показаний таймера
onload = function myTimer ()
{
if (TA > 0)
{
TA--;
document.getElementById ('tim01').innerHTML = ((TA < 10) ? '0' : '') + '' + TA;
setTimeout (myTimer, CT * 1000);
}
else
{
document.getElementById ('tim01').style.display = 'none';
document.forms.myForm.style.display = 'block';
}
}
</script>
<? .... сам блок, могу конечно выложить весь, но у меня с ним проблем нет - работает ...
?>
<CENTER><BR>
<FORM NAME="myForm" style="display: none" METHOD=POST>
<P><B>Вход для зарегестрированных пользователей:</B><BR><BR>
Логин <INPUT TYPE='TEXT' SIZE=11 MAXLENGTH=12 NAME='login'>
Пароль <INPUT TYPE='PASSWORD' SIZE=11 MAXLENGTH=12 NAME='password'>
<INPUT TYPE='submit' NAME='admin' VALUE='Ok' class=but
style="width:24px;cursor:hand;" onmouseover="this.style.backgroundColor='LIGHTYELLOW';" onmouseout="this.style.backgroundColor='transparent';">
</FORM><BR>
</BODY>
</HTML>
<? ... продолжение блока...
?>
<? //пока только это показывает при введения правильного логина и пароля
function ShowArea()
{
?>
<BR><CENTER><P>
Доступ открыт!<BR>
Добро пожаловать.<BR><BR>
----------------------------------------<BR>
<BR><BR>Здесь Ваша информация...<BR><BR><BR>
----------------------------------------<BR>
<A HREF='index.php'>Выход</A><BR><BR>
<? ... дольше код блока авторизации
?>
|
Работает, но мне требуется установить время до начала в днях, часах, минутах, секундах.
И как сделать чтобы время не сбрасывалось при обновлении страницы или перезагрузке браузера?
и есть еще такое:
$time=4654654;
$day=floor($time/86400);
$hours=floor(($time/3600)-$day*24);
$min=floor(($time-$hours*3600-$day*86400)/60);
$sec=$time-($min*60+$hours*3600+$day*86400);
//echo "Дни - $day : Часы - $hours : Минуты - $min : Секунды - $sec";
|
Может как-нибудь можно это объединить? | |
|
|
|
|
|
|
|
для: Dmitry_RM
(12.12.2008 в 07:34)
| | >и есть еще такое:
Ну это совсем штука лишняя. почитайте здесь.
А для таймера нужно записать в таблицу время старта, допустим в такои формате
<?
$start_time = date("U");
|
и от него уже плясать. В JS нужно передать значение из таблицы, сравненное с текущим временем в этом же формате. Тогда при перезагрузке или других поползновениях юзера обратный отсчёт не остановится. | |
|
|
|
|
|
|
|
для: Николай2357
(12.12.2008 в 09:25)
| | Правильно ли так показать текущее время:
<SCRIPT LANGUAGE="JavaScript">
var now = new Date();
var hours = now.getHours();
var minutes = now.getMinutes();
var sec = now.getSeconds();
var timeValue = "" + ((hours >24) ? hours -24 :hours)
timeValue += ((minutes < 10) ? ":0" : ":") + minutes + ((sec < 10) ? ":0" : ":")+ sec
timerRunning = true;
document.write("<B><P ALIGN=RIGHT><FONT SIZE=-1 FACE=VERDANA,ARIAL>" + timeValue );
</SCRIPT>
|
И как я понял следует создать таблицу, содержащую 2 поля: id, start_time.
Где start_time - дата и время начала игры.
Тогда как сравнивать start_time с текущим временем. Логически я понял, но написать не получается. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(12.12.2008 в 14:38)
| | не трогайте время на клиенте вообще.
Берите интервал времени с сервера.
Его и считайте. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(12.12.2008 в 14:38)
| | А зачем Вам текущее время? У всех часы есть. Вам стоит показывать обратный отсчёт. Допустим до старта викторины осталось:.....
Вы же где то уже находили скрипт обратного отсчёта. А все расчеты надо делать на сервере, как Вам подсказывают. Потом, при формировании странички в начальное время для запуска обратного таймера выдать результат расчетов. И обновить страницу по истечении времени. Давайте ссылку на таймер, я примерно покажу. | |
|
|
|
|
|
|
|
для: Николай2357
(12.12.2008 в 16:33)
| | Вы про этот таймер отсчета обратного времени?
<SCRIPT LANGUAGE="JavaScript">
var g_iCount = new Number();
var g_iCount = 100;
function startCountdown(){
if((g_iCount - 1) >= 0){
g_iCount = g_iCount - 1;
numberCountdown.innerText = '00:00:' + g_iCount;
setTimeout('startCountdown()',1000);
}
}
</script>
|
Теперь понял на счет того что надо делать на сервере, только у меня теперь три вопроса:
1. Не будет ли разницы между временем на сервере и временем на клиенте, т.е. не будет ли так что у клиентов с разных часовых поясов рапускаться по разному?
2. Как это сделать? (хоть примерный код или поподробнее описание)
3. Как сравнивать время на сервере с временем на клиенте? | |
|
|
|
|
|
|
|
для: Dmitry_RM
(12.12.2008 в 14:38)
| | - | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | У меня вот так получилось:
$now = 'now';
$timestamp = strtotime($now);
echo "Cейчас - " . date('d F Y h:i:s A', $timestamp);
print ('<br>');
$start = '20081214 1700';
$timestamp = strtotime($start);
echo " Викторина начнется - " . date('d F Y h:i:s A', $timestamp);
print ('<br>');
$start_time=strtotime($start) - strtotime($now);
$day=floor($start_time/86400);
$hours=floor(($start_time/3600)-$day*24);
$min=floor(($start_time-$hours*3600-$day*86400)/60);
$sec=$start_time-($min*60+$hours*3600+$day*86400);
print ('<br>');
echo " До начала викторины осталось: $day : $hours : $min : $sec";
?>
|
Работает вроде правильно: считает и показывает сколько осталось до начала.
Только надо рабобраться с рефрешем.
Что скажете? | |
|
|
|
|
|
|
|
для: Dmitry_RM
(13.12.2008 в 08:11)
| | Ну а сами разложить логически то, что собрали из кусков, не пытались? Ведь очевидно, что вот этот кусок
<?
$day=floor($start_time/86400);
$hours=floor(($start_time/3600)-$day*24);
$min=floor(($start_time-$hours*3600-$day*86400)/60);
$sec=$start_time-($min*60+$hours*3600+$day*86400);
|
можно отформатировать так же, как и верхний, с помощью функции date();
А как сделать рефрешь, Вам писали выше. Полное ощущение, что Вы совсем не вникаете не только в то, что Вам советуют, но и в то, что пишете сами. И обратный отсчёт уже Вам не нужен стал, как я понял... | |
|
|
|
|
|
|
|
для: Николай2357
(13.12.2008 в 11:04)
| | Вот у меня появилась минутка и хорошее настроение )))))
Я собрал в кучу всё, что было в этой теме. Смотрите, анализируйте, оптимизируйте, ищите ошибки и вперед. Это Вам, чтоб принцип понять.
<?php
$timestamp = strtotime('now');
$start = '20081214 1700';
$timestamp = strtotime($start);
$start_time=strtotime($start) - strtotime($now);
header("Refresh: $start_time; url=test.php");
$day=floor($start_time/86400);
$hours=floor(($start_time/3600)-$day*24);
$min=floor(($start_time-$hours*3600-$day*86400)/60);
$sec=$start_time-($min*60+$hours*3600+$day*86400);
?>
<html>
<head>
<SCRIPT LANGUAGE='JavaScript'>
var d = <?php echo $day ?>;
var h = <?php echo $hours ?>;
var i = <?php echo $min ?>;
var s = <?php echo $sec ?>;
function startCountdown()
{
s--;
d=(d<0)?0:d;
h=(h<0)?0:h;
i=(i<0)?0:i;
var ii=(i >= 10)?"":"0";
var ss=(s >= 10)?"":"0";
if((s-1) > 0)
{
document.getElementById('start_time').innerHTML = 'дней: '+ d+' часов: '+h+' минут: '+ii+i+' секунд: '+ss+s;
setTimeout('startCountdown()',10);
}
else
{
i--;
s = 60;
startCountdown()
}
if(i==0&&h!=0)
{
h--;
i=59;
}
if(h==0&&d!=0)
{
d--;
h=23;
}
}
</script>
</head>
<body onload="startCountdown()">
Викторина начнется -
<?php echo date('d F Y h:i:s A', $timestamp);?>
<br>
До начала викторины осталось <br />
<div id="start_time"></div></body>
|
| |
|
|
|
|
|
|
|
для: Николай2357
(14.12.2008 в 00:56)
| |
<?php
$timenow = strtotime('now');
$start = '20081214 1700';
$timestamp = strtotime($start);
$start_time=strtotime($start) - $timenow;
|
Я тут подкорректировал $timestamp на $timenow, а то ошибка была.
if((s-1) > 0)
{
document.getElementById('start_time').innerHTML = 'дней: '+ d+' часов: '+h+' минут: '+ii+i+' секунд: '+ss+s;
setTimeout('startCountdown()',1000);
}
|
И тут поменял 10 на 1000, чтоб нормально шло.
А вообще ОГРОМНОЕ СПАСИБО!!! очень помог. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(09.12.2008 в 07:06)
| | Вот теперь меня интересует: Также ли будет отображаться время и сколько до него осталось в других часовых поясах?
Я имею ввиду сдвиг по Гринвичу или как там это еще называется. | |
|
|
|
|
|
|
|
для: Dmitry_RM
(14.12.2008 в 16:13)
| | будет везде время сервера, тоесть одно и тоже. | |
|
|
|
|
|
|
|
для: sl1p
(14.12.2008 в 16:45)
| | Теперь по этому поводу я спокоен. СПАСИБО!!! | |
|
|
|