RXL
|
|
« Ответ #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
|
|
« Ответ #32 : 15-10-2003 18:02 » |
|
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #33 : 21-10-2003 07:34 » |
|
RXL, привет! Вот ты написал, что первый вариант таблицы расписания лучше для отображения. Однако я не могу догадаться каким образом это можно вывести легко в броузер?
Спасибо
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #34 : 21-10-2003 09:30 » |
|
RXL, привет! Вот ты написал, что первый вариант таблицы расписания лучше для отображения. Однако я не могу догадаться каким образом это можно вывести легко в броузер? Не совсем так - читай внимательнее. Я говорил что первый для отображения нужно преобразовывать в человеческое представление. Как бы я выбирал между этими вариантами, то для простоты выбрал бы второй (чтобы что получил, то и отображать), а иначе большой разницы нет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #35 : 21-10-2003 09:33 » |
|
Да, запуталась!
Я же тоже выбрала второй вариант, это действительно удобнее. Но как это вывести в таблицу? :?: :?: :?:
|
|
|
Записан
|
|
|
|
Varlenka
Гость
|
|
« Ответ #36 : 21-10-2003 09:35 » |
|
Как бы я выбирал между этими вариантами, то для простоты выбрал бы второй (чтобы что получил, то и отображать), а иначе большой разницы нет. И как бы ты отображал?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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['name']<td>$a['day_']<td>$a['hour_']</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
|
|
« Ответ #39 : 21-10-2003 12:09 » |
|
ага, ну если в этом коде все подправить, то будет выводится просто очередная строка из базы? user_id,Monday,8-10,1 user_id,Monday,10-12,1 итд? Хм... Почему? Опять же не внимательно читаешь - я не user_id,day_,hour_ в примере показал, а name,day_,hour_ - т.е. подразумевал нормальное имя. Значит нет никакой возможности вывести по-человечески расписание? Что захочешь,то и будет отображаться как захочешь. Придумай как надо - подскажу как сделать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
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
|
|
« Ответ #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='$name' AND passwd_md5=MD5('$passwd')"); 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('8-10','10-12','12-14','14-16','16-18') as $a) { print"<tr><th>$a"; foreach(array('Mon','Tue','Wed','Thu','Fri') as $b) print "<td>".($r[$a][$b] ? ' ' : $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
|
|
« Ответ #46 : 22-10-2003 11:59 » |
|
А что - работает?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #47 : 22-10-2003 12:45 » |
|
Ага, сразу же заработало! И все как мне надо. Ухх, сколько я над этим мучилась А можно встречный вопрос по горячим следам? Допустим, мне надо значение duty заменить на противоположное (ну, если на него кликнули, например) - то как обращатся к этому значению в запросе? update shedule set 'duty'=??? where hour_=??? and day_=??? :oops:
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #48 : 22-10-2003 13:09 » |
|
Допустим, мне надо значение 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
|
|
« Ответ #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
|
|
« Ответ #52 : 22-10-2003 19:03 » |
|
Ага, значит таким образом просто заменится значение на противоположное, только вот откуда я получу эти $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='$name' AND passwd_md5=MD5('$passwd')"); 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('8-10','10-12','12-14','14-16','16-18') as $a) { print"<tr><th>$a"; /* начало изменений */ foreach(array('Mon','Tue','Wed','Thu','Fri') as $b) print "<td><a href='/our_script.php?action=schedtab_click&day=$b&hour=$a'>".($r[$a][$b] ? 'free' : 'busy').'</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
Главный специалист
Offline
Пол:
|
|
« Ответ #54 : 23-10-2003 06:49 » |
|
Н да в приложении к WEB кластический SQL малоподходит.... Это я о способе формирования сводной таблицы расписания на неделю.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
|
|
« Ответ #55 : 23-10-2003 07:07 » |
|
Всему свое место - БД нужна только чтобы хранить и искать, а программой можно все остальное проделать. Все не так уж сложно - главное хорошо спланировать (не всмысле самолет ). Начинающие частенько хотят чтобы СУБД возвращала чуть ли не готовую страницу. Наблюдал такое не раз на http://www.mysql.ru/webboard .
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #56 : 23-10-2003 09:07 » |
|
Нет клиент сервере со своим клиентом народ наоборот старается свести число обращений к серверу базы к минимуму, те получить с базы результат максимально приблеженный к необходимому для отображения.
В данном случае я бы написал запрос который вернулбы мне расписание за неделю в виде recordset который осталось бы только выплюнуть в гриду. А вы наоборот за каждым параметром по отдельности в базу лезите.
Причем это очень хорошо вписывается в код страници.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
|
|
« Ответ #57 : 23-10-2003 09:24 » |
|
Ни чего подобного. Данные запрошены один раз - см. код. За сессию нужно: один раз, проверив логин/пароль, узнать id пользователя и запомнить его данные в переменных сессии, а потом один запрос на показ таблицы и один запрос на изменение. Куда же меньше? Или тебе не нравится что для выдачи таблицы 5х5 я запросил 25 строк в одном запросе?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #58 : 23-10-2003 11:10 » |
|
Прошу прощения незнакомая организация языка сбила столку, проглядел что изначально массив создается а потом в него тыкаемся. А при создании массива мы работаем с набором записей 3 поля хN записей и в цикле перепаковываем его в масив 7 дней х N диапозонов так?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
|
|
« Ответ #59 : 23-10-2003 11:47 » |
|
Примерно так. Первые два параметра задают координату, третий - значение. Только на 5 дней (по условию задачи в выходные можно не работать) на 5 диапазонов (получилось без обеда).
А синтаксис тут простой - часть от С, часть от perl и немного подругому.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|