я честно говоря не понимаю правда твоего кода...
PHP:
function isAdmin($id){
if (!isset($truefalse[$id])) {
$sql="SELECT 1 FROM `users` `t1`, `groups` `t2` WHERE `t1`.`id`='".mysql_real_escape_string($id)."' AND `t2`.`sysName`='admin' AND `t1`.`group_id`=`t2`.`id`;";
$query=mysql_query($query) or die ("Ошибка выполнения запроса к БД: ".mysql_error());
$result=(bool)mysql_num_rows($result);
}
return $result;
}
Еще раз мне объясните почему не так? Из-за мефического хайлоада?
Аааа я понял тут архитектура кривая, блин, а я то... isAdmin должен браться из сессии пользователя, а проверяться чуть ли не в бутстрапе.
Короче как всегда проблема свелась не к тому КАК ты пишешь, а ЧТО ты пишешь...
Хайлоад - когда сервер перенагружен, так?
логика такая:
мне нужно что-то вывести для сотрудника, но не менеджера и логиста -
PHP:
if(isCoworker($id)&&(!isManager($id)||!isLogist($id))
Затем мне нужно вывести что-то другое с другими условиями для всех сотрудников, кроме менеджеров -
PHP:
if (isCoworker($id)&&!isManager($id))
А внутри второго if() еще дополнительное условие: не выводить что-то, помимо перечисленных логисту
Зачем же мне повторно обращаться к БД за теми же самыми данными, если я их уже получил десятью строками ранее.
Естественно ни о каком перегрузе сервера не идет речь. Вся моя программа спокойно могла бы работать на домашнем сетевом хранилище. Но делаю так, потому что не вижу необходимости нагружать mysql, просто потому что могу нагрузить и он выдержит это.
И еще в будущем, возможны эксперименты с другими БД, а я хотел бы оставить возможность разделять сервера хостинга и БД при этом не теряя время на получения ответа от удаленной БД.
Да, $id берется из сессии, что позволяет мне вообще ничего не подавать на вход функций. Но, как написал выше, возможно буду обрабатывать список пользователей внутри программы, а значит проверять можно будет, последовательно подавая на вход идентификаторы, а не ид пользователя из сессии.
На самом деле не обязательно применять один и тот же подход.
То есть, если делать унифицированно, то обязательно:
PHP:
function checkRights($is,"admin")
- здесь код должен быть единообразным для всех вариантов. Но зато количество функций уменьшится.
PHP:
function inGroup($user_id, $group='admin')
Вполне логично и разумно. Однообразные функции не нужны. Оставил их из-за того, что в eclipse очень удобно пользоваться автоматической вставкой переменных и функций. Т.е. вводишь часть названия функции, а затем курсором просто выбираешь нужную. И тебе не нужно нигде вводить дополнительно текст группы, в написании которого могу допустить ошибку. ) я так частенько в программе делаю. внимательность конечно хорошо, но если незаметил, а у тебя все время на выходе false из-за того что не было такого идентификатора группы (теперь используется sysName).
Но когда разработка программы будет уже не такой частой и все будет более менее работать нормально, то я естественно сделаю вместо этих функций одну для сотрудников, а другую для клиентов.
Но если на каждый чих используется своя функция, то почему бы не сделать для админов и прочей мелочи заполнение массива целиком, а для юзеров - вот такой вариант.
Хотя на странице, где идёт 70 проверок, скорее всего просто неверно построен запрос к БД.
Логично и опять спасибо за идею. Сотрудники часто ходят по страницам и им нужно максимально быстрый вывод информации, а следовательно для сотрудников логично будет вообще сократить обращение к БД до одного в данной функции. У пользователей задача проще и это, наверное, не критично.
Что касается запросов к БД, то согласен с тем что неправильно. После того, как функция приняла такой вид:
PHP:
static $return;
if (!isset($return[$id])) {
$query="SELECT 1 FROM `users` `t1`, `groups` `t2` WHERE `t1`.`id`='".mysql_real_escape_string($id)."' AND `t2`.`sysName`='admin' AND `t1`.`group_id`=`t2`.`id`;";
$result=mysql_query($query) or die ("Ошибка выполнения запроса к БД: ".mysql_error());
$return[$id]=(bool)mysql_num_rows($result);
}
return $return[$id];
кол-во запросов к бд для функции isAdmin с 31-го сократилось до 1. Логично, что по аналогии и кол-во обращений у функции isClient сократится.