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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
ipv2007
Отправлено: 10 Июля, 2014 - 10:19:14
Post Id


Новичок


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


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




Уважаемые, помогите решить проблему.
Имеется БД в которую записана строчка с указанием даты окончания действия этой строчки в UNIX формате. т.е. мы знаем дату, когда должна быть удалена эта запись.
Какой мне нужно написать скрипт, чтобы в дальнейшем его повесить на CRON, который бы сверял дату в этой БД и удалял все строчки, дата которых закончилась?
Предоставлю скрипт, который заносит эти строчки в БД тому, кто согласится помочь.
Мой скайп pasha_ipv, готов оплатить помощь.

Также, готов в этой теме вместе с вами разобраться с этим делом, если никто за вознаграждение не поможет.
Спасибо.
 
 Top
Мелкий Супермодератор
Отправлено: 10 Июля, 2014 - 10:25:54
Post Id



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


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


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




CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename` WHERE `expire_date`<NOW()


-----
PostgreSQL DBA
 
 Top
ipv2007
Отправлено: 10 Июля, 2014 - 10:50:13
Post Id


Новичок


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


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




Мелкий пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename` WHERE `expire_date`<NOW()

Спасибо, я сделал таким образом
("DELETE FROM `таблица` WHERE `time` < UNIX_TIMESTAMP()");
Все удаляется, но теперь другой вопрос:
Мне надо, чтобы вместе с удалением этой строчки, удалялась строчка из другой БД, где нет уже указания даты. Единственное, что у них общее, это ник.
Как сделать так, чтобы при удалении строчки по методу, выше, в которой присутствует колонка с ником и датой дейтсвия, еще удалялась колонка с таким-же ником, но в другой БД и без даты действия?
Надеюсь, понятно объяснил... ;)
 
 Top
Мелкий Супермодератор
Отправлено: 10 Июля, 2014 - 10:57:40
Post Id



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


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


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




CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename`, `anothertable` USING `tablename` JOIN `anothertable` ON `поле одной таблицы`=`поле другой табличц` WHERE `expire_date`<NOW()


-----
PostgreSQL DBA
 
 Top
ipv2007
Отправлено: 10 Июля, 2014 - 11:30:43
Post Id


Новичок


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


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




Мелкий пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename`, `anothertable` USING `tablename` JOIN `anothertable` ON `поле одной таблицы`=`поле другой табличц` WHERE `expire_date`<NOW()

Объясните, пожалуйста, в этой строчке, как я понимаю, мы указываем таблицы из обеих БД и далее делаем равнозначными разные поля из обеих БД?
Я правильно на картинке нарисовал?
Прикреплено изображение (Нажмите для увеличения)
01.png

(Отредактировано автором: 10 Июля, 2014 - 11:47:41)

 
 Top
Contr
Отправлено: 10 Июля, 2014 - 12:05:51
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


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




Автор, обе таблицы у Вас в одной БД или в разных? Кросс-БД операторов не существует.
 
 Top
ipv2007
Отправлено: 10 Июля, 2014 - 12:08:18
Post Id


Новичок


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


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




Contr пишет:
Автор, обе таблицы у Вас в одной БД или в разных? Кросс-БД операторов не существует.

В том-то и дело, что в разных БД. Сижу и думаю, как подключиться сразу к двум БД или возможно по-другому решить вопрос?
 
 Top
Contr
Отправлено: 10 Июля, 2014 - 12:11:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


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




ipv2007 пишет:
Сижу и думаю, как подключиться сразу к двум БД

$this->pdo1->query()//запрос к 1й БД
$this->pdo2->query()//запрос к 2 БД
(Добавление)
А вы не путаете термин "БД" и термин "таблица" часом?
 
 Top
ipv2007
Отправлено: 10 Июля, 2014 - 12:16:48
Post Id


Новичок


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


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




Contr пишет:
ipv2007 пишет:
Сижу и думаю, как подключиться сразу к двум БД

$this->pdo1->query()//запрос к 1й БД
$this->pdo2->query()//запрос к 2 БД

Не очень врубился, я приведу ниже свой скрипт:

Файл config.php
PHP:
скопировать код в буфер обмена
  1.  
  2. $configuration = array (
  3.         'database' => array (
  4.                 'host' => 'localhost',
  5.                 'user' => 'имя',
  6.                 'pass' => 'пароль',
  7.                 'base' => 'имяБД1'     
  8.  


далее в другом файле php, назовем его delete.php
идет подключение к БД указанной к config.php
PHP:
скопировать код в буфер обмена
  1.  
  2. class database extends system
  3. {
  4.         public function __construct($connect)
  5.         {
  6.                 include BASE_URL . "config.php";
  7.                 $this->pdo = $connect; $this->config = $configuration;
  8.                 $this->pdo->query("DELETE FROM `таблица` WHERE `time` < UNIX_TIMESTAMP()");
  9.  

Как мне приконнектить вторую БД?
 
 Top
Contr
Отправлено: 10 Июля, 2014 - 12:20:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


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




А вы не путаете термин "БД" и термин "таблица" часом?
ipv2007 пишет:
Как мне приконнектить вторую БД?

PHP:
скопировать код в буфер обмена
  1. class database extends system
  2. {
  3.         public function __construct($connect)
  4.         {
  5.                 include BASE_URL . "config.php";
  6.                 $this->pdo = $connect; $this->config = $configuration;
  7.                 $this->pdo2 = $connect; $this->config = $configuration2;
  8.                 $this->pdo->query("DELETE FROM `таблица` WHERE `time` < UNIX_TIMESTAMP()");


PHP:
скопировать код в буфер обмена
  1. $configuration = array (
  2.         'database' => array (
  3.                 'host' => 'localhost',
  4.                 'user' => 'имя',
  5.                 'pass' => 'пароль',
  6.                 'base' => 'имяБД1'     );
  7. $configuration2 = array (
  8.         'database' => array (
  9.                 'host' => 'localhost',
  10.                 'user' => 'имя',
  11.                 'pass' => 'пароль',
  12.                 'base' => 'имяБД2');      

как то так Хорошо
(Добавление)
скобки только расставьте
 
 Top
ipv2007
Отправлено: 10 Июля, 2014 - 12:22:03
Post Id


Новичок


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


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




Contr пишет:
А вы не путаете термин "БД" и термин "таблица" часом?

Нет, не путаю. БД - База Данных, Таблица - внутри БД
Я же на картинке нарисовал свою ситуацию.
Имею две Базы данных.
имя БД1 - one
в ней таблица tableOne
в БД1 записана строчка с указанием даты

имя БД2 - two
в ней таблица tableTwo
в БД2 записана строчка без указания даты

НО! в этих в этих строчках есть столбец, которые содержит одинаковые ники пользователей

Надеюсь понятно теперь? )
 
 Top
Contr
Отправлено: 10 Июля, 2014 - 12:26:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


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




что у вас там за коннект?
у меня так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class Database extends PDO {
  4.  
  5.     public function __construct($DB_TYPE, $DB_HOST, $DB_PORT, $DB_NAME, $DB_USER, $DB_PASS) {
  6.         if ($DB_NAME != NULL) {
  7.             parent::__construct($DB_TYPE . ':host=' . $DB_HOST . ';port=' . $DB_PORT . ';dbname=' . $DB_NAME . ';user=' . $DB_USER . ';password=' . $DB_PASS);
  8.         } else {
  9.             header('location:' . URL);
  10.         }
  11.     }
  12.  
  13.  
  14.  
  15. }

PHP:
скопировать код в буфер обмена
  1. class Model {
  2.  
  3.     function __construct() {
  4.         $this->db = new Database(DB_TYPE, DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASS);
  5.     }
 
 Top
ipv2007
Отправлено: 10 Июля, 2014 - 12:33:17
Post Id


Новичок


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


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




Contr пишет:
скобки только расставьте

Расставил. Потом добавил вот такую строчку, что посоветовали выше в теме
PHP:
скопировать код в буфер обмена
  1.  
  2. DELETE FROM `tablename`, `anothertable` USING `tablename` JOIN `anothertable` ON `поле одной таблицы`=`поле другой табличц` WHERE `expire_date`<NOW()
  3.  


Не робит.

P.S. Что-то я уже запутываться начинаю... надо переварить... )))
 
 Top
Contr
Отправлено: 10 Июля, 2014 - 12:34:26
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


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




PHP:
скопировать код в буфер обмена
  1. $sth = $this->pdo1->query("DELETE FROM тратата RETURNING name")//запрос к 1й БД
  2. $arr = $sth->fetchAll();
  3. foreach($arr as $v){
  4.    $child = $v['name'];
  5.    $this->pdo2->query(DELETE FROM тратата WHERE child=$child)//запрос к 2 БД
  6. }

(Добавление)
Вам надо использовать 2 объекта ПДО. Из одного при удалении вернуть значение имени удаленного пользователя. Затем вставить это имя в запрос ко второй БД, используя второй объект ПДО.
И да: RETURNING не работает MySQL. Зато работает в postgres

(Отредактировано автором: 10 Июля, 2014 - 12:40:22)

 
 Top
Мелкий Супермодератор
Отправлено: 10 Июля, 2014 - 12:39:03
Post Id



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


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


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




ipv2007 пишет:
Нет, не путаю. БД - База Данных, Таблица - внутри БД

На самом деле действительно надо было уточнить, часто по-странному обзывают.

Contr пишет:
Кросс-БД операторов не существует.

СУБД всё равно, в одной БД таблицы или в разных, лишь бы в рамках одного сервера (если не затрагивать dblink и прочее).
Нюансы только в том, что:
0) должно быть достаточно прав на обе БД
1) вместо `tablename` пишется полностью `databasename`.`tablename`
Это будет самым простым способом.

Если нет прав либо базы на разных машинах, то придётся джойнить на приложении:
Делаете из первой БД select `primary_key`, `поле таблицы` from `tablename` where `expired_date`<now();
в цикле обходите результат и рассылаете простой delete по разным соединениям.


-----
PostgreSQL DBA
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB