首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP 動態 SQL 拼接錯誤:缺少 WHERE 關鍵字導致 FROM 子句語法錯誤

     編輯:程式設計綜合問答

錯誤現象

ASP 多條件查詢代碼運行報錯:「FROM 子句語法錯誤」。核心原因:動態拼接 SQL 時,首個條件前缺少 WHERE 關鍵字,導致生成的 SQL 類似 SELECT * FROM reader reader_id LIKE '...',語法無效。

錯誤代碼片段

sql = "select * from reader"
if action1 <> "" then
    sql = sql & " reader_id like '%" & action1 & "%' "  // 此處直接拼接條件,缺少 WHERE
    flag = 1
end if

修正方案

初始化 SQL 時包含 WHERE 1=1,後續條件統一用 AND 連接,邏輯清晰且避免判斷首條件:

sql = "SELECT * FROM reader WHERE 1=1 "
if action1 <> "" then
    sql = sql & " AND reader_id LIKE '%" & action1 & "%' "
end if
if action2 <> "" then
    sql = sql & " AND reader_name LIKE '%" & action2 & "%' "
end if
' ... 其餘條件同理

' 執行查詢
rs.open sql, conn, 1, 1

安全增強:參數化查詢防注入

字符串拼接極易導致 SQL 注入,強烈建議使用 ADODB.Command 參數化:

Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM reader WHERE 1=1 "
Dim params: params = ""

if action1 <> "" then
    cmd.CommandText = cmd.CommandText & " AND reader_id LIKE ? "
    cmd.Parameters.Append cmd.CreateParameter("p1", 200, 1, 50, "%" & action1 & "%")
end if
' ... 其他參數同理

Set rs = cmd.Execute()

代碼優化建議

  • 使用數組/字典存儲字段名與請求參數映射,循環構建 SQL,消除重複 if 塊。
  • 關閉記錄集前檢查 rs.State,釋放資源:If rs.State = 1 Then rs.Close。
  • 連接對象 conn 應在全局或包文件中打開,頁面卸載時關閉,避免頻繁建立連接。

總結

動態 SQL 拼接務必保證 WHERE 子句完整性,採用 WHERE 1=1 技巧簡化邏輯;生產環境必須使用參數化查詢防範注入攻擊。

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