|
|
|
| Доброго времени суток коллеги.
Сломал всю голову себе. Никак не могу написать код удаления строк из БД.
Происходит вот что: Есть доска объявлений. При добавлении объявления в БД записывается дата добавления и срок хранения. Ну и соответственно удаляться должны только те строки, которые удовлетворяют условию... Я же написал уже два условия для проверки, но всё равно что то неправильные. По достижению какого то "порога" происходит массовое удаление объявлений, причем в несколько "прохоов", т.е при обновлении страницы сначала удаляется примерно 20, при последующем обновлении ~17, потом ~10, ~5, ~1... И на какой то стадии останавливается...
Посмотрите мой код... Или посоветуйте чего-нибудь своё...
<?
// узнаем настоящее время
$time_now = time ();
/* выбираем данные из таблицы board, у которых сумма значений time_delete (time_delete это срок хранения (7 или 14 или 30 или 90 или 365 дней)),
переведенный в секунды и time (time это дата подачи объявления (в секундах - 1178115734)) меньше, чем настоящее время */
$query = mysql_query ("SELECT * from board WHERE ".$time_now." > ((time_delete * 86400) + time)");
while($q = mysql_fetch_array($query))
{
// "напрямую" вычисляем дату удаления объявления из базы
$data_udaleniya_iz_bazy = $q['time_delete'] * 86400 + $q['time'];
// еще раз ставлю условие для пущей проверки
if (time () > $data_udaleniya_iz_bazy)
{
$del = mysql_query ("DELETE from board LIMIT 1");
}
}
?>
|
Заранее спасибо.. | |
|
|
|
|
|
|
|
для: provodnik
(15.05.2007 в 18:00)
| | так и правильно вы же не указали условия какие строки надо удалаять
зачем столько проверок делать
просто выполните вот такой запрос
DELETE from board WHERE ".$time_now." > ((time_delete * 86400) + time)
|
или вот такой
DELETE from board WHERE (TO_DAYS( time_delete) - TO_DAYS( NOW( ) )) < 0
|
| |
|
|
|
|
|
|
|
для: Mirage
(15.05.2007 в 18:21)
| | >просто выполните вот такой запрос
>
DELETE from board WHERE ".$time_now." > ((time_delete * 86400) + time)
|
К сожалению я с этого начинал... ( | |
|
|
|
|
|
|
|
для: provodnik
(15.05.2007 в 18:26)
| | Для начала приведите структуру таблицы.
Ну и несколько записей в ней тоже не помешает. | |
|
|
|
|
|
|
|
для: Trianon
(15.05.2007 в 18:28)
| | Полей в таблице много, приведу лишь необходимые для работы:
Название таблицы - board
id | time | time_delete
1 | 1175385600 | 14
2 | 1175126400 | 90
3 | 1174780800 | 365
Где time - время добавления строки в БД ( значение ф-ии time() )
time_delete - "срок хранения" в сутках | |
|
|
|
|
|
|
|
для: provodnik
(15.05.2007 в 22:49)
| | Какого типа поля?
Фактически, это было единственной причиной интересоваться структурой. Его-то Вы и не удовлетворили.
Если тип INT , то по идее запрос
DELETE FROM `tab` WHERE UNIX_TIMESTAMP() >= `time_delete` * 86400+`time`
|
должен решить проблему | |
|
|
|
|
|
|
|
для: Trianon
(15.05.2007 в 23:54)
| | Trianon - да, поле time типа INT.
Как я уже писал выше, я начинал с такого запроса, как Вы мне привели. Но к сожалению он выбирает не то, что нужно. В чем то неверно условие...
Наваял "нечто" с условием, проверяющим первое:
<?
$a = mysql_query ("SELECT * from board WHERE UNIX_TIMESTAMP() >= `time_delete` * 86400+`time`");
while($qwe = mysql_fetch_array($a))
{
$t = time (); // время настоящее
$ud = ($qwe['time_delete'] * 86400 + $qwe['time']); // время удаления
if ($t > $ud)
{
$del = mysql_query ("DELETE FROM `board` WHERE id = ".$qwe['id']." LIMIT 1");
}
}
?>
|
Этот код делает всё правильно. Удалил 62 просроченных строки
А первый запрос удаляет 620 строк из 660...
Вот структура таблицы:
CREATE TABLE `board` (
`id` int(11) NOT NULL auto_increment,
`time` int(11) NOT NULL default '0',
`time_delete` enum('7','14','30','60','90','180','365') NOT NULL default '30',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 CHECKSUM=1 AUTO_INCREMENT=676 ;
Никак не могу понять в чём замес... | |
|
|
|
|
|
|
|
для: provodnik
(16.05.2007 в 08:44)
| | Я же написал - если поля типа INT.
А Вы воткнули enum.
enum это всего лишь ярлычок, прибавлять и множить на него - операции неопределенные.
У Вас же по своей физической сути time_delete - величина численная. А не перечислительная. | |
|
|
|
|
|
|
|
для: Trianon
(16.05.2007 в 09:30)
| | Т.е. Решить мой вопрос одним запросом в данном случае не получается? Я правильно понимаю?
Ну вот, век живи, век учись. Я думал, что поля ENUM более гибки... А возможно ли ENUM "на лету" преобразовать в численный тип, для проведения над ним математических операций? | |
|
|
|
|
|
|
|
для: provodnik
(16.05.2007 в 09:38)
| | > А возможно ли ENUM "на лету" преобразовать в численный тип, для проведения над ним математических операций?
Даже и думать не буду,. ибо это есть ересь мерзкая. Не надо мешать мух в котлеты.
Захочется потом поменять '1', '7', '30' на 'сутки', 'неделя', 'месяц' и всё грохнется со страшной силой.
Хотите гибкости - заведите доп. таблицу, допишите JOIN. Хотите жестко - поставьте выбор из списка. Но так - фу. | |
|
|
|