ADO / SQL插入数据库问题

时间:2014-01-10 09:52:24

标签: html sql database asp-classic ado

简单的问题,但这引起了很多麻烦 我使用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>

(我现在只插入名字,密码和姓氏用于测试目的)

3 个答案:

答案 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

我不知道为什么。 它试图......

  1. 在允许某人拥有有效的数据库连接凭据,然后才允许他们写入数据库?
  2. 循环播放并插入表单中提交的值,供您在循环中的所有教师使用?
  3. 这里的逻辑根本不清楚,无论哪种方式,都缺少一些东西。


    此外,代码有几个问题,如果不是全部的话:

    1. 使用Request.ServerVariables("REQUEST_METHOD")检查表单是否已发布,如Zam建议的那样。一切都有用,所以应该尽可能使用。

    2. 始终对表单进行服务器端验证(尤其是密码/确认密码表单!)。如果您只进行客户端验证,则可以在浏览器上禁用Javascript,这意味着如果在没有javascript的情况下提交,您的表单将无法进行验证。

    3. 同样,很难看到你尝试使用该记录集语句做什么,但是除非你真的需要,否则永远不要遍历记录集来在asp中进行插入。而是为此做一个SQL语句。它会更多更快。您可以在W3Schools

    4. 上查看示例
    5. 如果您尝试验证数据库连接字符串/密码,那么您应首先执行该部分,然后进入您写入数据库的部分。应谨慎使用ON ERROR RESUME NEXT,你永远不知道什么时候应该看到错误。

    6. 您没有针对SQL注入的验证。此漏洞可能非常容易损害整个数据库。您可以在Microsoft.com上的此链接中找到更多信息,以及如何阻止它 ,但在大多数情况下,对于SQL Server,您希望确保所有'(单引号)都被转义,将它们加倍'',使用IsNumeric()验证所有数字(id),等等。在将它们发送到SQL Server之前。换句话说,对sql语句中提交的值使用Replace(sData,"'","''")。切勿将表名等仅注入SQL语句中。

    7. 切勿使用Adodb.Recordset执行插入/删除/更新语句。使用Adodb.Command。再一次,这就是它的用途。

    8. 这实际上总结了我,也许我错过了一些东西。但是,为什么你的代码不起作用可能有很多原因,如果你能让自己更清楚一点,为什么你把Recordset对象调到最顶层,我会提供更多帮助。