You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在另一JSP的<sql:query>标签中使用表单值?遇SQL错误求解

问题解决:SQL语句无法识别表单输入值,报Unknown column错误

错误原因

看错误日志里生成的SQL:

SELECT SOURCE AS source FROM flyaway.flightdetails WHERE source= Delhi;

这里的Delhi没有被单引号包裹,MySQL会将其识别为列名而非字符串值,所以抛出Unknown column 'Delhi' in 'where clause'错误。另外,你直接用<%=source %>拼接SQL的写法存在严重的SQL注入风险,攻击者可以通过构造恶意输入破坏数据库,绝对不能使用。

正确解决方案(推荐)

使用JSTL的<sql:param>进行参数绑定,这是JSP中操作数据库的规范写法,既解决字符串引号问题,又能避免SQL注入:

<sql:setDataSource
        var="myDB"
        driver="com.mysql.cj.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/flyaway?useSSL=false"
        user="root" password="1Leanest!"/>

<sql:query var="listItems" dataSource="${myDB}">
    SELECT * FROM flyaway.flightdetails
    WHERE SOURCE = ?;
    <!-- 用EL表达式直接获取表单参数,自动处理字符串引号 -->
    <sql:param value="${param.source}"/>
</sql:query>

说明

  • 用?作为SQL中的参数占位符,<sql:param>会自动将传入的字符串值包裹单引号,同时对特殊字符进行转义
  • 无需通过脚本片段获取request.getParameter,直接用EL表达式${param.source}即可获取表单提交的source参数值

不推荐的临时写法(仅作对比)

如果你非要用脚本片段拼接SQL(强烈不建议),必须手动为字符串添加单引号,但这种写法完全无法抵御SQL注入:

<sql:setDataSource
        var="myDB"
        driver="com.mysql.cj.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/flyaway?useSSL=false"
        user="root" password="1Leanest!"/>
<%
 String source = request.getParameter("source");
%>
<sql:query var="listItems" dataSource="${myDB}">
    SELECT * FROM flyaway.flightdetails
    WHERE SOURCE = '<%=source %>'; 
</sql:query>

内容的提问来源于stack exchange,提问作者Vishnu Gautam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:40:37