Как отследить источник запросов к SQL

1 2345 6
Kaavain
На сайте с 28.07.2015
Offline
133
#31
Snake800 #:
Надо сокращать количество запросов. Уверен, что это можно реализовать относительно легко

Итак, первый успех. Обратил внимание, что при построении иерархии меню (их два, одно правда кешируется) цикл с запросом в БД пробегает даже если ИД раздела =1, то есть верхний уровень... Сменил начальный счетчик в функции с 0 на 1, и в if $1>0 => $i>1. Одним махом убрал 200 запросов, то есть на 15% полегчало...

Snake800 #:
может быть даже не поломав сайт.

вот теперь надо наблюдать... Вроде голову поломал, echo понавставлял - не должно поломать... Надеюсь.

Sly32 #:
Возможно как то используется при выводе полученных данных, а возможно и просто так добавили, не подумав.

функция 5 строк, $myrow["id"] нет там... Походу неподумав... Я на самом деле за программистом ужа находил подобное, как поумнел, но каждый раз сильно сомневаюсь - может это я дурак на самом деле... Но пока - нет.

Могу порекомендовать только хостинг: https://traf.at/vps - за 3 года все на 4++ и цены не подняли. Ну и банк для белых ИП: https://traf.at/bankm
W1
На сайте с 22.01.2021
Online
285
#32
Aisamiery #:
он нужен только в IN чтобы понять к какому id из запрошенных какой parent_id соответствует

Ты не прав. Выше я написал, почему.

Мой форум - https://webinfo.guru –Там я всегда на связи
Kaavain
На сайте с 28.07.2015
Offline
133
#33
webinfo #:

Ты не прав. Выше я написал, почему.

Там вот и все:

function level($id) {
$level = 1;
        while ($id > 1) {
                $result = mysql_query("SELECT id,id_parent FROM `content` WHERE id='$id'");
                $myrow = mysql_fetch_array($result);
                $id_parent = $myrow["id_parent"];
                $level = $level + 1;
                $id = $id_parent;
        }
        return $level;
}

Это уже мной подкрученная. Была

function level($id) {
        $i = 0;
        while ($id > 0) {
                $result = mysql_query("SELECT id,id_parent FROM `content` WHERE id='$id'");
                $myrow = mysql_fetch_array($result);
                $id_parent = $myrow["id_parent"];
                $i = $i+1;
                $id = $id_parent;
                $level = $i;
        }
        return $level;
}
W1
На сайте с 22.01.2021
Online
285
#34
Kaavain #:
каждый раз сильно сомневаюсь - может это я дурак на самом деле

И это правильно. Бывает, что сам чего-то не учитываешь. Поэтому в сложных случаях приходится всё тщательно перепроверять, прежде чем исправлять чужой "косяк".

W1
На сайте с 22.01.2021
Online
285
#35
Kaavain #:
Там вот и все

Но у нас разговор был про общий случай. В данном конкретном случае - может быть, и лишнее.

Sly32
На сайте с 29.03.2012
Offline
303
#36
Kaavain #:
function level($id) {
$level = 1;
        while ($id > 1) {
                $result = mysql_query("SELECT id,id_parent FROM `content` WHERE id='$id'");
                $myrow = mysql_fetch_array($result);
                $id_parent = $myrow["id_parent"];
                $level = $level + 1;
                $id = $id_parent;
        }
        return $level;
}

OMG что это??? Вот прям стока памяти, что нужно хранить дикое количество переменных? В Питоне бы за такое руки оторвали! Почему не

function level($id) {
$level = 1;
        while ($id > 1) {
                $result = mysql_query("SELECT id,id_parent FROM `content` WHERE id='$id'");
                $myrow = mysql_fetch_array($result);
                $id = $myrow["id_parent"];
                $level += 1;
        }
        return $level;
}

как минимум

Aisamiery
На сайте с 12.04.2015
Offline
293
#37
Kaavain #:

Там вот и все:

function level($id) {
$level = 1;
        while ($id > 1) {
                $result = mysql_query("SELECT id,id_parent FROM `content` WHERE id='$id'");
                $myrow = mysql_fetch_array($result);
                $id_parent = $myrow["id_parent"];
                $level = $level + 1;
                $id = $id_parent;
        }
        return $level;
}

Во-первых, у вас тут SQL Injection.
Во-вторых, level лучше добавить в таблицу content чтоб он выбирался одним запросом, а не в цикле

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
Kaavain
На сайте с 28.07.2015
Offline
133
#38
Sly32 #:
как минимум

Разница в одну. Да и все равно я прибил свою правку. Она поломала местами сайт, ибо блин я не учел, что сразу под 0 у меня не только блин 1, а еще пяток. Запихивать их в array это костылькостыльный, так как на разных сайтах (ЦМС обслуживает 7 доменов) чуть рознятся... Чешу репу...

Зато походу оптимизировал еще несколько сотен запросов - обнаружил что рекламные блоки опрашиваются всегда все возможные (32 шт), тогда как показываются все 4-5. Сделал лишний запрос на проверку количества не скрытых - получил минус 300 запросов.

Aisamiery #:
Во-первых, у вас тут SQL Injection.

Хде и как?

Aisamiery #:
Во-вторых, level лучше добавить в таблицу content чтоб он выбирался одним запросом, а не в цикле

Это я сразу понял! Но тут не обойтись тремя строчками кода, дофига всего переделывать... 

LEOnidUKG
На сайте с 25.11.2006
Online
1723
#39
Kaavain #:
Хде и как?

Наверное из-за того, что нет обработки в функции переменной $id, а сразу вставляются данные. Возможно где-то ДО этого идёт проверка, что id точно является числом. Если нет, то лучше в функции привести переменную к формату abs(intval($id))

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Kaavain
На сайте с 28.07.2015
Offline
133
#40
LEOnidUKG #:
Возможно где-то ДО этого идёт проверка, что id точно является числом

А, это... Да, у меня все строго. Только числа, причем нельзя даже + вставить, а то плодить яндекс стал дубли, так как изначально ЦМС проглатывала.

1 2345 6

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий