【问题标题】:Unknown column 'sunny' in where clausewhere 子句中的未知列 'sunny'
【发布时间】:2019-08-14 05:24:50
【问题描述】:
  <body>
    <%  String name=session.getAttribute("user").toString();    %>

 <br>

  <%@ page import="java.sql.*" %>
  <%
   try
  {
   Class.forName("com.mysql.jdbc.Driver").newInstance();
   java.sql.Connection 
   con=DriverManager.getConnection
   ("jdbc:mysql://localhost:3306/pbl","root","");
   Statement st=con.createStatement();
   String q="select pcode ,pname,pprice from car where us="+name;
   ResultSet rs = st.executeQuery(q) ;
 %>

错误: java.sql.SQLSyntaxErrorException:您的 SQL 中有错误 句法;检查与您的 MariaDB 服务器相对应的手册 在第 1 行的“按名称”附近使用正确语法的版本

【问题讨论】:

  • 粘贴错误日志。
  • 必须有一个干净的欺骗目标。如果没有,这可以成为干净的欺骗目标。
  • 可能重复:stackoverflow.com/questions/419021/… ...但我不会关闭,因为每个查询都是不同的。

标签: java jdbc


【解决方案1】:

我猜是这一行的问题 String q="select pcode,pname,pprice from car where us="+name;

是的,因为名称(显然是 sunny)不在 SQL 引号中,所以它看起来像列引用。

从不使用字符串连接将值添加到 SQL 查询。请改用prepared statements

PreparedStatement ps = con.prepareStatement("select pcode ,pname,pprice from car where us = ?");
ps.setString(1, name);
ResultSet rs = ps.executeQuery();

这样,信息将作为数据处理,而不是作为 SQL(必要时适当转义等)。需要注意的地方:

  1. 您在值所在的位置使用?。您不要? 放在引号或任何东西中,即使您打算使用字符串作为值。
  2. 您可以通过在连接上调用 prepareStatement 来获得准备好的语句。
  3. 不要将字符串传递给executeQuery。 (这很重要,因为遗憾的是,您可以PreparedStatement 上将字符串传递给executeQuery,这绕过了使用准备好的语句的全部意义;它应该被定义为导致异常,但是遗憾的是它不是。)

让我给你介绍my friend Bobby

【讨论】:

  • @TJCrowder 实际上,当您将查询字符串传递给executeQuery 时,您实际上是在调用Statement#executeQuery,这不是准备好的语句方法。
  • @TimBiegeleisen - 对。这就是为什么我说不要那样做。 (因为可悲的是,PreparedStatement 不会覆盖 executeQuery(String) 并抛出异常,我认为它应该这样做。)
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 2021-09-19
  • 2020-06-28
  • 2021-07-02
  • 2013-07-18
  • 2016-10-04
  • 2020-07-21
相关资源
最近更新 更多