如何在另一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
相关产品推荐
相关产品推荐

