Здравствуйте! Сегодня: Ср, 21 Окт 2020, Ваш IP: 3.228.10.64 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Web-программирование
+ Создать новую тему Страница: 1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 · 9 · 10 · > · >> · [17]
Тема: Web · +  +    в избранномx2 дата добавления: 18.10.2013 / 20:29
Автор темы:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


Как сделать форму регистрации а точнее сам функционал? на чем?
Технологии: ASP .NET, Visual Basic .NET
--
Du Main Du BA DU
 
Ответ # 101 # · +  +  дата добавления: 28.10.2013 / 11:03
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Page.IsValid = False Then Return
        Dim result As Object
        Dim log As Boolean
        Dim myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
        myConn.Open()
        Dim myCmd As New SqlCommand()
        myCmd.Connection = myConn
        myCmd.CommandText = "SELECT users.[user_name] FROM users WHERE [user_name] = @user_login OR email = @user_email"
        myCmd.Parameters.Add("@user_login", SqlDbType.NVarChar).Value = TextBox2.Text
        myCmd.Parameters.Add("@user_email", SqlDbType.NVarChar).Value = TextBox3.Text
        result = myCmd.ExecuteScalar()
        If myCmd.ExecuteScalar() Is Nothing Then
            log = False
        Else
            log = True
        End If

        If log = True Then
            Label1.Text = "Пользователь с таким Логином или @mail'ом уже существует."
        ElseIf log = False Then
            myCmd = New SqlCommand()
            myCmd.Connection = myConn
            myCmd.CommandText = "INSERT INTO users ([user_name], email, [user_login], ip, [user_pass]) VALUES (@user_name, @email, @user_login, @ip, @user_pass)"
            myCmd.Parameters.Add("@user_name", SqlDbType.NVarChar).Value = TextBox1.Text
            myCmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = TextBox3.Text
            myCmd.Parameters.Add("@user_login", SqlDbType.NVarChar).Value = TextBox2.Text
            myCmd.Parameters.Add("@ip", SqlDbType.VarChar).Value = Request.UserHostAddress
            myCmd.Parameters.Add("@user_pass", SqlDbType.NVarChar).Value = TextBox4.Text
        End If
    End Sub
Вот такой код сойдет?:)
--
Du Main Du BA DU
 
Ответ # 102 # · +  +  дата добавления: 28.10.2013 / 12:24
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


В целом, сойдет.

Из несущественных замечаний:

1. SELECT users.[user_name] FROM - у тебя в запросе одна таблица, писать имя таблицы в имени поля не обязательно. Явно указание пути к полю стоит писать, если в запросе несколько таблиц и в них есть поля с одинаковыми именами.

2. 12 строка - лишняя, т.к. запрос выполняется в 13 строке и переменная result вообще не нужна. Сейчас получается, что у тебя делается два одинаковых запроса.

3.
If log = True Then
ElseIf log = False Then

ElseIf не нужно в данном случае делать, ибо и если log = True, то кроме как False эта переменная больше не может иметь никаких значений. Достаточно указать Else, что будет означать - log имеет любое другое значение, не попавшее под верхние условия, т.е. в данном случае это будет False.

4. Посмотри, условия в 13 строке и в 19 логически одинаковые, т.е. можно обойтись без переменной log и сделать все в одном условии.

5. user_login и user_pass - вроде не являются ключевыми словами, можно без квадратных скобок писать (но это не критично). Определить, является имя ключевым словом, можно просто открыв редактор запросов в SQL Server и написав туда слово. Если слово подсветится розовым, значит оно зарезервировано (ключевое).


6. Пароли в базе в голом виде лучше не хранить. Но на первый раз можно. А вообще, лучше хранить в базе хеш-сумму паролей, а не сами пароли. Например md5 или sha1.

7. ВАЖНО Ты не закрываешь соединение с базой: myConn.Close(). В реальных условиях это привидет к быстрому истощения лимита подключений и сайт больше не сможет некоторые время работать с базой. Необходимо всегда закрывать соединение с базой, когда она перестает быть нужной.

7.5. ВАЖНО Только сейчас заметил, что ты написал запрос добавления пользователя, но не написал код его выполнения: myCmd.ExecuteNonQuery()

8. Не хватает блока Try Catch. Работа с базой - потенциально может привести к ошибке, нужно выполнять весь код работы с бд в блоке Try Catch, чтобы страница не упала.
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If Page.IsValid = False Then Return
    Dim myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
Try
 'безопасный блок выполнения кода
    myConn.Open()
    Dim myCmd As New SqlCommand()
    myCmd.Connection = myConn
    myCmd.CommandText = "SELECT [user_name] FROM users WHERE [user_name] = @user_login OR email = @user_email"
    myCmd.Parameters.Add("@user_login", SqlDbType.NVarChar).Value = TextBox2.Text
    myCmd.Parameters.Add("@user_email", SqlDbType.NVarChar).Value = TextBox3.Text
    If myCmd.ExecuteScalar() Is Nothing Then
        Label1.Text = "Пользователь с таким Логином или @mail'ом уже существует."
    Else
        myCmd = New SqlCommand()
        myCmd.Connection = myConn
        myCmd.CommandText = "INSERT INTO users ([user_name], email, [user_login], ip, [user_pass]) VALUES (@user_name, @email, @user_login, @ip, @user_pass)"
        myCmd.Parameters.Add("@user_name", SqlDbType.NVarChar).Value = TextBox1.Text
        myCmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = TextBox3.Text
        myCmd.Parameters.Add("@user_login", SqlDbType.NVarChar).Value = TextBox2.Text
        myCmd.Parameters.Add("@ip", SqlDbType.VarChar).Value = Request.UserHostAddress
        myCmd.Parameters.Add("@user_pass", SqlDbType.NVarChar).Value = TextBox4.Text
        myCmd.ExecuteNonQuery()
    End If
Catch ex As Exception
  'здесь получаем данные ошибки
  Label1.Text = "Ошибка. " & ex.Message
Finally
  'этот блок будет выполнен и при успешном выполнении кода и при ошибке
  If myConn.State = ConnectionState.Open Then myConn.Close() 'если соединение с базой открыто, закрываем
End Try
End Sub
 
Ответ # 103 # · +  +  дата добавления: 28.10.2013 / 19:17
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


Так?
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
        Try
            If Page.IsValid = False Then Return
            Dim log As Boolean
            myConn.Open()
            Dim myCmd As New SqlCommand()
            myCmd.Connection = myConn
            myCmd.CommandText = "SELECT [user_name] FROM users WHERE [user_name] = @user_login OR email = @user_email"
            myCmd.Parameters.Add("@user_login", SqlDbType.NVarChar).Value = TextBox2.Text
            myCmd.Parameters.Add("@user_email", SqlDbType.NVarChar).Value = TextBox3.Text
            log = myCmd.ExecuteScalar() Is Nothing
            If log Then
                Label1.Text = "Пользователь с таким Логином или @mail'ом уже существует."
            Else
                myCmd = New SqlCommand()
                myCmd.Connection = myConn
                myCmd.CommandText = "INSERT INTO users ([user_name], email, [user_login], ip, [user_pass]) VALUES (@user_name, @email, @user_login, @ip, @user_pass)"
                myCmd.Parameters.Add("@user_name", SqlDbType.NVarChar).Value = TextBox1.Text
                myCmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = TextBox3.Text
                myCmd.Parameters.Add("@user_login", SqlDbType.NVarChar).Value = TextBox2.Text
                myCmd.Parameters.Add("@ip", SqlDbType.VarChar).Value = Request.UserHostAddress
                myCmd.Parameters.Add("@user_pass", SqlDbType.NVarChar).Value = TextBox4.Text
            End If
        Catch ex As Exception
            Label1.Text = ("Ошибка: " & ex.Message)
        End Try
        myConn.Close()
    End Sub
--
Du Main Du BA DU
 
Ответ # 104 # · +  +  дата добавления: 28.10.2013 / 20:09
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Если соединение будет закрыто, то при его закрытии произойдет ошибка. Нужно проверять, открыто оно или нет:
If myConn.State = ConnectionState.Open Then myConn.Close()

If Page.IsValid = False Then Return - это в самом начале нужно делать, а то может получится, что ты в пустую сделаешь SqlConnection. Это условие по идее не должно приводить к возникновению ошибок, если стоит в начале, до другого кода.

Ну и пункт 7.5 все еще отсутствует, пользователь не будет добавлен в базу.
 
Ответ # 105 # · +  +  дата добавления: 28.10.2013 / 20:40
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


myCmd.ExecuteNonQuery() что это вообще такое и где это должно быть??
--
Du Main Du BA DU
 
Ответ # 106 # · +  +  дата добавления: 28.10.2013 / 21:40
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Не имею представления

Я уже раз пять об этом писал, смотри предыдущие ответы, там и картинки есть.
 
Ответ # 107 # · +  +  дата добавления: 29.10.2013 / 08:25
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


ExecuteNonQuery - выполнить команду и ничего не возвращать. Это как Sub в Visual Basic.
ExecuteNonQuery - обычно используется для инструкций UPDATE и DELETE.

Вот нашел...
А юзать как?
--
Du Main Du BA DU
 
Ответ # 108 # · +  +  дата добавления: 29.10.2013 / 08:31
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


                myCmd = New SqlCommand()
                myCmd.Connection = myConn
                myCmd.CommandText = "INSERT INTO users ([user_name], email, [user_login], ip, [user_pass]) VALUES (@user_name, @email, @user_login, @ip, @user_pass)"
                myCmd.Parameters.Add("@user_name", SqlDbType.NVarChar).Value = TextBox1.Text
                myCmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = TextBox3.Text
                myCmd.Parameters.Add("@user_login", SqlDbType.NVarChar).Value = TextBox2.Text
                myCmd.Parameters.Add("@ip", SqlDbType.VarChar).Value = Request.UserHostAddress
                myCmd.Parameters.Add("@user_pass", SqlDbType.NVarChar).Value = TextBox4.Text
                myCmd.ExecuteNonQuery()
Вот так?
--
Du Main Du BA DU
 
Ответ # 109 # · +  +  дата добавления: 29.10.2013 / 08:36
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


Вы же сказали что он только для DELETE и UPDATE а я ведь добавляю нового пользователя а не изменяю старого
UPDATE имя_таблицы SET имя_поля = значение [WHERE критерий]
--
Du Main Du BA DU
 
Ответ # 110 # · +  +  дата добавления: 29.10.2013 / 08:40
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


А как сбросить счетчик в таблице?
--
Du Main Du BA DU
 
Ответ # 111 # · +  +  дата добавления: 29.10.2013 / 11:52
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Crash666:
Вот так?
Да.

Crash666:
Вы же сказали что он только для DELETE и UPDATE а я ведь добавляю нового пользователя а не изменяю старого
http://kbyte.ru/ru/Forums/Single.aspx?id=15618:
ExecuteNonQuery - обычно используется для инструкций UPDATE и DELETE.
Ключевое слово "обычно", а так-та для любого запроса можно использовать. Только смысла в этом нет.
Например, можно без проблем выполнить запрос SELECT * FROM методом ExecuteNonQuery, но если метод ничего не возвращает, то нет никакого смысла выполнять такой запрос этим методом.

У тебя еще не возник вопрос, при котором потребуется использовать ExecuteScalar при добавлении данных (INSERT INTO). Когда возникнет, тогда и поменяешь, все равно придется немного логику корректировать.

Crash666:
А как сбросить счетчик в таблице?
Запросом:
DBCC CHECKIDENT (имя_таблицы, RESEED, 0)
(через SQL Server Management)

 
Ответ # 112 # · +  +  дата добавления: 29.10.2013 / 19:40
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


А как закрепить надпись copyright по центру и отступ снизу?
--
Du Main Du BA DU
 
Ответ # 113 # · +  +  дата добавления: 29.10.2013 / 20:03
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


закрепить надпись copyright по центру
Через CSS:
text-align:center;

Например, можно использовать <div />:
<div style="text-align:center">Copyright (c) ....</div>
отступ снизу
Отступы в CSS - это margin-bottom (снаружи) или padding-bottom (внутри)
(bottom - снизу, есть еще top, left и right).

Ну или <br /> понаставить.
 
Ответ # 114 # · +  +  дата добавления: 29.10.2013 / 20:24
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


А что то на подобии float только для bottom и top?
--
Du Main Du BA DU
 
Ответ # 115 # · +  +  дата добавления: 29.10.2013 / 20:35
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


float для низа и верха - нет. Это даже как-то сложно представить, в плане логики.
Высота - понятие растяжимое и крайне нестабильное.

Закрепить блок можно при помощи position:fixed. С кросс-браузерностью наверняка придется повозиться.
position:fixed; 
left: 0; 
bottom: 0;
width: 100%;
height:50px;
background-color:red;
 
Ответ # 116 # · +  +  дата добавления: 09.11.2013 / 23:43
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


If Session("UserId") Is Nothing Then
  'это гость
Else
  'это пользователь
End If
чем тут является UserId? где его взять?
--
Du Main Du BA DU
 
Ответ # 117 # · +  +  дата добавления: 10.11.2013 / 13:29
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


UserId - это просто ключ, как переменная, имя и цели использования могут быть любыми.

В данном случае, ключ сессии UserId мог бы содержать идентификатор пользователя из таблицы users, поле id_users (если конечно, ты следовал рекомендациям по именованию полей). Но механизм определения автоизированности пользователя может быть любым, какой захочешь (придумаешь). Это просто один из вариантов. Session тут будет мало, еще куки нужно будет использовать.
 
Ответ # 118 # · +  +  дата добавления: 13.11.2013 / 11:44
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


Сейчас искал кое что и увидел это
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
Вроде в html5 можно ведь как я писал?:)
<meta charset="utf-8">
--
Du Main Du BA DU
 
Ответ # 119 # · +  +  дата добавления: 13.11.2013 / 12:17
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Проблема в браузерах может быть. Старые браузеры не поддерживают такой вариант и могут ошибиться с определением кодировки.
Поэтому, ближайшие лет пять, лучше писать в полном формате :)

Хотя в ASP .NET информация о кодировке (по умолчанию) есть в HTTP-заголовках, так что можно не писать <meta />.
Но лучше всегда писать явно, чтобы это стало привычкой. Поможет избежать проблем при работе с другими технологиями и типами серверов, минимизировать зависимость от конфигураций серверов.
 
Ответ # 120 # · +  +  дата добавления: 15.11.2013 / 10:55
Автор ответа:
JustArt
JustArt
тем: 95 / ответов: 675 / благодарностей: 3 / репутация: 35
Url: crash.kbyte.ru
Skype: ghostman12.12.2012
ответов: 675
создал(а) тем: 95


Алексей я думаю вы помните мой шаблон:). У меня только один contenplacehold в центре но сверху вместо зарегестрироваться и войти должна быть дата поле авторизации мне снова переделывать .master файл?? и ставить туда 2 contenpalcehold?
--
Du Main Du BA DU
 
Страница: 1 · 2 · 3 · 4 · 5 · 6 · 7 · 8 · 9 · 10 · > · >> · [17] + Создать новую тему