Varlenka
Гость
|
|
« : 10-10-2003 10:37 » |
|
здравствуйте, подскажите как можно построить таблицу в mysql о занятости пользователей на неделю
отрезков времени 5 (8-10, 10-12, ...) с понедельника по пятницу
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #1 : 10-10-2003 10:48 » |
|
Ну например : user_id, otrezok_id, day_id, otrezok
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
RXL
|
|
« Ответ #2 : 10-10-2003 10:51 » |
|
Предлогаю два варианта: можно хранить информацию о каждом отрезке в отдельной записи (на случай если отрезков со временем станет не 5), а можно о всех пяти в одной. Т.к. задача не практическая, а лабораторка, то лучше второй вариант - в одной строке. Есть вопросы: 1) хранится будет информация только по одной неделе, или нет? 2) если одна неделя, то неделя календарная, или от сегодня + 6(7?) дней?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #3 : 10-10-2003 10:52 » |
|
в смысле day_id?
пример таблицы
user_1 poned 8-10 user_1 poned 12-14 user_2 pjatn 12-14
что-то вроде того?
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #4 : 10-10-2003 10:56 » |
|
в смысле day_id? айди дня недели, понедельник(1)-пятница(5)
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Varlenka
Гость
|
|
« Ответ #5 : 10-10-2003 11:06 » |
|
Предлогаю два варианта: можно хранить информацию о каждом отрезке в отдельной записи (на случай если отрезков со временем станет не 5), а можно о всех пяти в одной. Т.к. задача не практическая, а лабораторка, то лучше второй вариант - в одной строке. как раз не лабораторка. хранить информацию нужно только на неделю, причем рабочую. с понедельника по пятницу с 8 до 18 потом нужно по этой таблице искать время, когда больше всего пользователей свободно varlenka
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #6 : 10-10-2003 11:08 » |
|
Varlenka, ну а прочие вопросы? На одну неделю хранить или больше?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #7 : 10-10-2003 11:28 » |
|
1) хранится будет информация только по одной неделе, или нет? 2) если одна неделя, то неделя календарная, или от сегодня + 6(7?) дней?
Храниться информация о занятости должна только неделю, в начала каждой недели пользователь заполняет ее. Причем неделя от понедельника до пятницы.
|
|
|
Записан
|
|
|
|
Varlenka
Гость
|
|
« Ответ #8 : 10-10-2003 11:30 » |
|
:?: Почему mysql выдает следующую ошибку при попытке создать базу:
access denied for user: '@localhost' to database
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #9 : 10-10-2003 11:37 » |
|
Предпочитаю все "лишние" данные задавать отдельной таблицей. CREATE TABLE users ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, /* ^^^ 65535 юзеров, imho, хватит. Можно MEDIUMINT (~16M), или INT (~4Г) */ f VARCHAR(32) NOT NULL, i VARCHAR(32) NOT NULL, o VARCHAR(32) NOT NULL /* ^^^ ФИО */ );
Если нужно знать просто план занятости: CREATE TABLE business ( user_id SMALLINT UNSIGNED NOT NULL, day_ enum('пн','вт','ср','чт','пт') NOT NULL, hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL, UNIQUE (user_id,day_,hour_) );
Для каждого пользователя может быть 0..25 записей о каждом периоде. Или, немного изменив, можно хранить чем он занят в указаный период: CREATE TABLE business ( user_id SMALLINT UNSIGNED NOT NULL, day_ enum('пн','вт','ср','чт','пт') NOT NULL, hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL, task ... /* текстовое описание, ссылка на таблицу работ и т.п. */, UNIQUE (user_id,day_,hour_) );
Тут уже можно хранить как переменное число записей на каждого пользователя (как в предидущем варианте), так и все 25, а "пустые" часы соотв. помечать.
|
|
« Последнее редактирование: 20-11-2007 17:43 от Алексей1153++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #10 : 10-10-2003 11:39 » |
|
:?: Почему mysql выдает следующую ошибку при попытке создать базу:
access denied for user: '@localhost' to database Нет прав на CREATE TABLE... Ты как root входишь, или как другой пользователь? СУБД твоя, или есть админ?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #11 : 10-10-2003 11:44 » |
|
Спасибо, вроде понятно. Скорее буду хранить для каждого периода некую занятость. UNIQUE (user_id,day_,hour_)
что это означает?
|
|
« Последнее редактирование: 20-11-2007 17:44 от Алексей1153++ »
|
Записан
|
|
|
|
Varlenka
Гость
|
|
« Ответ #12 : 10-10-2003 11:46 » |
|
access denied for user: '@localhost' to database нет прав на CREATE TABLE...
Ты как root входишь, или как другой пользователь? СУБД твоя, или есть админ?
Вроде должна как админ. Я же установила mysql себе на комп. Где нужно изменить настройки - в my.cnf
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #13 : 10-10-2003 12:16 » |
|
Спасибо, вроде понятно. Скорее буду хранить для каждого периода некую занятость. UNIQUE (user_id,day_,hour_)
что это означает? "Создать уникальный ключ из столбцов user_id, day_ и hour_". Это как поможет в поиске данных по юзеру (если строк будет много), так и автоматически проверяет чтобы небыло одинаковых строк, в которых совпадают одновременно все три указанных поля. Вроде должна как админ. Я же установила mysql себе на комп. Где нужно изменить настройки - в my.cnf Нет. my.cfn - это настройка внутренних особенностей сервера. Они обычно пользователя не интересуют. Существуют права доступа к серверу, базе, таблице и даже к конкретному столбцу, разрещения на определенные действия (создание базы, таблицы, select, insert, update и т.п.). Все это хранится в специальной ДБ с именем mysql. При изменении БД mysql стоит знать, что информация оттуда читается сервером однажды (при первом запросе), а далее хранится в памяти. Чтобы, изменив базу, заставить сервер перечитать таблицы запускаем команду FLUSH PRIVILEGES. Ну это все "лирика" Тут много что можно рассказать. Рекомендую на досуге почитать мануал. Проблема отказа, быстрее всего, кроется в том, под каким пользователем ты входишь. Т.е., принудительно его указывать. Напр. "mysql -u root".
|
|
« Последнее редактирование: 20-11-2007 17:45 от Алексей1153++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #14 : 10-10-2003 12:31 » |
|
как-то все-же надо изменить привилегии. на команду mysql -u root выдается ошибка:(((
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #15 : 10-10-2003 12:38 » |
|
Какая ошибка? Приведи текст.
А как ты подключаешься к базе? Какой программой? В какой операционке работаешь?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #16 : 10-10-2003 12:44 » |
|
:?: Почему mysql выдает следующую ошибку при попытке создать базу:
access denied for user: '@localhost' to database access denied for user: a user to kakoi ?'@localhost' При инсталяции создаётся по дефолту юзер root со всеми правами. Попробуй из скрипта законектиться так : $link = mysql_connect("localhost", "root", "") or die ("Can't connect to server!"); if(!mysql_select_db("mysql", $link)) { print "Can't connect to the database<br />".mysql_error(); } else { print "Connected ..."; }
|
|
« Последнее редактирование: 20-11-2007 17:46 от Алексей1153++ »
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
RXL
|
|
« Ответ #17 : 10-10-2003 12:48 » |
|
MOPO3, есть еще анонимный вход. Строка "@localhost" говорит о попытке именно такого входа.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #18 : 10-10-2003 12:48 » |
|
Какая ошибка? Приведи текст.
А как ты подключаешься к базе? Какой программой? В какой операционке работаешь? Я работаю в XP, подключаюсь к SQL-серверу через mysqld.exe, потом mysql.exe Ошибка такая: error 1044: Access denied for user: '@localhost' to database a; Varlenka
|
|
|
Записан
|
|
|
|
Varlenka
Гость
|
|
« Ответ #19 : 10-10-2003 12:57 » |
|
If you try to connect as root and get this error: Access denied for user: '@unknown' to database mysql this means that you don't have an entry in the user table with a User column value of 'root' and that mysqld cannot resolve the hostname for your client. In this case, you must restart the server with the --skip-grant-tables option and edit your `/etc/hosts' or `\windows\hosts' file to add an entry for your host.
подскажите, что это значит и где что нужно исправить?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #20 : 10-10-2003 13:02 » |
|
mysqld.exe - это сервер, mysql.exe - консольный клиент.
Вот как раз при запуске клиента нужно указать параметры подключения. Список параметров можно получить так: mysql.exe --help
Вообще-то строки mysql.exe -u root должно хватить.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #21 : 10-10-2003 13:04 » |
|
MOPO3,
результат Connected ...
а что дальше?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #22 : 10-10-2003 13:05 » |
|
Кстати, вспомнил - my.cfn тут все же причем. В нем в блоке начинающемся со строки [mysql] задаются параметры по умолчанию. Но все они перекрываются параметрами командной строки.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #23 : 10-10-2003 13:09 » |
|
Вот как раз при запуске клиента нужно указать параметры подключения. Список параметров можно получить так: mysql.exe --help
Вообще-то строки mysql.exe -u root должно хватить.Вообще я нашла свою ошибку - не надо было в конце строки ставить ";" На данный момент я зашла как mysql.exe -u root и просматриваю таблицу привилегий что-нибудь надо здесь сразу поменять или уже все ок?
|
|
|
Записан
|
|
|
|
Varlenka
Гость
|
|
« Ответ #24 : 10-10-2003 13:13 » |
|
Спасибо за помощь!!!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #25 : 10-10-2003 13:18 » |
|
Пока хватит root-а , а в будушем, если на сервер будет обращение с других компьютеров, то лучше будет создать другую, более ограниченную учетную запись.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #26 : 10-10-2003 14:34 » |
|
Все сделала таким образом: CREATE TABLE users ( id INT(30) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), //LOGIN passwd_md5 VARCHAR, );
CREATE TABLE shedule ( 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_) );
Но при вставке нового значение в shedule список начинается с 0. Почему так?
|
|
« Последнее редактирование: 20-11-2007 17:47 от Алексей1153++ »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #27 : 10-10-2003 18:36 » |
|
Разберу по частям и объясню ошибки... Все сделала таким образом: CREATE TABLE users ( id INT(30) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, INT(30) - тип INT имеет размер 32 бита и указывать после него в скобках больше чем 10 смысла нет name VARCHAR(30), //LOGIN passwd_md5 VARCHAR, тип VARCHAR требует указания максимального размера (0..255). Запятая поле - ошибка (возможно просто ошибка копирования в браузер ) );
CREATE TABLE shedule ( 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_) );
Но при вставке нового значение в shedule список начинается с 0. Почему так? Все правильно. Что вставляешь - то и получаешь. Т.е., я понимаю, ты вставляешь 0. Следует дклать так: 1) при создании нового пользователя в users: INSERT INTO users VALUES (0,"имя","пароль"); Т.е., вместо id я подставил 0. Но столбец имеет признаки AUTO_INCREMENT и PRIMARY KEY. Когда в такой столбец встабляешь 0, то реально вставляется полследнее запомненое максимальное знатение плюс один. Вставляя 0 мы можем получить новое уникальное значение. Далее надо узнать это последнее вставленное знасение (замечу: последнее значение вставленное в процессе одного и того же соеинения!) В консоли mysql.exe это можно узнать через команду "SELECT LAST_INSERT_ID()". В php это будет "$id=mysql_insert_id($connection)". "$connection" - это то же самое что и "$link" в примере МОРОЗ-а. После надо вставить строки, описывающие график работы этого пользователя в shedule. Пример: INSERT INTO shedule VALUES (LAST_INSERT_ID(),'monday','8-10','иммитация бурной деятельности'); В итоге - создаем нового пользователя "без забот": $name="карлсон"; $pass="день варения"; $con=mysql_connect("localhost","root"); mysql_select_db("твоя_база",$con); if(!mysql_query($con,"INSERT users VALUES (0,'$name','$pass')")) { # такой пользователь уже существует print("ERROR: #".mysql_errno($con)." (".mysql_error($con).")\n"); exit(1); } $weeks=('monday','tuesday','wednesday','thursday','friday'); $hoors=('8-10','10-12','12-14','14-16','16-18'); $id=mysql_insert_id($con); for($i=0;i<5;i++) { for($j=0;i<5;i++) mysql_query("INSERT shedule VALUES ($id,'$weeks[$i]','$hoors[$j]','свободен до понедельника')"); } mysql_close($con);
Далее можно через UPDATE изменять значение notes в каждой строчке по условию WHERE day_='$day' AND hour_='$hour' .
|
|
« Последнее редактирование: 20-11-2007 17:52 от Алексей1153++ »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Varlenka
Гость
|
|
« Ответ #28 : 12-10-2003 06:13 » |
|
спасибо
|
|
|
Записан
|
|
|
|
Varlenka
Гость
|
|
« Ответ #29 : 12-10-2003 06:24 » |
|
CREATE TABLE shedule ( 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_) );
RXL, подскажите, пожалуйста, будет ли поиск проходить быстрее, если базу составить так: CREATE TABLE shedule ( user_id INT UNSIGNED NOT NULL, time_ enum('A','B','C','D','E',.....) NOT NULL, //и так все 25 промежутка notes TEXT, UNIQUE (user_id,time_) );
|
|
« Последнее редактирование: 20-11-2007 17:53 от Алексей1153++ »
|
Записан
|
|
|
|
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 и немного подругому.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|