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]   

> Описание: PHP + MySQL
Heavenanvil
Отправлено: 17 Августа, 2016 - 12:51:48
Post Id


Частый гость


Покинул форум
Сообщений всего: 183
Дата рег-ции: Февр. 2013  


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




Здравствуйте, уважаемые господа (и возможно даже дамы Улыбка )

Проблема моя в следующем.

Мне нужен скрипт (функция?), который ищет по всем строкам определенные значения в таблице, сравнивает их, и если нужно изменяет.

Живым языком могу объяснить так:
php-файлик запущен в cron'e, и с интервалом примерно в 5-10 минут и выполняет следующую функцию:
Просматривает все посты на форуме, смотрит их дату создания.
Если дата создания поста больше текущего (реального) unix-времени, то пост должен быть неактивным. Если дата-создания меньше (а пост неактивен), то сделать пост активным.
Другими словами делаю отложенную публикацию постов. Пишу их заранее, ставлю дату из будущего, а появляются они только после того, как их дата создания сравняется с реальным временем. Надеюсь доступно объяснил.

Вот мой пример, который определяет делать пост активным или нет:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. mysql_connect("localhost", "имя_пользователя", "пароль_бд");
  3. mysql_select_db("имя_бд");
  4. mysql_query  ("set_client='utf8'");
  5. mysql_query  ("set character_set_results='utf8'");
  6. mysql_query  ("set collation_connection='utf8_general_ci'");
  7. mysql_query  ("SET NAMES utf8");
  8.  
  9. $post_id = 1647;        // номер поста, но мне нужно просканировать все посты таблицы
  10. $real_time = time();
  11.        
  12. $sql = "SELECT `post_date` FROM `forums_posts` WHERE `pid` = $post_id";
  13. $result = mysql_query($sql) or die(mysql_error());
  14. $current_post_time = mysql_fetch_array($result);
  15. $post_time = $current_post_time[0];    
  16.  
  17. if ($real_time > $post_time)
  18. {
  19. echo 'Делаем пост активным<br />';
  20. }
  21. if ($real_time <= $post_time)
  22. {
  23. echo 'Делаем пост неактивным<br />';
  24. }?>
  25.  
 
 Top
Мелкий Супермодератор
Отправлено: 17 Августа, 2016 - 12:56:36
Post Id



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


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


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




CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE forums_posts SET is_active=1 WHERE pubdate < now() AND is_active=0

Всё.


-----
PostgreSQL DBA
 
 Top
Heavenanvil
Отправлено: 17 Августа, 2016 - 14:07:12
Post Id


Частый гость


Покинул форум
Сообщений всего: 183
Дата рег-ции: Февр. 2013  


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




Мелкий пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE forums_posts SET is_active=1 WHERE pubdate < now() AND is_active=0

Всё.

Спасибо большое.
А как быть на счёт того, чтобы сделать неактивными те посты, которые имеют значение больше даты?
(Добавление)
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE forums_posts SET is_active=0 WHERE pubdate >= now() AND is_active=1

?

(Отредактировано автором: 17 Августа, 2016 - 14:15:07)

 
 Top
Мелкий Супермодератор
Отправлено: 17 Августа, 2016 - 14:17:31
Post Id



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


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


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




Их тоже надо переключать? А зачем? Обычно этот флаг снимают при создании/редактировании.
Нередко этот флаг вообще не делают, в запросе на выборку постов так и оставляют
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE topic_id=? AND pubdate < now() ORDER BY pubdate


Можно и сразу
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE forums_posts SET is_active=(pubdate < now()) WHERE (pubdate < now() AND is_active=0) OR (pubdate >= now() AND is_active=1)

На самом деле достаточно
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE forums_posts SET is_active=(pubdate < now())

Но это гарантированный fullscan, что не очень интересно.


-----
PostgreSQL DBA
 
 Top
Heavenanvil
Отправлено: 17 Августа, 2016 - 14:22:31
Post Id


Частый гость


Покинул форум
Сообщений всего: 183
Дата рег-ции: Февр. 2013  


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




Нет, такого флага нет. Посты создаются сразу активными.

Но спасибо за помощь.
(Добавление)
Навалял вот такой код:
CODE (SQL):
скопировать код в буфер обмена
  1. $real_time = time();
  2. $min_time = time() - (7 * 24 * 60 * 60); //За последнюю неделю
  3.  
  4. $sql = "UPDATE `forums_posts` SET `queued` = 0 WHERE `post_date` < $real_time AND `post_date` > $min_time AND `queued` = 1";
  5. mysql_query($sql) OR die(mysql_error());
  6. $sql2 = "UPDATE `forums_posts` SET `queued` = 1 WHERE `post_date` > $real_time AND `queued` = 0";
  7. mysql_query($sql2);
При ручном обновлении файла работает хорошо. Но при добавлении в cron - не работает. Есть идеи?
 
 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