Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: расписание на mysql  (Прочитано 69017 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #30 : 12-10-2003 09:38 » 

Varlenka, быстрее, но это будет заметно только на большом количестве записей - порядка 100тыс-1млн. Я сомневаюсь что столько понадобится - лучше делать как удобнее. Давай рассмотрим оба варианта:
1) time_ ENUM('A','B',...) NOT NULL
Достоинства: с точки зрения вычислений, их меньше: 1 столбец вместо двух и ключ короче на один байт. Кстати, тут enum не нужен - можно было бы просто задать int или tinyint.
Недостатки: неудобство представления для человека, необходимость преобразования этих периодов как для отображения, так и для вычисления.
2) day_ enum('monday','tuesday','wednesday','thursday','friday') NOT NULL,
  hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL
Недостатки: см. достоинства первого варианта.
Достоинства: см. недостатки первого варианта. Плюс, если надо будет ввести новые промежутки времени (напр. работа в сверхурочные/по выходным), то это пройдет легко и безболезнено как для таблицы (без потери и изменения данных: ALTER TABLE shedule CHANGE ...), так и для программы (переделывать логику не надо, только добавить диапазоны в список).
Цитата
RXL, подскажите,
Я еще не стар  Улыбаюсь  Лучше на ты
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #31 : 15-10-2003 12:40 » 

Хорошо, RXL, на ты  Улыбаюсь
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #32 : 15-10-2003 18:02 » 

Отлично
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #33 : 21-10-2003 07:34 » 

RXL, привет!
Вот ты написал, что первый вариант таблицы расписания лучше для отображения. Однако я не могу догадаться каким образом это можно вывести легко  в броузер?

Спасибо
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #34 : 21-10-2003 09:30 » 

Цитата: Varlenka
RXL, привет!
Вот ты написал, что первый вариант таблицы расписания лучше для отображения. Однако я не могу догадаться каким образом это можно вывести легко  в броузер?
Не совсем так - читай внимательнее. Я говорил что первый для отображения нужно преобразовывать в человеческое представление.
Как бы я выбирал между этими вариантами, то для простоты выбрал бы второй (чтобы что получил, то и отображать), а иначе большой разницы нет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #35 : 21-10-2003 09:33 » 

Да, запуталась!

Я же тоже выбрала второй вариант, это действительно удобнее. Но как это вывести в таблицу? :?:  :?:  :?:
Записан
Varlenka
Гость
« Ответ #36 : 21-10-2003 09:35 » 

Цитата
Как бы я выбирал между этими вариантами, то для простоты выбрал бы второй (чтобы что получил, то и отображать), а иначе большой разницы нет.


И как бы ты отображал? Отлично
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #37 : 21-10-2003 11:09 » 

Горорю об этом варианте:
Код:
CREATE TABLE schedule (
  user_id INT(30) UNSIGNED NOT NULL,
  day_ enum('monday','tuesday','wednesday','thursday','friday') NOT NULL,
  hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL,
  notes TEXT,
  UNIQUE (user_id,day_,hour_)
  );
Вот пример:
Код:
<?php
mysql_query
($con,"SELECT * FROM users LEFT JOIN schedule ON id=user_id");
$res=mysql_store_result($con);

print 
"<table>";
while (
$a=mysql_fetch_array($res)) 
 print 
"<tr><td>$a[&#39;name&#39;]<td>$a[&#39;day_&#39;]<td>$a[&#39;hour_&#39;]</tr>";
print 
"</table>";

mysql_free_result($res);
?>

Пример не стоит считать образцом - тут надо ставить немало проверок.
« Последнее редактирование: 20-11-2007 17:55 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #38 : 21-10-2003 11:45 » 

ага, ну если в этом коде все подправить, то будет выводится просто очередная строка из базы?
user_id,Monday,8-10,1
user_id,Monday,10-12,1
итд?

Значит нет никакой возможности вывести по-человечески расписание?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #39 : 21-10-2003 12:09 » 

Цитата: Varlenka
ага, ну если в этом коде все подправить, то будет выводится просто очередная строка из базы?
user_id,Monday,8-10,1
user_id,Monday,10-12,1
итд?
Хм... Почему? Опять же не внимательно читаешь - я не user_id,day_,hour_ в примере показал, а name,day_,hour_ - т.е. подразумевал нормальное имя.
Цитата
Значит нет никакой возможности вывести по-человечески расписание?
Что захочешь,то и будет отображаться как захочешь. Придумай как надо - подскажу как сделать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 21-10-2003 12:18 » 

Цитата

Varlenka

Ты письмо мое получила или как ?
Записан

Да да нет нет все остальное от лукавого.
Varlenka
Гость
« Ответ #41 : 21-10-2003 12:26 » 

PSD, аа, это ты Улыбаюсь Нет, еще не смотрела
Вечером смогу
Записан
Varlenka
Гость
« Ответ #42 : 21-10-2003 14:38 » 

PSD, только я там ничего не поняла :/
Записан
Varlenka
Гость
« Ответ #43 : 21-10-2003 17:15 » 

Что захочешь,то и будет отображаться как захочешь. Придумай как надо - подскажу как сделать.

Надо так:

<table>
<tr><td>time</td><td>Mon</td><td>Tue</td><td>Thu</td> итд</tr>
<tr><td>8-10<td><td>1<td><td>0<td>итд</tr>
...
<tr><td>8-10<td><td>1<td><td>0<td>итд</tr>
</table>
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #44 : 22-10-2003 09:55 » 

Код:
<?php
output_table
($name,$passwd) {
/* на входе $name и $passwd */
 
global $con;
/* $con - глобальный handle подключения к базе */
 
mysql_query($con,"SELECT hour_,day_,notes FROM users LEFT JOIN schedule ON id=user_id WHERE name=&#39;$name&#39; AND passwd_md5=MD5(&#39;$passwd&#39;)");
 if(!(
$res=mysql_store_result($con))) return -1;
 print 
"<table><tr><th>time<th>Mon<th>Tue<th>Wed<th>Thu<th>Fri</tr>";
 
$r=array();
 while (
$a=mysql_fetch_array($res)) $r[$a[0]][$a[1]]=$a[2];
 foreach(array(&
#39;8-10&#39;,&#39;10-12&#39;,&#39;12-14&#39;,&#39;14-16&#39;,&#39;16-18&#39;) as $a) {
  
print"<tr><th>$a";
  foreach(array(&
#39;Mon&#39;,&#39;Tue&#39;,&#39;Wed&#39;,&#39;Thu&#39;,&#39;Fri&#39;) as $b) print "<td>".($r[$a][$b] ? &#39;&nbsp;&#39; : $r[$a][$b]);
  
print "</tr>";
  }
 print 
"</table>";
 
mysql_free_result($res);
 return 
0;
 }
?>

Не тестировал - если не заработает - кричи.
« Последнее редактирование: 20-11-2007 17:57 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #45 : 22-10-2003 10:54 » 

<b>RXL</b>, ты гений!!!

Спасибо тебе большое за помощь! Урррааааааа!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #46 : 22-10-2003 11:59 » 

 Вот такой я вот А что - работает?  Я шокирован!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #47 : 22-10-2003 12:45 » 

Ага, сразу же заработало! Отлично  И все как мне надо. Ухх, сколько я над этим мучилась Улыбаюсь А можно встречный вопрос по горячим следам? Допустим, мне надо значение duty заменить на противоположное (ну, если на него кликнули, например) - то как обращатся к этому значению в запросе?
update shedule set 'duty'=??? where hour_=??? and day_=???

 :oops:
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #48 : 22-10-2003 13:09 » 

Цитата: Varlenka
Допустим, мне надо значение duty заменить на противоположное (ну, если на него кликнули, например) - то как обращатся к этому значению в запросе?
update shedule set 'duty'=??? where hour_=??? and day_=???

Не понял - duty - это новое поле в таблице БД, или что? И что такое "противоположное" значение? Это просто признак есть/нет?
Уточни, пожалуйста
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #49 : 22-10-2003 13:29 » 

Ну duty - это 1(занят) или 0(свободен) - у тебя это notes.
"Противоположное" значение - изменение 1->0 или 0->1
$r[$a][$b] в таблице
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #50 : 22-10-2003 14:04 » 

UPDATE schedule SET duty=NOT duty WHERE user_id=$id AND day_='$day' AND hour_='$hour'

Одно но - $id надо получить заранее - передавать его в составе линков, или хранить в сессия php. По имени/паролю как-то не очень удобно - это нужно только при входе.
Из этих трех вариантов мне кажется предпочтительнее сессии.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #51 : 22-10-2003 14:35 » 

Ага, значит таким образом просто заменится значение на противоположное, только вот откуда я получу эти $day , $hour?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #52 : 22-10-2003 19:03 » 

Цитата: Varlenka
Ага, значит таким образом просто заменится значение на противоположное, только вот откуда я получу эти $day , $hour?
Ну с $day и $hour все просто. Модифицируем немного последнюю программу и посмотрим результат.
Код:
<?php
output_table
($name,$passwd) {
/* на входе $name и $passwd */
 
global $con;
/* $con - глобальный handle подключения к базе */
 
mysql_query($con,"SELECT hour_,day_,duty FROM users LEFT JOIN schedule ON id=user_id WHERE name=&#39;$name&#39; AND passwd_md5=MD5(&#39;$passwd&#39;)");
 if(!(
$res=mysql_store_result($con))) return -1;
 print 
"<table><tr><th>time<th>Mon<th>Tue<th>Wed<th>Thu<th>Fri</tr>";
 
$r=array();
 while (
$a=mysql_fetch_array($res)) $r[$a[0]][$a[1]]=$a[2];
 foreach(array(&
#39;8-10&#39;,&#39;10-12&#39;,&#39;12-14&#39;,&#39;14-16&#39;,&#39;16-18&#39;) as $a) {
  
print"<tr><th>$a";
/* начало изменений */
  
foreach(array(&#39;Mon&#39;,&#39;Tue&#39;,&#39;Wed&#39;,&#39;Thu&#39;,&#39;Fri&#39;) as $b) print "<td><a href=&#39;/our_script.php?action=schedtab_click&day=$b&hour=$a&#39;>".($r[$a][$b] ? &#39;free&#39; : &#39;busy&#39;).&#39;</a>;
/* конец изменений */
  
print "</tr>";
  }
 print 
"</table>";
 
mysql_free_result($res);
 return 
0;
 }
?>
Результат примерно такой:
Код:
<table>
<tr><th>time<th>Mon<th>Tue<th>Wed<th>Thu<th>Fri</tr>
<tr><th>8-10
 <td><a href='/our_script.php?action=schedtab_click&day=Mon&hour=8-10'>free</a>
 <td><a href='/our_script.php?action=schedtab_click&day=Mon&hour=10-12'>free</a>
 <td><a href='/our_script.php?action=schedtab_click&day=Mon&hour=12-14'>free</a>
 <td><a href='/our_script.php?action=schedtab_click&day=Mon&hour=14-16'>free</a>
 <td><a href='/our_script.php?action=schedtab_click&day=Mon&hour=16-18'>free</a>
<\tr>
.............
</table>
Т.е. в ячейках таблицы будут слова "busy" и "free" офоррмленные как линки. При нажатии на них в браузере, на сервере будет вызван скрипт "/our_script.php" и в внутрь программы передвдутся переменные $day и $hour из параметров, а так же переменная $action со значением "schedtab_click".  По этому значению мы понимаем что сделал пользователь, выполняем UPDATE, а затем выдаем страницу с обновленной таблицей.

Ну вот примерно так...

При составлении относительных ссылок типа "/our_script.php?action=schedtab_click&day=Mon&hour=16-18" надо соблюдать правила предписываемые стандартом: не заносить туда запрещенные символы. Если знаешь, что вставляемая строка их не содержит, то можно напрямую вставить (как в этом примере), но лучше предостеречься и обернуть вставляемую переменную ф-ией urlencode();
http://ru3.php.net/manual/ru/function.urlencode.php
« Последнее редактирование: 20-11-2007 17:59 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #53 : 23-10-2003 04:55 » 

Цитата

Т.е. в ячейках таблицы будут слова "busy" и "free" офоррмленные как линки. При нажатии на них в браузере, на сервере будет вызван скрипт "/our_script.php" и в внутрь программы передвдутся переменные $day и $hour из параметров, а так же переменная $action со значением "schedtab_click". По этому значению мы понимаем что сделал пользователь, выполняем UPDATE, а затем выдаем страницу с обновленной таблицей.


RXL, спасибо за разъяснения Улыбаюсь У меня, кстати, 0 и 1 уже оформлены как ссылки, только при обработке я не знала как и где определить day и hour, теперь разберусь:D Пойду еще почитаю про составление подобных ссылок.
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #54 : 23-10-2003 06:49 » new

Н да в приложении к WEB  кластический SQL малоподходит.... Это я  о способе формирования сводной таблицы расписания на неделю.
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #55 : 23-10-2003 07:07 » 

Всему свое место - БД нужна только чтобы хранить и искать, а программой можно все остальное проделать. Все не так уж сложно - главное хорошо спланировать (не всмысле самолет Ага ).
Начинающие частенько хотят чтобы СУБД возвращала чуть ли не готовую страницу. Наблюдал такое  не раз на http://www.mysql.ru/webboard .
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #56 : 23-10-2003 09:07 » 

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

В данном случае    я бы написал запрос который вернулбы мне расписание за неделю в виде recordset который осталось бы только выплюнуть в гриду.
А вы наоборот за каждым параметром  по отдельности в базу лезите.

Причем это очень хорошо вписывается в код страници.
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #57 : 23-10-2003 09:24 » 

Ни чего подобного. Данные запрошены один раз - см. код.
За сессию нужно: один раз, проверив логин/пароль, узнать id пользователя и запомнить его данные в переменных сессии, а потом один запрос на показ таблицы и один запрос на изменение. Куда же меньше? Или тебе не нравится что для выдачи таблицы 5х5 я запросил 25 строк в одном запросе?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #58 : 23-10-2003 11:10 » 

Прошу прощения незнакомая организация языка сбила столку, проглядел что изначально массив создается а потом  в него  тыкаемся.  
А при создании массива мы работаем с набором записей 3 поля хN записей и в цикле перепаковываем его в масив
7 дней х N диапозонов так?
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #59 : 23-10-2003 11:47 » 

Примерно так. Первые два параметра задают координату, третий - значение. Только на 5 дней (по условию задачи в выходные можно не работать) на 5 диапазонов (получилось без обеда).

А синтаксис тут простой - часть от С, часть от perl и немного подругому.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines