Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод списка сотрудников в опреденном порядке, Организовать функцию рейтинга сотруднико 
:(
    Опции темы
KonstRuctor
Дата 1.12.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Написал тут скрипт -- вывод сотрудников компании в определенном порядке.
Дело в том, что  сортировать по фамилии - не катит, так как директор Якушев должен быть выведен раньше, чем сантехник Аваров.
Сортировать по id не катит, так как замдир Щеглов может быть добавлен позднее, но должен быть выведен выше сантехника.
Решил задачу введением понятия рейтинг сотрудника.
Посмотрите, мне кажется, что вышло очень громоздко и неуклюже.
Может, я что-то сделал не так.
Итак, есть таблица с сотрудниками:
Код

CREATE TABLE `staff` (
  `id` tinyint(10) NOT NULL auto_increment,
  `fio` text NOT NULL,
  `about` longtext,
  `rating` tinyint(4) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `rating` (`rating`)
)

Программа вывода перечня сотрудников на экран:
Код

$q1 = $sql->query("SELECT * FROM staff ORDER BY rating");
     echo"<table width=\"700\">
           <tr>
            <th>Рейтинг</th>
            <th>ФИО</th>
            <th>Описание</th>
            <th>Действие</th>
           </tr>\n";
     while( $data = mysql_fetch_array($q1) )
     {
          echo"<tr>
                <td><div align=\"center\">". $data["rating"] ."</div></td>
                <td><b>". $data["fio"] ."</b></td>
                <td>". $data["about"] ."</td>
                <td><a href=\"page_01.php?x=edit&amp;id=". $data["id"] ."\">Edit<a></td>
               </tr>\n";
     }
     echo"</table>\n";

Когда нажимаем кнопку edit, программа выводит простую форму, в которой можно изменить все параметры, в том числе rating.
Ниже формы выводит снова табличку с перечнем, чтобы ориентироваться.
Код

if ( isset ( $_GET["x"] ) &&  $_GET["x"] == "edit" && isset ( $_GET["id"] ) )
     {
         $q2 = $sql->query("SELECT * FROM staff WHERE id = ". intval($_GET["id"]) ."");
         $data = mysql_fetch_array($q2);
         echo "<form action=\"page_01.php\" method=\"post\">
               <table width=\"700\">
               <tr><th colspan=\"2\">Редактирование сотрудника</th></tr>
                <tr>
                 <td><div align=\"right\"><b>Рейтинг</b></div></td>
                 <td><input name=\"newrating\" size=\"3\" type=\"text\" value=\"". $data["rating"] ."\"></td>
                </tr>
                <tr>
                 <td><div align=\"right\"><b>ФИО</b></div></td>
                 <td><input name=\"newfio\" type=\"text\" size=\"60\" value=\"". $data["fio"] ."\"></td>
                </tr>
                <tr>
                 <td><div align=\"right\"><b>Описание</b></div></td>
                 <td>
                  <textarea name=\"newabout\" cols=\"70\" rows=\"8\">". $data["about"] ."</textarea>
                 </td>
                </tr>
                <tr>
                 <td colspan=\"2\">
                  <div align=\"center\"><input type=\"submit\" value=\"Редактировать!\"></div>
                  <input name=\"id\" type=\"hidden\" value=\"". $_GET["id"] ."\">
                  <input name=\"z\" type=\"hidden\" value=\"edit\">
                 </td>
                </tr>
                </table>
                </form>\n";
     }

Если ввести новый рейтинг, идет такая обработка:
Код

if ( isset ( $_POST["z"] ) && $_POST["z"] == "edit" && isset ( $_POST["id"] ) )
          {
               $id        = intval ( $_POST["id"] );
               $newrating = intval ( $_POST["newrating"] );
               $newfio    = htmlspecialchars(strip_tags(trim($_POST["newfio"])));
               $newabout  = htmlspecialchars(strip_tags(trim($_POST["newabout"])));

               //ищем записи с рейтингом, который более или равен новому
               $q = $sql->query("SELECT id FROM staff WHERE rating >= '$newrating' ORDER BY rating DESC");
               $num_rows = mysql_num_rows($q);
               if ( $num_rows > 0 )
               {
                  while ( $data = mysql_fetch_array($q) )
                  {
                          $q2 = $sql->query("UPDATE staff
                                             SET rating = rating + 1
                                             WHERE id = '". $data["id"] ."'
                                             LIMIT 1");
                  }
               }

               // обновляем запись о сутруднике
               $q3 = $sql->query("UPDATE staff
                                  SET
                                     rating = '$newrating',
                                     fio    = '$newfio',
                                     about  = '$newabout'
                                  WHERE
                                     id = '$id'
                                  LIMIT 1");

               if ($q3) exit(header("Location:thankyou.php?e=updated"));
          }

У меня нарушается нумерация рейтингов, точнее нарушается стройность ряда рейтингов.
Другими словами, если сотруднику Иванову присвоить рейтинг 1, то все рейтинги всех сотрудников, кто был ниже него, увеличатся на 1, хотя это не нужно. Программа все равно работает, но теоретически это ошибка -- при изменении рейтинга 10000000 раз у меня все рухнет.
У кого какие мысли? Спасибо.
PM MAIL WWW ICQ   Вверх
capitan
Дата 1.12.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



Я бы сделал по другому. Убрал рейтинг у сотрудников, а добавил таблицу с группами. С полями id_group | name | porydok_otobrageniy. И пользователей раскидывал по группам. Вывод осуществлял с сортировкой по группам и фамилиям внутри группы.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 2.12.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



во-первых, зачем тебе LIMIT 1 в 
Код

$q2 = $sql->query("UPDATE staff
                                SET rating = rating + 1
                                WHERE id = '". $data["id"] ."'
                                LIMIT 1");
 ?
во-вторых, ты выведи $newrating = intval ( $_POST["newrating"] );
там точно не ноль/empty?
PM MAIL   Вверх
Djinn
Дата 2.12.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 18.5.2007

Репутация: 1
Всего: 1



Цитата(capitan @  1.12.2007,  23:37 Найти цитируемый пост)
Я бы сделал по другому. Убрал рейтинг у сотрудников, а добавил таблицу с группами. С полями id_group | name | porydok_otobrageniy. И пользователей раскидывал по группам. Вывод осуществлял с сортировкой по группам и фамилиям внутри группы. 


Полностью согласен, это будет намного лучше !
PM MAIL   Вверх
KonstRuctor
Дата 2.12.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Спасибо!
1) to skyboy: я проверяю $newrating на 0/empty, просто этот кусок кода я опустил, видимо зря.. :-/
2) немного не понял с таблицей про группы. Скорее всего, такая таблица будет иметь смысл в большой компании... хотя я пишу универсальный скрипт. Надо будет подумать. Внутри одной группы может оказаться Якушев, который должен быть выше Абрамова. Как тогда быть?
3) Мой вопрос в основном сводился к тому, что я не смог ряд чисел rating сделать непрерывным. То есть первым всегда должен быть номер 1, за ним 2 и так далее, до N - кол-ва строк.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 2.12.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(KonstRuctor @  2.12.2007,  12:41 Найти цитируемый пост)
Внутри одной группы может оказаться Якушев, который должен быть выше Абрамова. Как тогда быть?

правильно. так ведь сортировать можно не по одному полю, а по нескольким.
таблица "сотрудники":
Код

CREATE TABLE `workers` (
  `idWorker` tinyint(10) NOT NULL auto_increment,
  `fio` text NOT NULL,
  `about` longtext,
  `idGroup` tinyint(4) unsigned NOT NULL default '0',
  PRIMARY KEY  (`idWorker`)
)

таблица "группы":
Код

CREATE TABLE `groups` (
  `idGroup` tinyint(10) NOT NULL auto_increment,
  `name` varchar(64),
  `orderID` tinyint(4),
  PRIMARY KEY  (`idGroup`)
)

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

SELECT `w`.`fio`,`w`.`about`
FROM `workers` `w`
LEFT JOIN `groups` `g`
ON `w`.`idGroup` = `g`.`idGroup`
ORDER BY `g`.`orderID`,`g`.`name`,`w`.`fio`

LEFT JOIN использую, чтоб не упустить людей, для которых почему-то не определена группа.
PM MAIL   Вверх
KonstRuctor
Дата 2.12.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Цитата

Запрос вернет людей с сортировкой по порядку отображения для группы, при одинаковом указанном порядке отсортироует по названию должности, и для одинаковых должностей отсортирует по фамилии.

Большо спасибо за пример, сижу ковыряюсь с ним.
Я забыл указать, что скрипт я придумал для системы управления сайтом.
При добавлении дополнительной таблицы добавится головной боли -- как написать систему управления этим все.
К тому же все равно возникает необходимость как-то сортировать людей внутри самой группы.
Что-то я слегка запутался. Приведу конкретный пример.
------------------------------------------------------
1 Якушев А.А. издатель
2 Иванов И.И. главный редактор
3 Петров П.П. выпускающий редактор
4 Сидоров С.С. литературный редактор
5 Биржаков К.М. арт-директор
6 Голованова Е.Н. верстальщик
7 Раева Н.Б. завхоз
8 Абрамова А.А. уборщица
------------------------------------------------------
В случае с двумя таблицами мне надо рулить "весом" группы должностей, а внутри перечня должностей с одним весом мне все равно придется как-то сортировать людей: издатель Якушев главнее главного редактора Иванова, хотя они относятся к группе "руководители"!
Завтра уборщицу Абрамову повысят до генерального директора и она должна будет иметь рейтинг 2!
------------------
* Все имена (кроме моего) вымышлены и совпадения случяйны smile
PM MAIL WWW ICQ   Вверх
skyboy
Дата 2.12.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(KonstRuctor @  2.12.2007,  18:44 Найти цитируемый пост)
издатель Якушев главнее главного редактора Иванова, хотя они относятся к группе "руководители"!

так зачем сливать в одну группу? сделай отдельно - иерархию по издательству(директор издательства) и отдельно - иерархию редакторов(глав. ред.). и назначь этим группам одинаковые веса. Но так как группы будут разными, то при выводе у тебя выведутся сначала все директора издательств, потом - все главные редакторы, потом уже - все остальные.
впрочем, смотрю, ты все ещё не определился - в каком же порядке выводить.

Цитата(KonstRuctor @  2.12.2007,  18:44 Найти цитируемый пост)
При добавлении дополнительной таблицы добавится головной боли -- как написать систему управления этим все.

т.е. у тебя для работы с разными таблицами используется разным код? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0818 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.