Форум сайта python.su
Запускаю програму, перехожу в форму авторизации нажимаю кнопку логин(после ввода данных) програма виснет. Как мне считать данные о пользователях?
con = cx_Oracle.connect('test/root@localhost')
cursor = con.cursor()
cursor.execute(“select user_name,user_password from users”)
counter = cursor.execute(“SELECT COUNT(*) FROM users”)
for i,n in cursor.fetchall():
if username == i:
if password == n:
QtGui.QMessageBox.information(self, ‘BOOYA!’, ‘Success!!’)
self.close()
self.mainw = Main()
self.mainw.show()
else:
QtGui.QMessageBox.warning(self, ‘Dang it!’, ‘Password incorrect…’)
return
Офлайн
Во первых, код надо постить на форумах в тегах code, иначе отступы пропадают и ваш код можно и не понять.
Во вторых, у вас ошибка - вы делаете два запроса одним и тем же курсором и после этого пытаетесь получить результат первого запроса,в то время как в курсоре лежит результат последнего запроса.
В третьих, вы в целом не правильно решаете задачу - зачем опрашивать ВСЕ записи о пользователях и паролях, что бы потом в цикле перебирать? Вам нужно сделать запрос в котором вы уже выберите пользователя, и потом проверять сходство пароля.
В четверых, держать пароли в базе в открытом виде это не безопасно, может это ваш домашний проект и это не столь играет роли, но на будущее помните. что современный стандарт это держать в базе “подсоленую” хэш сумму пароля
Офлайн
JOHN_16
Во первых, код надо постить на форумах в тегах code, иначе отступы пропадают и ваш код можно и не понять.Во вторых, у вас ошибка - вы делаете два запроса одним и тем же курсором и после этого пытаетесь получить результат первого запроса,в то время как в курсоре лежит результат последнего запроса.В третьих, вы в целом не правильно решаете задачу - зачем опрашивать ВСЕ записи о пользователях и паролях, что бы потом в цикле перебирать? Вам нужно сделать запрос в котором вы уже выберите пользователя, и потом проверять сходство пароля.В четверых, держать пароли в базе в открытом виде это не безопасно, может это ваш домашний проект и это не столь играет роли, но на будущее помните. что современный стандарт это держать в базе “подсоленую” хэш сумму пароля
con = cx_Oracle.connect('test/root@localhost')
cursor = con.cursor()
cursor.execute("select user_name,user_password from users")
for i,n in cursor.fetchall():
if username == i:
if password == n:
QtGui.QMessageBox.information(self, 'BOOYA!', 'Success!!')
self.close()
self.mainw = Main()
self.mainw.show()
else:
QtGui.QMessageBox.warning(self, 'Dang it!', 'Password incorrect...')
return
Вам нужно сделать запрос в котором вы уже выберите пользователя, и потом проверять сходство пароляА вот здесь можно поподробней, я не понял как выбирать.
Офлайн
примерно так:
cursor.execute(“select user_password from users WHERE user_name=?”, (username,) ) pw = cursor.fetchone() if pw and pw == n: ...
Офлайн
Спасибо. Может посоветуете что-то почитать? Желательно с примерами
Офлайн
brutalsuperman
По теме БД? В моем блоге найдите запись про Sqlite3, вам будет полезна. В остальном не подскажу ибо не осведомлен.
Офлайн
JOHN_16cursor.execute(“select user_password from users WHERE user_name=?”, (username,) )
pw = cursor.fetchone()
if pw and pw == n:
...
JOHN_16
По теме БД? В моем блоге найдите запись про Sqlite3, вам будет полезна. В остальном не подскажу ибо не осведомлен.
JOHN_16
По теме БД? В моем блоге найдите запись про Sqlite3, вам будет полезна. В остальном не подскажу ибо не осведомлен.
Офлайн
brutalsupermann из вашего примера, pw пароль из БД
А что за переменная n? И как я понял второй pw - пароль?
brutalsupermanИнтернет в помощь - офиц.документация и гугл. И да там на английском скорее всего все.
Меня больше интересует cx_oracle, так как работаю с Oracle, а mysql под запретом)
cx_Oracle.paramstyle
String constant stating the type of parameter marker formatting expected by the interface. Currently ‘named’ as in ‘where name = :name’.
Часть II. Запросы с параметрами.
——————————–
Согласно спецификации Python Database API 2.0, для выполнения запросов
с параметрами каждый модуль должен реализовывать переменную
paramstyle, которая определяет каким образом будут передаваться
параметры запросов. Текущая версия cx_Oracle(3.0) поддерживает режим
‘named’, то есть в модуле установлена переменная
cx_Oracle.paramstyle='named' и можно создавать конструкции в запросах
в виде:
select * from all_users where USERNAME LIKE :S
При этом связывание параметров запроса со значениями можно можно
выполнить двумя способами:
* Именованный параметeр метода execute:
cursor2.execute(“select * from all_users where USERNAME LIKE :S ”,S='S%')
* Словарь {':переменная':значение,…}
cursor2.execute(“select * from all_users where USERNAME LIKE :S ”,{':S':'S%'})
Офлайн
JOHN_16Спасибо, уже разобрался. Проблема была в том что считывало в поле ввода user11 а для сравнения с базы брало user11____ Подчеркивание ето пробелы.
Офлайн