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
Форумы портала PHP.SU :: Версия для печати :: Как удалить запись из БД по истечению срока
Форумы портала PHP.SU » » Работа с СУБД » Как удалить запись из БД по истечению срока

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

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

Также, готов в этой теме вместе с вами разобраться с этим делом, если никто за вознаграждение не поможет.
Спасибо.
2. Мелкий - 10 Июля, 2014 - 10:25:54 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename` WHERE `expire_date`<NOW()
3. ipv2007 - 10 Июля, 2014 - 10:50:13 - перейти к сообщению
Мелкий пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename` WHERE `expire_date`<NOW()

Спасибо, я сделал таким образом
("DELETE FROM `таблица` WHERE `time` < UNIX_TIMESTAMP()");
Все удаляется, но теперь другой вопрос:
Мне надо, чтобы вместе с удалением этой строчки, удалялась строчка из другой БД, где нет уже указания даты. Единственное, что у них общее, это ник.
Как сделать так, чтобы при удалении строчки по методу, выше, в которой присутствует колонка с ником и датой дейтсвия, еще удалялась колонка с таким-же ником, но в другой БД и без даты действия?
Надеюсь, понятно объяснил... ;)
4. Мелкий - 10 Июля, 2014 - 10:57:40 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename`, `anothertable` USING `tablename` JOIN `anothertable` ON `поле одной таблицы`=`поле другой табличц` WHERE `expire_date`<NOW()
5. ipv2007 - 10 Июля, 2014 - 11:30:43 - перейти к сообщению
Мелкий пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM `tablename`, `anothertable` USING `tablename` JOIN `anothertable` ON `поле одной таблицы`=`поле другой табличц` WHERE `expire_date`<NOW()

Объясните, пожалуйста, в этой строчке, как я понимаю, мы указываем таблицы из обеих БД и далее делаем равнозначными разные поля из обеих БД?
Я правильно на картинке нарисовал?
6. Contr - 10 Июля, 2014 - 12:05:51 - перейти к сообщению
Автор, обе таблицы у Вас в одной БД или в разных? Кросс-БД операторов не существует.
7. ipv2007 - 10 Июля, 2014 - 12:08:18 - перейти к сообщению
Contr пишет:
Автор, обе таблицы у Вас в одной БД или в разных? Кросс-БД операторов не существует.

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

$this->pdo1->query()//запрос к 1й БД
$this->pdo2->query()//запрос к 2 БД
(Добавление)
А вы не путаете термин "БД" и термин "таблица" часом?
9. ipv2007 - 10 Июля, 2014 - 12:16:48 - перейти к сообщению
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.  

Как мне приконнектить вторую БД?
10. Contr - 10 Июля, 2014 - 12:20:34 - перейти к сообщению
А вы не путаете термин "БД" и термин "таблица" часом?
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');      

как то так Хорошо
(Добавление)
скобки только расставьте
11. ipv2007 - 10 Июля, 2014 - 12:22:03 - перейти к сообщению
Contr пишет:
А вы не путаете термин "БД" и термин "таблица" часом?

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

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

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

Надеюсь понятно теперь? )
12. Contr - 10 Июля, 2014 - 12:26:02 - перейти к сообщению
что у вас там за коннект?
у меня так:
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.     }
13. ipv2007 - 10 Июля, 2014 - 12:33:17 - перейти к сообщению
Contr пишет:
скобки только расставьте

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


Не робит.

P.S. Что-то я уже запутываться начинаю... надо переварить... )))
14. Contr - 10 Июля, 2014 - 12:34:26 - перейти к сообщению
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
15. Мелкий - 10 Июля, 2014 - 12:39:03 - перейти к сообщению
ipv2007 пишет:
Нет, не путаю. БД - База Данных, Таблица - внутри БД

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

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

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

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

 

Powered by ExBB FM 1.0 RC1