ycwong99 Ответов: 1

Покажите сообщение об ошибке и предотвратите дублирование голосования


protected void LinkButton_Click(Object sender, EventArgs e)
        {

            String MyConnection2 = "Server=localhost;database=ovs;Uid=root;password=; Convert Zero Datetime=True";
            DateTime time = DateTime.Now;              // Use current time
            string format = "yyyy-MM-dd HH:mm:ss";
            string UserName4 = HttpContext.Current.User.Identity.Name;
            GridViewRow grdrow = (GridViewRow)((LinkButton)sender).NamingContainer;
            Label lblStudentId = (Label)grdrow.Cells[0].FindControl("lblID");
          Label lblvID = (Label)GridView2.Rows[0].FindControl("lblvID");
           string label1val = lblvID.Text;

            string studentId = lblStudentId.Text;
            //    string id =;
            //      string testing = this.Encrypt(id.Trim());
            String query = "insert into voting (CandidateStudentID,voterStudentID,DateTime)values ('" + lblStudentId.Text + "','" + Session["UserName"].ToString() + "','" + time.ToString(format) + "')";
           
            if (Session["UserName"].ToString().Equals(lblvID.Text))
            {

                Label1.Text = "You voted beofre";

            }
            else
            {
                MySqlConnection MyConn2 = new MySqlConnection(MyConnection2);
                MySqlCommand MyCommand2 = new MySqlCommand(query, MyConn2);
                MySqlDataReader MyReader2;
                MyConn2.Open();
                MyReader2 = MyCommand2.ExecuteReader();

                Label2.Text = "Thank you for You Vote";


            }


        }


<pre><asp:GridView ID="GridView2" runat="server"  AutoGenerateColumns="False" Font-Size="Medium">
              <Columns>
              <asp:TemplateField HeaderText="Student ID">
      <ItemTemplate>
         <asp:Label ID="lblvID" runat="server"   Width="150px"  Text='<%#Eval("voterStudentID") %>'/>
     </ItemTemplate>
 </asp:TemplateField>

              </Columns>
           </asp:GridView>


Что я уже пробовал:

Кнопка link принадлежит gridview 1.я получаю ошибку index out of range в окне
Label lblvID = (Label)GridView2.Rows[0].FindControl("lblvID");.

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Покажите сообщение об ошибке и предотвратите дублирование голосования

2 подхода:
- Сделайте выбор для студенческого билета, если результат является рекордным, студент уже проголосовал. Это может стать несчастливым, если студент попытается проголосовать одновременно на 2 компьютерах.
- Дизайн таблицы, чтобы иметь уникальный студенческий билет или первичный ключ, таким образом, сервер отклонит вставку. Чтобы узнать, как сработала вставка, проверьте ее результат.

String query = "insert into voting (CandidateStudentID,voterStudentID,DateTime)values ('" + lblStudentId.Text + "','" + Session["UserName"].ToString() + "','" + time.ToString(format) + "')";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]

[Обновление]
Цитата:
Я не могу выбрать studentID, потому что studentID покажет, что конкретный студент голосует за конкретного кандидата.

- Да, можешь. Вам просто нужно не запрашивать все поля таблицы, а просто запросить 1 поле, студенческий билет.


ycwong99

Я не могу выбрать studentID, потому что studentID покажет, что конкретный студент голосует за конкретного кандидата. У меня уже был первичный ключ-VoteID. Эта таблица связана с другой таблицей

ycwong99

Я понятия не имел, как не запрашивать все поля, не могли бы вы привести мне какой-нибудь пример, пожалуйста?

Patrice T

Совет: изучите SQL: инструкция SQL Select[^]

ycwong99

Прежде чем пользователь проголосует за кандидата, candidateId в таблице голосования будет пуст, я не могу соединить две таблицы вместе, потому что candidateId в таблице голосования пуст. Потому что, когда я присоединяюсь к двум таблицам, я использую candidateID в таблице голосования и candidate для присоединения

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

BillWoodruff

+5

Patrice T

Спасибо

ycwong99

Здравствуйте, я обновил вопрос