1

PersonnelTable我想从以下列方式调用的表中删除:

public void verifyDetailsBeforeClosingAccount(String _idNumber,String _username,String _password ,String _account)
{

    String retrievedNumberAccount = null;
    String retrievedOwnerIdnumber = null;

    try
    {

        // take all the rows with "account-number" and "id-numbder" in the "Checking-account-table" 

        ResultSet results = this.m_statement.executeQuery("SELECT `AccountNumber`, `IdNumber`  FROM `CheckingAccountsTable`");  
        while (results.next() == true)
        {
            retrievedNumberAccount = results.getString("AccountNumber");  // take the account number 
            retrievedOwnerIdnumber = results.getString("IdNumber");       // take the ID number 

            if (retrievedNumberAccount.equals(_account) == true && retrievedOwnerIdnumber.equals(_idNumber) == true )  // found a partial match 
            {
                // put something here
            }
        }
    }
}

我想删除 中的一行PersonnelTable,其中:

  1. Password表中的列等于_password函数的给定值,
  2. UserName表中的列等于username给函数的 _。

那不起作用:

this.m_statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = _password AND `UserName` =_username ");

我查看了教程,DELETE但没有显示如何将给定值处理为函数。我怎样才能解决这个问题 ?

问候

4

6 回答 6

9

用单引号将值括起来,因为它是一个字符串。对?

this.m_statement.executeQuery("DELETE FROM `PersonnelTable` 
                               WHERE `Password` = '" + _password + "' AND 
                                     `UserName` = '" + _username + "' ");

对此有更好的Java Prepared Statement

前任

string sqlStatement = "DELETE FROM `PersonnelTable` 
                                   WHERE `Password` = ? AND 
                                         `UserName` = ? ";
PreparedStatement pstmt = con.prepareStatement(sqlStatement);
pstmt.setString(1, _password)
pstmt.setString(2, _username)
pstmt.executeUpdate();
于 2012-08-08T15:08:28.557 回答
7

您正在做的是删除用户名为“_username”的记录(不是传递给您的值,而是字面意思是“_username”)

您必须:

a) 传递值而不是变量名:

 statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = `" + _password + "` AND `UserName` = `" + _username + "` ");

b) 使用 PreparedStatement(推荐用于避免 SQL 注入攻击)。

编辑:附带说明,如果用户名是寄存器的密钥(唯一标识符),添加密码检查只会减慢操作,使程序复杂化(如果有人同时更改密码怎么办?)并且没有任何优势。

于 2012-08-08T15:09:07.250 回答
5

您需要使用准备好的语句并将值作为参数传递。

 String deleteString = "DELETE FROM `PersonnelTable` WHERE `Password` = ? AND `UserName` = ? ";

 PreparedStatement deleteStmt = con.prepareStatement(deleteString);

 deleteStmt.setString(1, _password);  // Use whatever the object type of user/password are
 deleteStmt.setString(2, _username);

 deleteStmt.executeUpdate();
 con.commit();
于 2012-08-08T15:09:18.473 回答
3

您正在将文字值 _password 和 _username 发送到您的 SQL 中;相反,您需要传递变量中的值。我建议这样做作为参数。我的 JDBC 非常生锈,因此您暂时将其作为“正确的代码示例在此处”存根。

 this.m_statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = '" + _password + "' AND `UserName` = '"+_username +"'"); // THIS IS BAD -- but it will usually do what you are after if you need it *RIGHT NOW* 

正如其他答案所述,您应该使用 PreparedStatement 和参数化查询以确保安全。

于 2012-08-08T15:10:29.007 回答
3

您可以使用 PrepareStatement 及其 setString() 方法来设置 _password 和 _username。您不应该尝试直接设置 _password 和 _username。使用 setString() 方法时,将 SQL 语句中的 _password 和 _username 变量替换为 '?' 并执行 setString(1, _password) 和 setString(2, _username) 以便第一个变量是密码变量,第二个变量是用户名变量。

于 2012-08-08T15:11:36.730 回答
2

你试过这个吗?

this.m_statement.executeQuery("DELETE FROM PersonnelTableWHERE Password= "+_password+" AND UserName="+_username);

于 2012-08-08T15:12:16.667 回答