我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?

Posted

技术标签:

【中文标题】我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?【英文标题】:I have written this code for fetch record from my table name is owners... but some error is occurs... is there something missing?我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是否缺少某些东西? 【发布时间】:2017-04-26 18:02:11 【问题描述】:
try 
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mystationary", "root", "");
    Statement stmt = con.createStatement();
    String qry;
    qry = "select * from owners where usernm='" + jTextField1.getText() + "',password='" + jTextField2.getText() + "'";
    ResultSet rs = stmt.executeQuery(qry);
    while (rs.next()) 
        JOptionPane.showMessageDialog(null, "Welcome '" + jTextField1.getText() + "' !");

    

 catch (HeadlessException | ClassNotFoundException | SQLException e) 
    JOptionPane.showMessageDialog(null, e);

【问题讨论】:

与其发布“但发生了一些错误”,不如编辑您的帖子并告诉我们错误是什么以及任何相关的背景信息。在你的问题上多花一点力气,你就会得到一个体面的答案。 尝试生成合法的SQL。然后修复你的 SQL 以避免 SQL 注入。 请直接在您的问题中发布错误文本。 是的。这实际上就是为什么您会收到一条错误消息,指出您的查询中存在 SQL 语法错误。而且非常基础。 @Jay IDE 将突出显示 Java 错误,而不是 SQL-embedded-in-concatenated-strings 错误。您收到的错误消息是明确且正确的。 【参考方案1】:

您必须改用 PreparedStatement 以避免任何语法错误或 SQL 注入:

try (PreparedStatement ps = con.prepareStatement(
        "select * from owners where usernm = ? and password = ?")) 

    ps.setString(1, jTextField1.getText());
    ps.setString(2, jTextField2.getText());

    ResultSet rs = ps.executeQuery(qry);

    if (rs.next()) 
       JOptionPane.showMessageDialog(null, "Welcome '" + jTextField1.getText() + "' !");
    

你真正的问题是,,当你想在必须使用and而不是,的地方使用时

qry = "select * from owners where usernm='"+jTextField1.getText()+"', password='"+jTextField2.getText()+"'";
//------------------------------------------------------------------^

相反,您必须使用:

qry = "select * from owners where usernm='"+jTextField1.getText()+"' and password='"+jTextField2.getText()+"'";
//-------------------------------------------------------------------^^^

但 PreparedStatement 更安全。


另外,如果你想检查一个用途,那么你可以使用if (rs.next())而不是while (rs.next())

【讨论】:

谢谢。我会采纳你的建议。【参考方案2】:

在这一行:

 qry = "select * from owners where usernm='"+jTextField1.getText()+"',password='"+jTextField2.getText()+"'";

当您应该使用 SQL 运算符“AND”时,您使用逗号分隔条件。

qry = "SELECT * FROM owners WHERE usernm='"+jTextField1.getText()+"' AND password='"+jTextField2.getText()+"'";

此外,正如 Dave Newton 所指出的,此代码易受 SQL 注入攻击。而您在 executeQuery() 调用之后的 while 循环实际上并没有使用您的结果集。

【讨论】:

以上是关于我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 从动态表名中查询数据

clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?

从表名中选择计数不同的列名作为cnt

SQL 查询 SELECT FROM [从表名中选择值]

如何使用 PostgreSQL 从表名中获取列属性查询?

通过在 Sql 中使用表名中的特定单词检查表是不是存在