Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сортировщик таблицы в базе данных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите напейсать пожалуйста, я тоже себе буду помогать при этом
Haron
Отправлено: 05 Июня, 2010 - 16:56:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




В общем дело такое:
Имеется табло в БД, следующей структуры:

CODE (htmlphp):
скопировать код в буфер обмена
  1. CREATE TABLE `catalog` (
  2.   `id` int(11) NOT NULL default '0',
  3.   `name` text NOT NULL,
  4.   `desc` text NOT NULL,
  5.   PRIMARY KEY  (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
  7.  
  8. --
  9. -- Дамп данных таблицы `catalog`
  10. --
  11.  
  12. INSERT INTO `catalog` VALUES (1, 'Юзер Коля', 'Нуп, каких мало. Неадекват');
  13. INSERT INTO `catalog` VALUES (2, 'Эникейщик Вася', 'Хороший специалист');
  14. INSERT INTO `catalog` VALUES (3, 'Одмин Петя', 'Одмин - такой одмин...');


Стоит такая задача:

Напейсать набор функций на PHP, которые бы
1). Раздавали полям `id` - собственно id-ы по порядку.
2). Перенумеровывали бы id-ы (Например в случае удаления второй строки из табла, у нас останутся строки с id-ами 1 и 3. А функция должна их перенумеровать, рассчитав на 1 ... 2, т.е. снова по порядку)

Кто что может посоветовать, и\или напейсать? Нужны свежие идеи Улыбка


-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 05 Июня, 2010 - 17:01:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




1) auto_increment
2) зачем?


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 05 Июня, 2010 - 17:05:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Мелкий пишет:
1) auto_increment
2) зачем?


Автоинкремент криво всё делает, и уже пробовался. Если из трёх строк например удаляется средняя - он не будет перенумеровывать по порядку, а если потом создать в табле новую запись - он ей присвоит ид = 4... Результат: Строки будут идти с ид-ами 1, 3, 4.... А надо чтобы оно перерассчиталось, и стало 1, 2, 3 - как и надо.


-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 05 Июня, 2010 - 17:14:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




см. п.2


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 05 Июня, 2010 - 17:24:38
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Мелкий пишет:
см. п.2


Пишу редактор каталога. По этому таблу генерится HTML-таблица, с опциями правки и удоления. В случае удоления не с конца, а например, записи с середины откуда-нибудь, все ид-ы сбиваются к к чертям (например - переколбасило всю сгенереную таблицу), что доставляет некоторые неудобства. Есть два варианта, либо я изначально писал неправильно и надо всё напейсать по-другому (что уже не вариант, так как в коде уже слишком "многа букафф", и времени нет, заказчики напирают...), либо впереть костыль под названием "ренумератор таблицы"...

В ПХП и мускуле я недавно, до этого имел дело только с MaxScript и Maya питон (MEL)... Трёхмерщик я, но увы, кризис, и надо искать новые возможности...

(Отредактировано автором: 05 Июня, 2010 - 17:29:31)



-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 05 Июня, 2010 - 18:55:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




id должен однозначно указывать на строку, на то он и идентификационный номер. А если всё пересчитывать - то легко попасть в аномалии реляционной базы данных, например:
поток 1 изменяет данные строки №3.
поток 2 удалил строку №2, выполняется пересчёт id
поток 1 сохраняет данные в строку №3 и... заменяет данные бывшей строки №4.
Вот это как раз и есть "все id сбиваются к чертям".

Можно, конечно, и пересчитывать id. Будет что-то типа такого:
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `table` WHERE id=$a;
  2. UPDATE `table` SET id=id+1 WHERE id>$a;


-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 05 Июня, 2010 - 19:35:33
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Проблему решил гораздо проще... Тупо сделал так, что теперь, в редакторе, можно удалить лишь последний элемент в табличке. Остальные лишь редактировать... Да, неудобно, но проблема тем не менее, решена. Спасибо.

От себя добавлю ту самую кучку кода, которая генерит html-таблицу из из SQL-табла. Может кому пригодится...

PHP:
скопировать код в буфер обмена
  1.  
  2. $i = 0;
  3. do {
  4.         echo '<tr>';
  5.         ++$i;          
  6.         $cat_data_arr = mysql_fetch_row(mysql_query("SELECT * FROM `table` WHERE `id`= '$i'"));
  7.         foreach($cat_data_arr as $value) echo "<td>{$value}</td>";                             
  8.         echo '</tr>';
  9. } while ($i < mysql_num_rows(mysql_query("SELECT * FROM `table`")))

(Отредактировано автором: 05 Июня, 2010 - 19:37:47)



-----
И чё?
 
 Top
Мелкий Супермодератор
Отправлено: 05 Июня, 2010 - 21:02:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Одно слово. ужас. Выкиньте это и больше никогда так не делайте.

PHP:
скопировать код в буфер обмена
  1. $query = mysql_query("SELECT * FROM `table`");
  2. while ($row = mysql_fetch_array($query)) {
  3. //и тут делаете вывод каждой строки, типа так:
  4. echo "<tr><td>",$row[0],"</td><td>",$row[1],"</td></tr>";
  5. }

Всё. 1 запрос и код в 2 раза компактнее.

(Отредактировано автором: 05 Июня, 2010 - 21:04:51)



-----
PostgreSQL DBA
 
 Top
Haron
Отправлено: 06 Июня, 2010 - 13:22:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Хм... Ваш код решил все вышеописанные проблемы... Воистину, - знание - сила Улыбка Очень признателен Вам за пинки, огромное спасибо Улыбка


-----
И чё?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB