为什么SQL不接受一个属性,却接受其他属性?

时间:2019-03-20 19:07:02

标签: java html sql

对,我有一个名为“ 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)。

为什么?我使用了与其他所有语法完全相同的语法!

2 个答案:

答案 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)

最后两个值的顺序错误。