对,我有一个名为“ Person”的SQL表,具有以下属性
"SV_NR"
"VORNAME"
"NACHNAME"
"POSTLEITZAHL"
"ORT"
"STRASSE"
"HAUSNUMMER"
(它是德语,不用担心)
现在,我正在创建.jsp,应该在此表中创建一个新条目。看起来像这样:
> <form method="post" action="person_anlegen.jsp" style="display:
> inline-block"> <input type="hidden" name="menu"
> value="person_anlegen" /> <table class="table table-striped">
> <tbody>
> <tr><td>SVNr.</td><td><input name="svnr" value="${param.svnr}" /></td></tr>
> <tr><td>Vorname</td><td><input name="vorname" value="${param.vorname}" /></td></tr>
> <tr><td>Nachname</td><td><input name="nachname" value="${param.nachname}" /></td></tr>
> <tr><td>Postleitzahl</td><td><input name="postleitzahl" value="${param.plz}" /></td></tr>
> <tr><td>Ort</td><td><input name="ort" value="${param.ort}" /></td></tr>
> <tr><td>Strasse</td><td><input name="strasse" value="${param.strasse}" /></td></tr>
> <tr><td>Hausnummer</td><td><input name="hausnummer" value="${param.hausnummer}" /></td></tr> </tbody> </table> <button
> type="submit" class="btn btn-primary" style="float: right">
> <span class="glyphicon glyphicon-search"></span> Anlegen
> </button> </form>
>
> <br />
>
> <c:choose> <c:when test="${empty param.svnr}"> <div
> class="warning">
> <p >Bitte geben Sie zumindest eine SV-Nr. ein.</p>
> </div> </c:when> <c:otherwise> <sql:query var="p_anlage" sql=" INSERT INTO person ( SV_NR, VORNAME, NACHNAME,
> STRASSE, HAUSNUMMER, ORT, POSTLEITZAHL ) VALUES (
> ${param.svnr}, ${param.vorname}, ${param.nachname},
> ${param.strasse}, ${param.hausnummer}, ${param.plz}, ${param.ort}
> ); " /> </c:otherwise> </c:choose>
`
当我填写表格并按按钮时,我得到以下提示:
> org.apache.jasper.JasperException: javax.servlet.ServletException:
> javax.servlet.jsp.JspException: INSERT INTO person ( SV_NR,
> VORNAME, NACHNAME, STRASSE, HAUSNUMMER, ORT, POSTLEITZAHL )
> VALUES ( 4589654812, Georg, Schramm, Schillerstraße, 12, ,
> Bad Homburg vor der Höhe ); : ORA-00936: missing expression
>
> org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:592)
> org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:462)
> org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:400)
> org.apache.jasper.servlet.JspServlet.service(JspServlet.java:344)
> javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
> org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
看到了吗?在“Schillerstraße,12”和“ Bad Homburg vor ...”之间,缺少一个表达-POSTLEITZAHL(= param.plz)。
为什么?我使用了与其他所有语法完全相同的语法!
答案 0 :(得分:1)
您的代码在很多级别上都是错误的,我几乎不知道从哪里开始。
第一(这就是为什么您的输入值未放入SQL语句的原因):
${param.plz}
未替换,因为您的表单不包含plz
输入字段-您将输入字段命名为postleitzahl
:
<input name="postleitzahl" value="${param.plz}" />
相应地,在您的SQL语句中,您需要引用param.postleitzahl
参数。
第二(这就是为什么更改最后两个值的顺序会导致错误“ ORA-00917:缺少逗号”的原因)
您将输入值直接放入SQL语句中。这适用于数字,但不适用于字符串-SQL中的文字字符串必须放在单引号中(为了清晰起见,将长sql属性包裹起来):
<sql:query var="p_anlage"
sql="INSERT INTO person (SV_NR, VORNAME, NACHNAME, STRASSE, HAUSNUMMER, ORT, POSTLEITZAHL)
VALUES ('${param.svnr}', '${param.vorname}', '${param.nachname}', '${param.strasse}',
'${param.hausnummer}', '${param.ort}', '${param.postleitzahl}' );"/>
第三:永远不要从用户输入创建SQL语句-这几乎总是会导致应用程序中存在SQL注入漏洞。
使用上面的语句,如果有人输入"A', '1'); delete from person; --"
作为“ ort”的值,他将能够从人员表中删除所有记录。
相反,您应该使用带有param标签的预处理语句:
<sql:query var="p_anlage"
sql="INSERT INTO person (SV_NR, VORNAME, NACHNAME, STRASSE, HAUSNUMMER, ORT, POSTLEITZAHL)
VALUES (?, ?, ?, ?, ?, ?, ? );">
<sql:param value="${param.svnr}"/>
<sql:param value="${param.vorname}"/>
<sql:param value="${param.nachname}"/>
<sql:param value="${param.strasse}"/>
<sql:param value="${param.hausnummer}"/>
<sql:param value="${param.ort}"/>
<sql:param value="${param.postleitzahl}"/>
</sql:query>
第四:您正在使用<sql:query />
标签。此标记用于返回结果集的SQL语句(主要是SELECT语句)。
对于INSERT和UPDATE语句,应使用<sql:update />
标记:
<sql:update var="p_anlage"
sql="INSERT INTO person (SV_NR, VORNAME, NACHNAME, STRASSE, HAUSNUMMER, ORT, POSTLEITZAHL)
VALUES (?, ?, ?, ?, ?, ?, ? );">
<sql:param value="${param.svnr}"/>
<sql:param value="${param.vorname}"/>
<sql:param value="${param.nachname}"/>
<sql:param value="${param.strasse}"/>
<sql:param value="${param.hausnummer}"/>
<sql:param value="${param.ort}"/>
<sql:param value="${param.postleitzahl}"/>
</sql:update>
对文档的有用引用:
答案 1 :(得分:0)
最后两个值的顺序错误。