简单的问题,但这引起了很多麻烦 我使用asp将数据插入数据库,代码看起来对我和我的同行,但它不起作用!这是我的asp和我的html表单:
ASP:
if request.form("submitbutton") <> "" then
set conn=Server.CreateObject("ADODB.Connection")
conn.Open ="Driver={SQL Server}; Server=//private; Database=QuizDynamics; Uid=QuizDynamics; Pwd=//private
set rs=Server.CreateObject("ADODB.recordset")
rs.Open "Select * from Teachers", conn
sql="INSERT INTO Teachers (firstname, password, lastname)"
sql=sql & " VALUES "
sql=sql & "('" & Request.Form("firstname") & "',"
sql=sql & "'" & Request.Form("password") & "',"
sql=sql & "'" & Request.Form("lastname") & "')"
on error resume next
conn.Execute sql,recaffected
if err<>0 then
Response.Write("No update permissions!")
else
Response.Write("<h3>" & recaffected & " record added</h3>")
end if
conn.close
end if
%>
html表格:
<form name="teacherReg" action="Registration.asp" method="POST">
1. First name:<br/><input type="text" name="firstname"><br/><br/>
2. Last name:<br/><input type="text" name="lastname"><br/><br/>
3. Desired Username :<br/><input type="text" name="username"><br/><br/>
4. Desired Password :<br/><input type="password" name="password"><br/>
5. Confirm Password :<br/><input type="password" name="confirmpassword"><br/>
<input type="submit" value="submit">
</form>
(我现在只插入名字,密码和姓氏用于测试目的)
答案 0 :(得分:1)
问题#1。
您没有控件“submitbutton”。 改变
<input type="submit" value="submit">
到
<input type="submit" value="submit" name="submitbutton">
我还建议您查看请求方法:
If (Request.ServerVariables ("REQUEST_METHOD") = "POST") Then
..... bla bla bla .....
答案 1 :(得分:1)
在匈牙利语中有一个成语:在两把椅子之间进行选择,你最终会在场上。 :)
你有一些代码正在将整个表(所有无数行和多列 - 我们正在讨论的可能是大量数据)加载到记录集中,但是你永远不会对它做任何事情。然后你有一个Execute语句,你要附加一个“recaffected”变量,据我所知,该变量没有值。因此,您告诉Execute语句将更改应用于零记录。然后,关闭连接,但永远不要关闭记录集。
如果你想通过打开一个记录集来插入(不是推荐的方法,但有时它更容易,特别是如果你将数据插入到几十列中),你可以这样做:
If Request.Form("submitbutton") <> "" Then
firstname = Request.Form("firstname")
lastname = Request.Form("lastname")
password = Request.Form("password")
'- add code here to validate firstname, lastname, password
Set conn = Server.Createobject("ADODB.Connection")
conn.Open "Driver={SQL Server};Server=//private;Database=QuizDynamics;Uid=QuizDynamics;Pwd=//private"
Set rs = Server.Createobject("ADODB.Recordset")
sql = "SELECT TOP 0 * FROM Teachers"
rs.Open SQL,Conn
rs.AddNew
rs("firstname") = firstname
rs("lastname") = lastname
rs("password") = password
rs.Update
rs.Close
Set rs = Nothing
conn.close
Set conn = Nothing
End If
(请注意记录集上有一个TOP 0 - 如果您正在做的只是添加新行,则不需要加载任何行。您也可以执行类似"SELECT * FROM Teachers WHERE 1 = 2"
的操作。)
如果要通过Execute语句执行此操作,则根本不需要记录集。另外,如果您要告诉Execute应用更改的行数,请确保告诉它正确的数字,但最好不要告诉它任何内容。
If Request.Form("submitbutton") <> "" Then
firstname = Request.Form("firstname")
lastname = Request.Form("lastname")
password = Request.Form("password")
'- add code here to validate firstname, lastname, password
Set conn = Server.Createobject("ADODB.Connection")
conn.Open "Driver={SQL Server};Server=//private;Database=QuizDynamics;Uid=QuizDynamics;Pwd=//private"
sql = "INSERT INTO Teachers (firstname, password, lastname) VALUES "
sql = sql & "('" & firstname & "','" & password & "','" & lastname & "')"
conn.Execute sql
conn.close
Set conn = Nothing
End If
答案 2 :(得分:0)
我认为你和你的同行需要重新评估编程的基础知识。这段代码可能是我见过的最令人困惑的事情。
这是在呼唤:
rs.Open "Select * from Teachers", conn
我不知道为什么。 它试图......
这里的逻辑根本不清楚,无论哪种方式,都缺少一些东西。
此外,代码有几个问题,如果不是全部的话:
使用Request.ServerVariables("REQUEST_METHOD")
检查表单是否已发布,如Zam建议的那样。一切都有用,所以应该尽可能使用。
始终对表单进行服务器端验证(尤其是密码/确认密码表单!)。如果您只进行客户端验证,则可以在浏览器上禁用Javascript,这意味着如果在没有javascript的情况下提交,您的表单将无法进行验证。
同样,很难看到你尝试使用该记录集语句做什么,但是除非你真的需要,否则永远不要遍历记录集来在asp中进行插入。而是为此做一个SQL语句。它会更多更快。您可以在W3Schools
如果您尝试验证数据库连接字符串/密码,那么您应首先执行该部分,然后进入您写入数据库的部分。应谨慎使用ON ERROR RESUME NEXT
,你永远不知道什么时候应该看到错误。
您没有针对SQL注入的验证。此漏洞可能非常容易损害整个数据库。您可以在Microsoft.com上的此链接中找到更多信息,以及如何阻止它
,但在大多数情况下,对于SQL Server,您希望确保所有'
(单引号)都被转义,将它们加倍''
,使用IsNumeric()
验证所有数字(id),等等。在将它们发送到SQL Server之前。换句话说,对sql语句中提交的值使用Replace(sData,"'","''")
。切勿将表名等仅注入SQL语句中。
Adodb.Recordset
执行插入/删除/更新语句。使用Adodb.Command
。再一次,这就是它的用途。这实际上总结了我,也许我错过了一些东西。但是,为什么你的代码不起作用可能有很多原因,如果你能让自己更清楚一点,为什么你把Recordset
对象调到最顶层,我会提供更多帮助。