Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
6 / 6 / 5
Регистрация: 29.01.2015
Сообщений: 467

Авторизация пользователя проходит в три обращения к БД, можно ли это оптимизировать?

23.05.2015, 20:07. Показов 1497. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой код, но меня беспокоит, что к mySQL обращаемся 3 раза. Не подскажите, как можно оптимизировать?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
  $getSalt = $this->db_users->prepare("SELECT * FROM `users` WHERE `email` = :email");
  $getSalt->execute(array(':email' => $user['email']));
  $row = $getSalt->fetch(PDO::FETCH_ASSOC);
  if($row['id']) {
    $hash_passw = crypt($user['password'], $row['sault']);
    $auth = $this->db_users->prepare("SELECT * FROM `users` WHERE `email` = :email AND `password` = :hash_passw");
    $auth->execute(array(':email' => $user['email'],
                           ':hash_passw' => $hash_passw));
    $_row = $auth->fetch(PDO::FETCH_ASSOC);
    if($_row) {
      $auth_token = '$3a$'.sha1(date(dmY).time().$user['email']).'$';
      $auth = $this->db_users->prepare("UPDATE `users` SET `auth_token`=:auth_token, WHERE `email` = :email");
      $auth->execute(array(':auth_token' => $auth_token,
                             ':email' => $user['email']));
      $domain = $_SERVER['HTTP_HOST'];
      setcookie('authToken', $value, time()+3600, '', $domain, 1);  
      setcookie('hash', $value, time()+3600, '', $domain, 1);
      return true;        
    } else {$err['message'] = $this->system_message->getLang('wrong_email_or_password');}
  } else {$err['message'] = $this->system_message->getLang('wrong_email_or_password');}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.05.2015, 20:07
Ответы с готовыми решениями:

Регистрация и авторизация пользователя - можно ли оптимизировать код
Можно ли как-то упростить такой код, или это - то что нужно? Простенькие до ужаса регистрация пользователя и авторизация. #include...

Не проходит авторизация пользователя
в программе не осуществляется авторизация пользователя, пишет ошибки:

IdHTTP авторизация проходит успешно, но не могу гулять по страницам через своего пользователя
Авторизовался на сайте успешно, но при попытке перехода по другим вкладкам сайта меня выкидывает с моего пользователя. Подскажите где...

6
 Аватар для Dealiss
296 / 284 / 84
Регистрация: 10.05.2013
Сообщений: 920
23.05.2015, 22:34
Лучший ответ Сообщение было отмечено qwertyyyyyw как решение

Решение

qwertyyyyyw, можно обойтись без 2-го обращения к базе. В $row уже есть пароль. Сравните его и если верный, делайте UPDATE.
1
6 / 6 / 5
Регистрация: 29.01.2015
Сообщений: 467
23.05.2015, 22:57  [ТС]
Цитата Сообщение от Dealiss Посмотреть сообщение
qwertyyyyyw, можно обойтись без 2-го обращения к базе. В $row уже есть пароль. Сравните его и если верный, делайте UPDATE.
Спасибо.
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
24.05.2015, 12:59
SQL
1
SELECT * FROM `users` WHERE `email` = :email AND `password` = :hash_passw
0
6 / 6 / 5
Регистрация: 29.01.2015
Сообщений: 467
24.05.2015, 14:45  [ТС]
Цитата Сообщение от alpex Посмотреть сообщение
SQL
1
SELECT * FROM `users` WHERE `email` = :email AND `password` = :hash_passw
Это SQL для выборки email и password пользователя.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
24.05.2015, 15:13
Лучший ответ Сообщение было отмечено qwertyyyyyw как решение

Решение

1. SELECT * FROM `users` WHERE `email` = :email
вам действительно нужны все поля? правилом хорошего тона является перечисление нужных полей в запросе, так как вы при * можете гонять между сервером абсолютно не нужные данные формата text, blob
В данном запросе по полю email должно быть построен индекс или поле должно быть крайним левым в составном индексе
если запрещено с одинаковым email иметь несколько аккаунтов поле должно быть уникальным (выборка будет происходить еще быстрее)
2. if($row['id'])
PHP
1
2
if(isset($row['id']))
if(empty($row['id']))
3. $auth = $this->db_users->prepare("SELECT * FROM `users` WHERE `email` = :email AND `password` = :hash_passw");
этот запрос лишний так как данные вы можете получить уже в первом запросе
4. "UPDATE `users` SET `auth_token`=:auth_token, WHERE `email` = :email"
надо переписать
"UPDATE `users` SET `auth_token`=:auth_token, WHERE `id` = :id"
здесь подразумевается, что id - поле авто инкремент, ключ PRIMARY
1
6 / 6 / 5
Регистрация: 29.01.2015
Сообщений: 467
24.05.2015, 16:59  [ТС]
Цитата Сообщение от Poznakomlus Посмотреть сообщение
1. SELECT * FROM `users` WHERE `email` = :email
вам действительно нужны все поля? правилом хорошего тона является перечисление нужных полей в запросе, так как вы при * можете гонять между сервером абсолютно не нужные данные формата text, blob
В данном запросе по полю email должно быть построен индекс или поле должно быть крайним левым в составном индексе
если запрещено с одинаковым email иметь несколько аккаунтов поле должно быть уникальным (выборка будет происходить еще быстрее)
2. if($row['id'])
PHP
1
2
if(isset($row['id']))
if(empty($row['id']))
3. $auth = $this->db_users->prepare("SELECT * FROM `users` WHERE `email` = :email AND `password` = :hash_passw");
этот запрос лишний так как данные вы можете получить уже в первом запросе
4. "UPDATE `users` SET `auth_token`=:auth_token, WHERE `email` = :email"
надо переписать
"UPDATE `users` SET `auth_token`=:auth_token, WHERE `id` = :id"
здесь подразумевается, что id - поле авто инкремент, ключ PRIMARY
Спасибо большое за ценные советы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.05.2015, 16:59
Помогаю со студенческими работами здесь

Yii авторизация. Можно ли оптимизировать код?
Делаю авторизацию пользователей. В случае если пользователь не активен ( не подтвержден) после входа он должен получить сообщение о...

Можно ли это оптимизировать?
Есть код .htaccess , выглядит немного страшновато... можно ли его оптимизировать. Основное назначение: 0. http->https реализован на...

Можно ли назвать выполнение алгоритмов искусственным интеллектом и как оптимизировать (не код!) это?
как и все хочу создать свой ИИ.но мой разум к сожалению ограничен.ни о каких нейронных сетях не может быть и слова. больше года изучаю...

помогите оптимизировать программу. Не проходит тест, из-за большого количества используемой памяти.
Пжл, помогите оптимизировать программу. Не проходит тест, из-за большого количества используемой памяти. Суть программы: Есть...

Авторизация не проходит
написал такой скрипт, только вот не пойму почему всегда срабатывает что "авторизация не прошла", хотя введенные данные в БД...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru