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

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

здравствуйте, подскажите как можно построить таблицу в mysql о занятости пользователей на неделю

отрезков времени 5 (8-10, 10-12, ...) с понедельника по пятницу
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #1 : 10-10-2003 10:48 » 

Ну например :
user_id, otrezok_id, day_id, otrezok
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

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

WWW
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #4 : 10-10-2003 10:56 » 

Цитата: Varlenka
в смысле day_id?


айди дня недели, понедельник(1)-пятница(5)
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Varlenka
Гость
« Ответ #5 : 10-10-2003 11:06 » 

Цитата: RXL
Предлогаю два варианта: можно хранить информацию о каждом отрезке в отдельной записи (на случай если отрезков со временем станет не 5), а можно о всех пяти в одной. Т.к. задача не практическая, а лабораторка, то лучше второй вариант - в одной строке.


как раз не лабораторка. хранить информацию нужно только на неделю, причем рабочую. с понедельника по пятницу с 8 до 18

потом нужно по этой таблице искать время, когда больше всего пользователей свободно


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

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

WWW
« Ответ #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
Технический
Администратор

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

WWW
« Ответ #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
Технический
Администратор

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

WWW
« Ответ #10 : 10-10-2003 11:39 » 

Цитата: Varlenka
:?: Почему 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 » 

Цитата: RXL

access denied for user: '@localhost' to database
нет прав на CREATE TABLE...

Ты как root входишь, или как другой пользователь? СУБД твоя, или есть админ?


Вроде должна как админ. Я же установила mysql себе на комп. Где нужно изменить настройки - в my.cnf Не понял
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #13 : 10-10-2003 12:16 » 

Цитата: Varlenka
Спасибо, вроде понятно. Скорее буду хранить для каждого периода некую занятость.
Код:
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
Технический
Администратор

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

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

Какая ошибка? Приведи текст.

А как ты подключаешься к базе? Какой программой?
В какой операционке работаешь?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #16 : 10-10-2003 12:44 » 

Цитата: Varlenka
:?: Почему 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
Технический
Администратор

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

WWW
« Ответ #17 : 10-10-2003 12:48 » 

MOPO3, есть еще анонимный вход. Строка "@localhost" говорит о попытке именно такого входа.
Записан

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

Цитата: RXL
Какая ошибка? Приведи текст.

А как ты подключаешься к базе? Какой программой?
В какой операционке работаешь?


Я работаю в 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
Технический
Администратор

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

WWW
« Ответ #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
Технический
Администратор

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

WWW
« Ответ #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
Технический
Администратор

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

WWW
« Ответ #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
Технический
Администратор

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

WWW
« Ответ #27 : 10-10-2003 18:36 » 

Разберу по частям и объясню ошибки...

Цитата: Varlenka
Все сделала таким образом:
Код:
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
Технический
Администратор

ru
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
Технический
Администратор

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

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

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

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

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

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

ru
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
Технический
Администратор

ru
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
Технический
Администратор

ru
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
Технический
Администратор

ru
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
Технический
Администратор

ru
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
Технический
Администратор

ru
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
Технический
Администратор

ru
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
Технический
Администратор

ru
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 » 

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

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

ru
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
Технический
Администратор

ru
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
Технический
Администратор

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

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

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

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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines