Количество значений запроса и поля назначения не совпадают. где проблема в коде? - PullRequest
0 голосов
/ 02 июня 2019

У меня есть страница регистрации, на которой вы отправляете страницу, но там написано: «Количество значений запроса и поля назначения не совпадают».Зачем???вот код:

                 string MySQL = "INSERT INTO users (email, pname, 
accountname, pid, age, passw) VALUES ('";
             MySQL = MySQL + Request.Form["email"] + "','";
             MySQL = MySQL + Request.Form["pname"] + "','";
             MySQL = MySQL + Request.Form["accountname"] + "','";
             MySQL = MySQL + Request.Form["pid"] + "','";
             MySQL = MySQL + Request.Form["age"] + "','";
             MySQL = MySQL + Request.Form["passw"] + "','";

             string strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data 
Source=" + 
System.Web.HttpContext.Current.Server.MapPath(@"DataBase\Users.accdb");
             System.Data.OleDb.OleDbConnection con = new 
System.Data.OleDb.OleDbConnection(strConnection);
             System.Data.OleDb.OleDbCommand cmd = new 
System.Data.OleDb.OleDbCommand(MySQL, con);

             con.Open();
             cmd.ExecuteNonQuery();
             con.Close();

1 Ответ

0 голосов
/ 02 июня 2019

В вашем запросе есть простая синтаксическая ошибка. Вы добавляете запятую после последнего значения и забываете закрыть оператор VALUES. Но это, хотя легко исправить, не является правильным способом построения оператора SQL.

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

 string MySQL = @"INSERT INTO users 
                (email, pname, accountname, pid, age, passw) 
                 VALUES(@email, @pname,@account,@pid, @age, @passw)";
 string strConnection = "......";
 using(OleDbConnection con = new OleDbConnection(strConnection))
 using(OleDbCommand cmd = new OleDbCommand(MySQL, con))
 {
     con.Open();
     cmd.Parameters.Add("@email", OleDbType.VarWChar).Value = Request.Form["email"];
     cmd.Parameters.Add("@pname", OleDbType.VarWChar).Value = Request.Form["pname"];
     cmd.Parameters.Add("@account", OleDbType.VarWChar).Value = Request.Form["accountname"];
     cmd.Parameters.Add("@pid", OleDbType.VarWChar).Value = Request.Form["pid"];
     cmd.Parameters.Add("@age", OleDbType.VarWChar).Value = Request.Form["age"];
     cmd.Parameters.Add("@passw", OleDbType.VarWChar).Value = Request.Form["passw"];
     cmd.ExecuteNonQuery();
 }

Теперь этот подход, хотя он кажется более многословным, намного яснее. Больше нет конкатенации кусочков строк с правильными кавычками вокруг этих значений. Больше никаких глупых синтаксических ошибок, и никто не сможет написать взлом SQL-кода для вашей базы данных, используя входные значения. См. Sql Injection

Есть еще одна проблема с точки зрения безопасности. У вас есть четкий пароль, хранящийся в базе данных, и это не считается хорошей практикой.
См. Лучший способ хранить пароли в базе данных

...