Нашел ужасный код в двиге JohnCMS5

1.27K
.
/*
 -----------------------------------------------------------------
 Отмечаем все темы как прочитанные
 -----------------------------------------------------------------
 */
$req = mysql_query("SELECT `forum`.`id`
            FROM `forum` LEFT JOIN `cms_forum_rdm` ON `forum`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '$user_id'
            WHERE `forum`.`type`='t'
            AND `cms_forum_rdm`.`topic_id` Is Null");
while ($res = mysql_fetch_assoc($req)) {
    mysql_query("INSERT INTO `cms_forum_rdm` SET
                    `topic_id` = '" . $res['id'] . "',
                    `user_id` = '$user_id',
                    `time` = '" . time() . "'");
}
$req = mysql_query("SELECT `forum`.`id` AS `id`
            FROM `forum` LEFT JOIN `cms_forum_rdm` ON `forum`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '$user_id'
            WHERE `forum`.`type`='t'
            AND `forum`.`time` > `cms_forum_rdm`.`time`");
while ($res = mysql_fetch_array($req)) {
    mysql_query("UPDATE `cms_forum_rdm` SET
                    `time` = '" . time() . "'
                    WHERE `topic_id` = '" . $res['id'] . "' AND `user_id` = '$user_id'");
}


Что это?
Я допустим отмечаю как прочитанное когда у меня более 100, а иногда забываю и чистю когда более 1000 обновленных тем.
И как это называется?
.
Это меня очень удивило.
.
Я кстати давно хотел старому пожаловаться, но забыл
.
А самое печальное что по другому и не сделаешь. В mysqli еще можно выкрутиться при помощи multi_query или подготавливаемых запросов, но точно не тут.
.
Это же ппц. Ну вот пара человек на слабеньком хостинге отмечают 200 непрочитанных тем.
Математика:
10 * ((200 * 2) + 2) = 4020

Объясняю цифры:
10 - человек
200 - непрочитанных тем
...*2 - циклы
...+2 - запросы вне цикла

Вывод:
Джон сделает 4020 запросов.
.
# web_demon (01.10.2013 / 17:09)
А самое печальное что по другому и не сделаешь. В mysqli еще можно выкрутиться при помощи multi_query или подготавливаемых запросов, но точно не тут.
Это да. А кстати на счет "ON DUPLICATE KEY" не поможет? Хотя бы в 2 раза сократить.
.
# web_demon (01.10.2013 / 17:09)
А самое печальное что по другому и не сделаешь. В mysqli еще можно выкрутиться при помощи multi_query или подготавливаемых запросов, но точно не тут.
Ну почему не сделаешь?
.
# Krite (01.10.2013 / 17:14)
Ну почему не сделаешь?
Как?
.
По-моему, просто немножко перестроить архитектуру.
При добавлении поста пихать запись в forum_rdm.
А потом одним запросом read = 1.
При обновлении запись с идом топика read = 0;
Ну все просто. Я бы так сделал.
.
# NURD (01.10.2013 / 17:13)
Это да. А кстати на счет "ON DUPLICATE KEY" не поможет? Хотя бы в 2 раза сократить.
Как вариант, да. На безрыбье и рак рыба)

Ну почему не сделаешь?
Ну написал же что нельзя переделать. Или создавать второй коннект к базе уже при помощи mysqli?
Всего: 105