Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Онлайн викторина - сложно, но можно
 
 автор: Dmitry_RM   (09.12.2008 в 07:06)   письмо автору
 
 

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:20)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Надеюсь теперь более понятно что я имел ввиду!

  Ответить  
 
 автор: Trianon   (09.12.2008 в 10:02)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Тема сисек цена вопроса не раскрыта.

  Ответить  
 
 автор: DEM(универ)   (09.12.2008 в 10:41)
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Средньненькое ТЗ скажу я вам... Видите ли этот форум создан и особено раздел создан для ВОПРОСОВ по РНР а не просьба НАПИШИТЕ МНЕ ТО-ТО :)

  Ответить  
 
 автор: HaJIuBauKa   (09.12.2008 в 11:19)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Ну да :)
Просто так Вам писать этот скрипт никто не будет, это во-первых.
Ну и форум этот не для этого

Если есть какие-то наработки, и непонятки в чем-то, пишите будем разбиратся

  Ответить  
 
 автор: sl1p   (09.12.2008 в 13:44)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Тут просто только вариант накупить книжек о пхп,яваскрипт[,аякс]
Сесть и позубрить.

  Ответить  
 
 автор: Николай2357   (09.12.2008 в 15:55)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Ну чего вы все напали то... Он сам напишет, надо помочь просто. Это я попросил алгоритм расписать.
Вот теперь следующий вопрос. База данных есть? Если есть, то структуру. А если ругаться будут - ко мне в аську.

  Ответить  
 
 автор: Dmitry_RM   (09.12.2008 в 17:16)   письмо автору
 
   для: Николай2357   (09.12.2008 в 15:55)
 

Ты какую именно базу данных имеешь ввиду?
И спасибо за помощь эту и будущую.

  Ответить  
 
 автор: Николай2357   (09.12.2008 в 17:35)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 17:16)
 

Для того, что бы сделать синхронное управление, нужно на сервере оставлять информацию, к которой браузеры участников будут обращаться. Им нужно задать режим. Это тот "таймер", о котором ты так много посал. Вопросы для викторины откуда берутся?

  Ответить  
 
 автор: Dmitry_RM   (10.12.2008 в 17:54)   письмо автору
 
   для: Николай2357   (09.12.2008 в 17:35)
 

Вопросы будут регулярно обновляться вручную мной в базе данных через админку. Поля: id, date, time, vopros1, vopros2, ..., vopros10 (думаю так).

  Ответить  
 
 автор: Николай2357   (11.12.2008 в 18:46)   письмо автору
 
   для: Dmitry_RM   (10.12.2008 в 17:54)
 

Вот в эту таблицу надо добавить еще одно поле, куда писать временную метку. И на её основе уже строить логику. Уже подсказали, что нужно расчитать время между этой меткой и текущим временем. это и будет время до старта. Его и нужно задать браузеру на рефреш.

  Ответить  
 
 автор: Trianon   (11.12.2008 в 19:07)   письмо автору
 
   для: Николай2357   (11.12.2008 в 18:46)
 

Там как минимум нужно будет добавить еще одну таблицу, вместо этого безобразия с vopros1...vopros10

Не в коня корм.

  Ответить  
 
 автор: Dmitry_RM   (11.12.2008 в 06:51)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Я с удовольствием выслушаю предложение любого по этому поводу. Может у кого мысли какие есть?

  Ответить  
 
 автор: Dmitry_RM   (11.12.2008 в 16:35)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Может кто-нибудь что-нибудь подскажет.

  Ответить  
 
 автор: Trianon   (11.12.2008 в 16:48)   письмо автору
 
   для: Dmitry_RM   (11.12.2008 в 16:35)
 

$delay = ... ;// тут нужно рассчитать, сколько секунд осталось до очередного вопроса.
Header("Refresh: $delay; url=test.php");

  Ответить  
 
 автор: Dmitry_RM   (12.12.2008 в 19:03)   письмо автору
 
   для: Trianon   (11.12.2008 в 16:48)
 

>$delay = ... ;// тут нужно рассчитать, сколько секунд осталось до очередного вопроса.
Как можно это сделать, что-то у меня не получается.

  Ответить  
 
 автор: Trianon   (12.12.2008 в 19:31)   письмо автору
 
   для: Dmitry_RM   (12.12.2008 в 19:03)
 

что-то я не вижу как у вас не получается.
вижу, что в тырите куски кода откуда ни попадя, и пытаетесь их присобачивать, объединять, изменять...
Загляните в справочник функций, отберите пару штук нужных,
напишите пару строк сами - это не так сложно.

  Ответить  
 
 автор: Dmitry_RM   (12.12.2008 в 20:13)   письмо автору
 
   для: Trianon   (12.12.2008 в 19:31)
 

Самому писать с самого начала для меня пока сложно.

  Ответить  
 
 автор: Trianon   (12.12.2008 в 20:28)   письмо автору
 
   для: Dmitry_RM   (12.12.2008 в 20:13)
 

хорошо, я подскажу. Потребуются функции time() и strtotime()

  Ответить  
 
 автор: Dmitry_RM   (12.12.2008 в 20:40)   письмо автору
 
   для: Trianon   (12.12.2008 в 20:28)
 

time - Возвращает текущую метку времени
strtotime - Преобразует текстовое представление даты на английском языке в метку времени Unix

Ну хоть пример какой-нибудь напишите. То что у меня получается даже показывать не хочется.

  Ответить  
 
 автор: Trianon   (12.12.2008 в 21:46)   письмо автору
 
   для: Dmitry_RM   (12.12.2008 в 20:40)
 

вот если из одного вычесть другое - будет как раз интервал в секундах.


важнее то, что strtotime может преобразовать представление не только на английском языке, но и представление, в котором выдает дату-время сервер MySQL .

  Ответить  
 
 автор: Dmitry_RM   (13.12.2008 в 08:08)   письмо автору
 
   для: Trianon   (12.12.2008 в 21:46)
 

См. ниже.

  Ответить  
 
 автор: Valick   (11.12.2008 в 16:50)   письмо автору
 
   для: Dmitry_RM   (11.12.2008 в 16:35)
 

Тут уже много чего наподсказывали, и если никаких выводов вы не сделали угадайте чьи это проблемы? Вам надо учить мат часть. Без базовых (хотя бы) знаний вы не только ничего сделать не сможете, но даже не сможете (именно это и происходит сейчас) понять что вам говорят. И не факт что выучив "на зубок" все операторы языка, у вас "попрёт"... ведь главное это логика.

  Ответить  
 
 автор: Dmitry_RM   (11.12.2008 в 20:48)   письмо автору
 
   для: Valick   (11.12.2008 в 16:50)
 

У меня уже получается, скоро выложу что получилось. Подкорректируете? (если что)

  Ответить  
 
 автор: Valick   (11.12.2008 в 20:50)   письмо автору
 
   для: Dmitry_RM   (11.12.2008 в 20:48)
 

Базара нема.... уже и руки чешутся чёнть подкорректирровать)))

  Ответить  
 
 автор: Dmitry_RM   (12.12.2008 в 07:34)   письмо автору
 
   для: 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'>
&nbsp;Пароль <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"; 

Может как-нибудь можно это объединить?

  Ответить  
 
 автор: Николай2357   (12.12.2008 в 09:25)   письмо автору
 
   для: Dmitry_RM   (12.12.2008 в 07:34)
 

>и есть еще такое:
Ну это совсем штука лишняя. почитайте здесь.
А для таймера нужно записать в таблицу время старта, допустим в такои формате
<?
$start_time 
date("U");

и от него уже плясать. В JS нужно передать значение из таблицы, сравненное с текущим временем в этом же формате. Тогда при перезагрузке или других поползновениях юзера обратный отсчёт не остановится.

  Ответить  
 
 автор: Dmitry_RM   (12.12.2008 в 14:38)   письмо автору
 
   для: Николай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 с текущим временем. Логически я понял, но написать не получается.

  Ответить  
 
 автор: Trianon   (12.12.2008 в 15:57)   письмо автору
 
   для: Dmitry_RM   (12.12.2008 в 14:38)
 

не трогайте время на клиенте вообще.
Берите интервал времени с сервера.
Его и считайте.

  Ответить  
 
 автор: Николай2357   (12.12.2008 в 16:33)   письмо автору
 
   для: Dmitry_RM   (12.12.2008 в 14:38)
 

А зачем Вам текущее время? У всех часы есть. Вам стоит показывать обратный отсчёт. Допустим до старта викторины осталось:.....
Вы же где то уже находили скрипт обратного отсчёта. А все расчеты надо делать на сервере, как Вам подсказывают. Потом, при формировании странички в начальное время для запуска обратного таймера выдать результат расчетов. И обновить страницу по истечении времени. Давайте ссылку на таймер, я примерно покажу.

  Ответить  
 
 автор: Dmitry_RM   (12.12.2008 в 18:58)   письмо автору
 
   для: Николай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. Как сравнивать время на сервере с временем на клиенте?

  Ответить  
 
 автор: Николай2357   (12.12.2008 в 16:34)   письмо автору
 
   для: Dmitry_RM   (12.12.2008 в 14:38)
 

-

  Ответить  
 
 автор: Dmitry_RM   (13.12.2008 в 08:11)   письмо автору
 
   для: 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"; 

?>

Работает вроде правильно: считает и показывает сколько осталось до начала.
Только надо рабобраться с рефрешем.
Что скажете?

  Ответить  
 
 автор: Николай2357   (13.12.2008 в 11:04)   письмо автору
 
   для: 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   (14.12.2008 в 00:56)   письмо автору
 
   для: Николай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>

  Ответить  
 
 автор: Dmitry_RM   (14.12.2008 в 16:09)   письмо автору
 
   для: Николай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   (14.12.2008 в 16:13)   письмо автору
 
   для: Dmitry_RM   (09.12.2008 в 07:06)
 

Вот теперь меня интересует: Также ли будет отображаться время и сколько до него осталось в других часовых поясах?
Я имею ввиду сдвиг по Гринвичу или как там это еще называется.

  Ответить  
 
 автор: sl1p   (14.12.2008 в 16:45)   письмо автору
 
   для: Dmitry_RM   (14.12.2008 в 16:13)
 

будет везде время сервера, тоесть одно и тоже.

  Ответить  
 
 автор: Dmitry_RM   (14.12.2008 в 16:55)   письмо автору
 
   для: sl1p   (14.12.2008 в 16:45)
 

Теперь по этому поводу я спокоен. СПАСИБО!!!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования