首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

從 HTML 表單動態構建 SQL INSERT 語句實戰(ASP/VBScript)

     編輯:DB2 教學

場景

Web 頁面收集用戶輸入(名、姓、年齡),服務端需動態生成 INSERT 語句寫入數據庫。本文展示一個健壯的 buildSQLInsert 函數,自動處理字段名映射、數據類型推斷、NULL 值與字符串轉義。

表單示例

<form method="post">
  First Name: <input name="fName"><br>
  Last Name: <input name="lName"><br>
  Age: <input name="age"><br>
  <input type="submit">
</form>

核心函數:buildSQLInsert

<%
Function buildSQLInsert(targetTable, omitFields)
    Dim iStr, vStr, nStr, x, fieldName, fieldData, typeDelimPos
    iStr = "INSERT INTO " & targetTable & " "
    vStr = "VALUES ("
    nStr = "("

    For Each x In Request.Form
        fieldName = UCase(x)
        ' 跳過排除字段
        If InStr(UCase(omitFields), fieldName) = 0 Then
            fieldData = Replace(Request.Form(fieldName), "'", "''")
            If Trim(fieldData) = "" Then
                fieldData = "NULL"
                vStr = vStr & fieldData & ", "
                nStr = nStr & fieldName & ", "
            Else
                typeDelimPos = InStr(fieldName, "_")
                If typeDelimPos = 0 Then
                    ' 約定:字段名含 "_" 後綴標識類型,如 "age_int"
                    ' 無後綴視為文本
                    nStr = nStr & fieldName & ", "
                    vStr = vStr & "'" & fieldData & "', "
                Else
                    ' 解析類型後綴
                    Dim typeSuffix
                    typeSuffix = Mid(fieldName, typeDelimPos + 1)
                    Select Case LCase(typeSuffix)
                        Case "int", "number"
                            vStr = vStr & fieldData & ", "
                        Case "date"
                            vStr = vStr & "#" & fieldData & "#, "
                        Case "bool", "bit"
                            vStr = vStr & IIf(fieldData = "on", 1, 0) & ", "
                        Case Else
                            vStr = vStr & "'" & fieldData & "', "
                    End Select
                    nStr = nStr & Left(fieldName, typeDelimPos - 1) & ", "
                End If
            End If
        End If
    Next

    ' 移除尾部逗號並閉合
    If Right(nStr, 2) = ", " Then nStr = Left(nStr, Len(nStr) - 2)
    If Right(vStr, 2) = ", " Then vStr = Left(vStr, Len(vStr) - 2)
    nStr = nStr & ")"
    vStr = vStr & ")"

    buildSQLInsert = iStr & nStr & " " & vStr
End Function
%>

調用示例

<%
Dim sql
sql = buildSQLInsert("Users", "submit|btn")  ' 排除提交按鈕等非數據字段
Response.Write sql
' 輸出範例:INSERT INTO Users (FNAME, LNAME, AGE) VALUES ('John', 'Doe', 30)
%>

關鍵設計點

  • 字段名約定:用 字段名_類型 形式(如 age_int、birth_date)隱式聲明類型,避免硬編碼。
  • 自動 NULL 處理:空輸入轉為 SQL NULL 而非空字符串。
  • 防注入基礎:單引號雙寫轉義(生產環境請改用參數化查詢)。
  • 靈活排除:omitFields 參數支持管道分隔多字段排除。

安全警示

動態拼接 SQL 存在注入風險。生產系統必須改用參數化查詢(Command.Parameters)或 ORM 框架。本函數僅供教學、原型或受控內網環境參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved