Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572

Получение данных по id пользователя SQLite

26.08.2018, 16:45. Показов 2982. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли при авторизации записать данные пользователя в какую-нибудь область, чтобы эти данные стали доступны для всех форм. Например у меня три формы главная, где будут отображаться добавленная информация пользователя, регистрация и авторизация. При вводе логина и пароля форма авторизации закрывалась и происходила выборка из базы данных и по id пользователя отображалась вся информации на главной форме.
Вот код формы авторизации?
Delphi
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
unit enter;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SQLite3, SQLiteTable3;
 
type
  TForm3 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form3: TForm3;
  sldb:TSQLiteDatabase;
 
implementation
 
{$R *.dfm}
 
procedure TForm3.FormShow(Sender: TObject);
begin
sldb := TSQLiteDatabase.Create('frigat.db');
end;
 
procedure TForm3.Button1Click(Sender: TObject);
var sltb:TSQLiteTable;
begin
sltb := sldb.GetTable('select user_name, user_pass from accaunt where user_name="'+Edit1.Text+'" and user_pass="'+Edit2.Text+'"');
ShowMessage('Name='+sltb.FieldAsString(0)+' Password='+sltb.FieldAsString(1));
end;
 
end.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2018, 16:45
Ответы с готовыми решениями:

Получение связанных данных (свойство навигации) в SQLite
Первый опыт работы с SQLite и FW. Создал базу из двух таблиц Во второй (Rooms) Вторичный ключ по ID первой (Dormitories) ...

Получение данных из файла sqlite *.db в режиме он-лайн
по самому соединению с SQLite нашел много инфы, но хотелось бы уяснить ещё 1 момент Есть модем с симкой и собственным (видимо,...

Получение данных пользователя из БД
Добрый день при авторизации переход на страницы admin или user. Проблема что поле ROLE_ получаю null. Как из...

10
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
27.08.2018, 07:06
создайте модуль данных
всю работу с запросами унесите туда
впишите его в Uses всех форм
сделайте его первым в списке Project -- Forms -- Auto Create

Добавлено через 56 секунд
а остальные, кроме главной, оттуда уберите
https://www.cyberforum.ru/blog... g4873.html
0
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408
27.08.2018, 09:36
А почему используется FormShow, а не form create?
Создайте эти объекты которые "содержат инфу по пользователю" и показывайте если только авторизация прошла успешно в противном случае скрывайте.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
27.08.2018, 10:13
Лучший ответ Сообщение было отмечено Katerina1993 как решение

Решение

Как правильно сделать форму логина
1
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
30.08.2018, 18:56  [ТС]
Я попробовала ваши примеры, работают. Только вот как сделать в базе данных проверку на существования пользователя. Т.е. например пользователь вводит логин и пароль и вместо ошибки "Table is at End of File", выдавало сообщение, что "такого пользователя не существует"?

P.S. Я использую библиотеку SQLite.

Вот код:
Delphi
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
procedure TForm1.CheckLogin;
var
  f:TForm3;
  r:TModalResult;
  sltb:TSQLiteTable;
  id:Integer;
begin
  f:=TForm3.Create(NIL);
  try
    repeat
      r:=f.ShowModal;
      if r=mrOk then
      begin
        // придумаем функцию LoginCorrect() которая возвращает нам True или False
        // откуда она берет эти данные, из базы или файла или придумывает сама, нам все равно
 
 
        if LoginCorrect(f.Edit1.text, f.Edit2.text) then
          ShowMessage('Заполните поля логин и пароль')
        else
        begin
          sltb := sldb.GetTable('select id, user_name, user_pass from accaunt where user_name="'+f.Edit1.text+'" and user_pass="'+f.Edit2.text+'"');
          ShowMessage('Name='+sltb.FieldAsString(1)+' Password='+sltb.FieldAsString(2));
          id := sltb.FieldAsInteger(0);
          //Проверка на существование пользователя
        //  if(...)
        //  begin
         //    LoadData(id);
        //  end;
        end;
      end;
    until r=mrCancel;
    if r=mrCancel then
    begin
      ShowMessage('Отказ от авторизации. Программа завершает свою работу.');
      Application.Terminate();
      Abort;
    end;
  finally
    f.free;
  end;
end;
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
30.08.2018, 23:11
а что это такое строки 20 -- 30 ??

от вас требовалось просто придумать функцию LoginCorrect(login,pass:string):boolean;

для того, чтобы написать ее, требуется знать, что у вас за подключение, какая база, таблицы, поля...
гадаем на хрустальном шаре прямо из головы...
с использованием параметров и настроек программы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function TDatamodule1.LoginCorrect(login,pass:string):boolean;
begin
  query1.Sql.text := 'select id from accaunt where user_name=:user_name and user_pass=:user_pass';
  query1.Parameters.ParamByName('user_name').value := login;
  query1.Parameters.ParamByName('user_pass').value := pass;
  query1.open;
  result := not query1.eof;
  if result then
  begin
    Settings.UserId := query1.FieldByName('id').asinteger; 
    Settings.UserName := login;
    Settings.UserPass := pass;
  end;
  Query1.Close;
end;
P.S.
account !
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
31.08.2018, 00:41  [ТС]
для того, чтобы написать ее, требуется знать, что у вас за подключение, какая база, таблицы, поля...
База данных библиотека SQLite и дополнительные файлы подключения SQLiteTable3.pas, SQLite3.pas.

У меня форма ввода логина и пароля появляется, тогда когда я нажимаю соответсвующую кнопку авторизации.
Delphi
1
2
3
4
procedure TForm1.Button3Click(Sender: TObject);
begin
CheckLogin;
end;
Проверка логина и пароля.
Delphi
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
procedure TForm1.CheckLogin;
var
  f:TForm3;
  r:TModalResult;
  id:Integer;
begin
  f:=TForm3.Create(NIL);
  try
    repeat
      r:=f.ShowModal;
      if r=mrOk then
      begin
        // придумаем функцию LoginCorrect() которая возвращает нам True или False
        // откуда она берет эти данные, из базы или файла или придумывает сама, нам все равно
        if LoginCorrect(f.Edit1.text, f.Edit2.text) then
        begin
          ...
 
        end
        else
          ShowMessage('Неверный логин и пароль');
      end;
    until r=mrCancel;
    if r=mrCancel then
    begin
      ShowMessage('Отказ от авторизации. Программа завершает свою работу.');
      //f.Hide;
      //Application.Terminate();
      //Abort;
    end;
  finally
    f.free;
  end;
end;
 
function TForm1.LoginCorrect(login, pass: String): Boolean;
var sltb:TSQLiteTable;
begin
sltb := sldb.GetTable('select id, user_name, user_pass from accaunt where user_name="'+login+'" and user_pass="'+pass+'"');
result := not sltb.EOF;
if result then
  begin
    Form3.Close;
  end;
  sltb.Free;
end;
Нужно, чтобы при совпадении логина и пароля, форма авторизации сама закрывалась. Form3.Close в функции LoginCorrect не работает, как можно закрыть форму при удачной авторизации?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
31.08.2018, 06:37
вот когда перестанете использовать наименования Form1 Form2 Form3, тогда люди и начнут понимать, что вы имеете в виду
Чем вам не нравится
fMain, fLogin, fUserList
??

далее
100500 раз
успокойтесь и перестаньте распихивать код по простыням
если функция называется CheckLogin , она должна ПРОВЕРИТЬ login/pass и сообщить результат
ВСЕ!
закрывать формы и ходить за пивом она не должна

в коде, строка 7
Delphi
1
f:=TForm3.Create(NIL);
никакой переменной Form3 там нет!
создается форма логина, у пользователя забираем две строки
и передаем в функцию CheckLogin
если вам нужно хранить ID, то внутри функции можно его, как я предлагал в предыдущем посте, записать в к-нить глобальную переменную.
после этого в любом случае эта форма закрывается и разрушается в строке 32,
Delphi
1
2
3
finally
    f.free;
end;
поэтому что-то делать еще с этой формой не требуется

строки 41-44 лишние

ваша проблема, что вы не можете описать, что вы хотите, чтобы происходило при нажатии на кнопку
сейчас там CheckLogin
после! CheckLogin вы должны продолжить логику, исходя из результатов CheckLogin
у вас либо появился UserId либо он 0 (опять смотрим #6 и статью про настройки программы)
вот от этого и отталкивайтесь
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
31.08.2018, 18:13  [ТС]
А закрыть форму всё таки как? Она у меня появляется когда я нажимаю кнопку авторизации, потом ввожу логин и пароль и при нажатии кнопки ok, она просто мигает и остается открытой. (Пробовала и f.Close() и f.Hide(), не работает). Вот скриншот формы.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
31.08.2018, 21:56
прикрепите проект
вы видите на картинке надпись Form3 ?
или стрелку - "вот эту форму надо закрыть" --> ?
и список автосоздаваемых форм из dpr файла ?
вот и я нет
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
02.09.2018, 19:29  [ТС]
Break забыла поставить в нужном месте, теперь работает (ссылка четвертого поста "Как правильно сделать форму логина", там есть break). P.S. копи-паст не всегда хорошо делать.
Delphi
1
2
3
4
5
6
7
8
9
10
if r=mrOk then
      begin
        if LoginCorrect(f.Edit1.text, f.Edit2.text) then
        begin
           login:=f.Edit1.Text;
           password:=f.Edit2.Text;
           break;
        end
        else
          ShowMessage('Неверный логин пароль');
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2018, 19:29
Помогаю со студенческими работами здесь

Получение данных от пользователя через форму
Добрый день, я только начала изучать django и есть одно задание которое не могу сделать сама. Надеюсь на вашу помощь или подсказку как это...

Взаимодействие пользователя с embed видео. Получение данных
Здравствуйте, уважаемые гуру web кодинга! Начал изучать создания сайта... пока что вроде проблем особых с изучением нет, все довольно...

Получение достоверных данных от пользователя (версию браузера, ip адрес)
Можно ли гарантированно получить некоторые заведомо известные данные от пользователя. То есть хочу получить версию браузера, ip адрес...

Сделать недоступным для ввода пользователя UserControl, при этом отображая анимацию, что идёт получение данных
Подскажите, народ. Есть мысль использовать AdornerLayer. Может у кого мысли есть какие, как это лучше вооще сделать на практике? Суть в...

Получение коллекции из бд sqlite
Доброго времени суток. Есть класс бд: package ru.myscanner.scannerth; import android.content.ContentValues; import...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru