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 测试错误