如何在ASP中执行按钮操作?

时间:2014-11-18 07:25:13

标签: asp-classic

我是ASP新手。我需要在点击提交按钮时使用ASP将值插入数据库。 怎么做我知道。

我的代码是:

      <%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
      <!--#include file="connection.asp"-->
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      <title>Form</title>

      </head>
      <form name="form1" id="form1" method="post" onsubmit="return validate()">
      <h3>FORM</h3>
      <table align="center" cellpadding = "10">
      <tr>
      <td>Name</td>
      <td><input type="text" name="uname" id="uname" /></td>
      </tr>

      <tr>
      <td>Mobile Number</td>
      <td><input type="text" name="umobile" id="umobile" maxlength="10" /></td>
      </tr>

      <tr>
      <td>Email Address</td>
      <td><input type="text" name="uemail" id="uemail" /></td>
      </tr>


      <tr>
      <td>Residing City
      <td><input type="text" name="rescity" id="rescity" /></td>
      </tr>

      <tr>
      <td colspan="2" align="center">
      <input type="submit" value="Submit">
      </td>
      </tr>

      </table>
      </form>
      <body>
      <%

      uname = request.Form("uname")
      umobile = request.Form("umobile")
      uemail = request.Form("uemail")
      city = request.Form("city")

      set rs = Server.CreateObject("ADODB.Recordset")
      Qry = "INSERT INTO enquirydetails([name],[mobile],[email],[residingcity]) values ('"&(uname)&"','"&(umobile)&"','"&(uemail)&"','"&(city)&"')"
       rs.OPEN Qry,Conn

       %>
      </body>
      </html>

如果我转到该页面,则使用此代码将值插入为空白。

请给我任何建议。

1 个答案:

答案 0 :(得分:2)

由于没有检查表单中的数据是否已提交,因此无论何时加载页面,都会运行插入新记录的代码。

通常,接近此方法的方法是检查长度Request.Form以查看是否已提交任何表单参数。这样的事情应该修复你的代码;

<%
If Len(Request.Form) > 0 Then
  uname = request.Form("uname")
  umobile = request.Form("umobile")
  uemail = request.Form("uemail")
  city = request.Form("city")

  set rs = Server.CreateObject("ADODB.Recordset")
  Qry = "INSERT INTO enquirydetails([name],[mobile],[email],[residingcity]) values ('"&(uname)&"','"&(umobile)&"','"&(uemail)&"','"&(city)&"')"
  rs.OPEN Qry,Conn
End If
%>

然而,仍有一个问题,那就是INSERT的方法。通过动态地将值直接分配给SQL字符串,您将使应用程序保持打开状态SQL Injection,这是针对Web应用程序的常见攻击,对数据库后端进行不安全的调用。

ADO提供了一个名为ADODB.Command的有用对象,通过构建参数化查询来帮助我们解决这个问题,这里有一个如何替换现有代码的示例;

<%
Dim cmd, sql

If Len(Request.Form) > 0 Then
  uname = request.Form("uname")
  umobile = request.Form("umobile")
  uemail = request.Form("uemail")
  city = request.Form("city")

  Set cmd = Server.CreateObject("ADODB.Command")
  sql = "INSERT INTO enquirydetails([name],[mobile],[email],[residingcity]) VALUES (?, ?, ?, ?)"
  With cmd
    .ActiveConnection = Conn 'Assuming this is your connection string
    .CommandType = adCmdText
    .CommandText = sql
    'Create Parameters and append them in order
    .Parameters.Append(.CreateParameter("@name", adVarWChar, adParamInput, 255))
    .Parameters.Append(.CreateParameter("@mobile", adVarWChar, adParamInput, 255))
    .Parameters.Append(.CreateParameter("@email", adVarWChar, adParamInput, 255))
    .Parameters.Append(.CreateParameter("@residingcity", adVarWChar, adParamInput, 255))
    'Assign values to the parameters
    .Parameters("@name").Value = uname
    .Parameters("@mobile").Value = umobile
    .Parameters("@email").Value = uemail
    .Parameters("@residingcity").Value = city
    .Execute()
  End With
  Set cmd = Nothing
End If
%>
  

注意:如果您对此代码有疑问,可能会使用命名常量(adCmdText等)来修复此问题,请参阅this article,其中介绍了如何使用命名常数。