С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 14.02.2015
Сообщений: 90
1

Удаление "мертвых душ"

01.06.2015, 21:58. Показов 1351. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,подскажите как этот код перевести на PDO.
PHP
1
2
3
4
5
6
<?PHP
    include ("../config/config.php");
    mysql_query ("DELETE FROM users WHERE activation='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 86400");
    mysql_query ("DELETE FROM anketa WHERE activation='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 86400");
    mysql_query ("DELETE FROM logi WHERE activation='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 86400");
    ?>
Скрипт должен удалять пользователей из 3 таблиц если они не активировали аккаут в течении 24 часов.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2015, 21:58
Ответы с готовыми решениями:

Как сделать проверку базы адресов на наличие мертвых ссылок?
Как сделать проверку базы адресов на наличие мертвых ссылок?

Переселение душ видеокарт
На компе стояла видюха amd radeon hd 6670. Ее понадобилось поставить на другой комп. На том, другом...

Играбелен ли полигон душ?
И много ли в этом бреда? Игроки играют за персонажи, но эти персонажи - снова игроки и играют в...

Очистка кода от мертвых процедур на этапе компиляции
Здравствуйте! С таким вопросом столкнулся. Если в Делфи создать обработчик нажатия кнопки...

Клава Logitech Internet PRO Y-SZ49 пережила водяной душ
Доброе время суток, у меня похожая проблема. Клава Logitech Internet PRO Y-SZ49 пережила водяной...

11
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.06.2015, 00:19 2
Самое простое - абсолютно также. Только подключаетесь к PDO, а "mysql_query" меняете на "$db->exec", где $db - созданный вами объект PDO.
Кстати, непонятно, а зачем три, по сути, одинаковых запроса? Почему не просто
SQL
1
DELETE FROM users, anketa, logi WHERE activation='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(DATE) > 86400
?
0
0 / 0 / 1
Регистрация: 14.02.2015
Сообщений: 90
02.06.2015, 00:47  [ТС] 3
Это так должно выглядеть?
PHP
1
2
3
4
5
<?PHP
    include ("../config/config.php");
$sgl = "DELETE FROM users, anketa, logi WHERE activation='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(DATE) > 86400";
$db->exec($sgl);
 ?>
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.06.2015, 08:45 4
Лучший ответ Сообщение было отмечено Александр8867 как решение

Решение

Ну да, как то так. Только date маленькими буквами, это подсветка написала большими буквами..
1
0 / 0 / 1
Регистрация: 14.02.2015
Сообщений: 90
02.06.2015, 17:51  [ТС] 5
А не работает так((( Если оставить 1 таблицу, а не 3 тогда все ок. SOS
PHP
1
2
3
4
5
<?PHP
    include ("../config/config.php");
$sgl = "DELETE FROM users, anketa, logi WHERE activation='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(DATE) > 86400";
$db->exec($sgl);
 ?>
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.06.2015, 20:25 6
Ну да, подзабыл. С несколькими таблицами надо чуть поизгаляться. Самое простое - это как-то так
MySQL
1
2
3
4
5
6
7
8
9
DELETE `u`,`a`,`l`
FROM `users` `u`, `anketa` `a`, `logi` `l`
WHERE
    `u`.`activation` = `a`.`activation` AND
    `a`.`activation` = `l`.`activation` AND
    `u`.`date` = `a`.`date` AND
    `a`.`date` = `l`.`date` AND
    `u`.`activation`='0' AND
    UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`u`.`date`) > 86400
Добавлено через 10 минут
Как вариант, можно еще воспользоваться JOIN-ами.
MySQL
1
2
3
4
5
6
7
DELETE `u`,`a`,`l`
FROM `users` `u`
JOIN `anketa` `a` USING(`activation`, `date`)
JOIN `logi` `l` USING(`activation`, `date`)
WHERE
    `u`.`activation`='0' AND
    UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`u`.`date`) > 86400
0
0 / 0 / 1
Регистрация: 14.02.2015
Сообщений: 90
02.06.2015, 20:36  [ТС] 7
Не работают такие запросы из базы 0 строк удалено
использую Open Server
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.06.2015, 20:37 8
Значит ничего не нашел
0
0 / 0 / 1
Регистрация: 14.02.2015
Сообщений: 90
02.06.2015, 20:49  [ТС] 9
А почему скрипт не нашел? ведь если прописать запрос старый то он находит и удаляет.
А если создать 3 таких запроса для каждой таблицы? проверил работает.
PHP
1
DELETE FROM users WHERE activation='0' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 86400
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.06.2015, 20:50 10
Не знаю. Я проверял на локалке, работает.. В самой консоли (или в PHPMyAdmin) работает запрос?
0
0 / 0 / 1
Регистрация: 14.02.2015
Сообщений: 90
02.06.2015, 21:05  [ТС] 11
Удалено 0 строк. (Запрос занял 0.0010 сек) Нефига не удаляется даже из phpMyAdmin

Добавлено через 5 минут
ошибок скрипт не выдает и база тоже запрос обрабатывает,но не удаляет.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.06.2015, 21:36 12
Я отвечу кодом..
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
mysql> USE `test`;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> SELECT * FROM `test` LIMIT 3;
+----+------+------------+
| id | name | activation |
+----+------+------------+
|  7 |    7 |          0 |
|  8 |    8 |          0 |
+----+------+------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM `test2` LIMIT 3;
+----+------+------------+
| id | name | activation |
+----+------+------------+
|  7 | 7    |          0 |
|  8 | 8    |          0 |
|  9 | 9    |          0 |
+----+------+------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM `test3` LIMIT 3;
+----+------+------------+
| id | name | activation |
+----+------+------------+
|  7 | 7    |          0 |
|  8 | 8    |          0 |
|  9 | 9    |          0 |
+----+------+------------+
3 rows in set (0.00 sec)
 
mysql> DELETE `u`,`a`,`l`
    -> FROM `test` `u`, `test2` `a`, `test3` `l`
    -> WHERE
    -> `u`.`activation` = `a`.`activation` AND
    -> `a`.`activation` = `l`.`activation` AND
    -> `u`.`name` = `a`.`name` AND
    -> `a`.`name` = `l`.`name` AND
    -> `u`.`activation`='0' AND `u`.`name` < 10;
Query OK, 6 rows affected (34.03 sec)
 
mysql> SELECT * FROM `test` LIMIT 3;
Empty set (0.00 sec)
 
mysql> SELECT * FROM `test2` LIMIT 3;+----+------+------------+
| id | name | activation |
+----+------+------------+
|  9 | 9    |          0 |
| 10 | 10   |          0 |
| 11 | 11   |          0 |
+----+------+------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM `test3` LIMIT 3;
+----+------+------------+
| id | name | activation |
+----+------+------------+
|  9 | 9    |          0 |
| 10 | 10   |          0 |
| 11 | 11   |          0 |
+----+------+------------+
3 rows in set (0.00 sec)
 
mysql>
Единственная разница - что я не использовал дату. Ну и названия таблиц и одного поля. Лень было возиться. Все остальное аналогично - даже алиасы те же самые. Но запрос работает

Добавлено через 2 минуты
И да, во втором запросе в сообщении выше я использовал INNER JOIN - а, следовательно, удалятся только те записи, которые одинаковы и по любому присутствуют во всех таблицах. Вам, наверное, надо заменить на LEFT JOIN или RIGHT JOIN

Добавлено через 1 минуту
З.Ы. на время удаления (34 секунды) не смотрите, в двух из этих трех таблиц по миллиону записей
0
02.06.2015, 21:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2015, 21:36
Помогаю со студенческими работами здесь

Успеет ли температура воды сравняться с температурой тела, если душ будет без сильного напора
Ребят, суть такая. Нестандартная задачка для реально физиков ) Итак: Есть человек с ожогом 2...

Люди конфликтуют чтобы получить дозу адреналина, а достаточно для этого принять холодный душ?
Люди конфликтуют чтобы получить дозу адреналина, а достаточно для этого принять холодный душ?

Hdd без мертвых секторов, но 78 errors, брать ил не брать с рук?
Всем привет! Товарищи, хочу приобрести жесткий диск с рук, человек прислал вот этот скрин, по нему...

Выявление "мёртвых" view/proc
Всем привет. На сервере работают несколько десятков людей. Постоянно приходят/уходят люди....

Удаление текста после ALT+Enter либо удаление дублей в массиве
подзадача заключается в том, чтобы после определенного символа в моем случае это &quot;ALT+Enter&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru