sql 在简单查询中抛出错误

Posted

技术标签:

【中文标题】sql 在简单查询中抛出错误【英文标题】:sql throws errors in simple querys 【发布时间】:2016-01-07 21:22:21 【问题描述】:

所以我有一个通过 JDBC 连接到数据库的 Java 应用程序。我现在要做的是从数据库中获取与 Java 应用程序中的输入匹配的特定条目。

public String getA(String tablename, String input)
String result = null;
try 
    String query = ("select * from " +tablename+ " where name = "+input);
    rs = stt.executeQuery(query);
    while (rs.next())
        String rsh = rs.getString("Name");
        result = rsh; 
    
     catch (Exception acc_ex)
        System.out.println("Acces excpetion in .getA: "+acc_ex);
        return null; 
     finally 
        return result; 
    

投掷:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '[input-here]' in 'where clause'

其他方法中的查询工作得非常好,以相同的方式构造它们。 有什么想法可以解决这个问题吗? 谢谢

【问题讨论】:

永远不要使用 concat 方法构建查询。 这里有很多问题。选择 * 很少是一个好的选择。您将表名作为字符串传递,然后执行它。这很容易受到 sql 注入的影响。您需要参数化您的查询。并且不确定您如何不知道表名。 >. 所以基本上它在没有连接到互联网的本地服务器上运行,所以没有滥用或 sql 注入的风险,即使我不在乎,因为它是一个简单的学校项目,所以没有人会受到伤害. 做一个 System.out.println(query) 并发布它 我得到的学校项目,但不要误以为sql注入只能从互联网发生。员工的风险很大。但正如你所说,这是一个学校项目。我建议把它做好仍然是一个好主意,特别是因为它仍然是新的。正如我在执教时告诉孩子们“你玩游戏的方式和练习方式一样”。如果您现在以简单的方式进行操作,那么这种情况很可能会继续下去。 【参考方案1】:

这行代码("select * from " +tablename+ " where name = "+input);中的字符串值input应该用单引号括起来。

例如,如果您的表名是 SomeTable,而您的输入值是 SomeNameValue,那么现在发送到 MySql 的查询将是......

select * from SomeTable where name = SomeNameValue

错了,应该是这个,值用单引号括起来……

select * from SomeTable where name = 'SomeNameValue'

所以我提到的那行代码要改成这样……

String query = ("select * from " +tablename+ " where name = '" +input+ "'");

【讨论】:

OP 询问为什么他的查询会遇到异常 - 而不是关闭资源虽然是一个有效的点,但不是他的问题的原因,并且可能只会混淆问题。我宁愿只回答问题,也不愿批评所有不相关的问题。 因此,与其批评你帮助了......对这些简单的事情视而不见并期待一场灾难。 只是一个注释(作为字符串连接),不确定这是不是问题,也许他在输入中传递了例如“名称”......带引号......让我们看看...... @Zi1mann 有一点需要注意,这也是为什么这么多人建议参数化查询的原因之一,如果input 包含',则会中断。比如名字是“O'Reilly”。【参考方案2】:

请在输入前后加单引号:

String query = ("select * from " + tablename + " where name = '" + input + "'");

【讨论】:

以上是关于sql 在简单查询中抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel GroupBy 在 mysql 中工作,但在 MariaDB 中抛出错误

django-bootstrap-v5 DecimalField 在 ModelForm 类中抛出错误

afterAll ReferenceError 中抛出错误:未定义模块,nodejs 中的 Karma/Jasmine 测试错误

捕获 MVC 3.0 应用程序中抛出的所有错误的干净方法?

SwiftUI 组嵌套在 VStack 中抛出错误

为啥 nodemon 在终端中抛出一些错误?