Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java向MySql发送参数化删除_Java_Mysql_Sql - Fatal编程技术网

如何从Java向MySql发送参数化删除

如何从Java向MySql发送参数化删除,java,mysql,sql,Java,Mysql,Sql,我想通过以下方式从名为PersonnelTable的表中删除: public void verifyDetailsBeforeClosingAccount(String _idNumber,String _username,String _password ,String _account) { String retrievedNumberAccount = null; String retrievedOwnerIdnumber = null; try {

我想通过以下方式从名为
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
中的一行,其中:

  • 表中的
    Password
    列等于给定给函数的
    \u Password
  • 表中的用户名列等于给定给函数的用户名
  • 这是行不通的:

    this.m_statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = _password AND `UserName` =_username ");
    
    我看过
    DELETE
    的教程,但没有介绍如何在函数中处理给定值。我怎样才能解决这个问题


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

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


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

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


    您要做的是删除用户名为“\u username”的记录(不是传递给您的值,而是字面上的“\u username”)

    你必须:

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

     statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = `" + _password + "` AND `UserName` = `" + _username + "` ");
    
    b) 使用PreparedStatement(建议避免SQL注入攻击)


    编辑:另一方面,如果用户名是注册表的密钥(唯一标识符),则添加密码检查只会减慢操作速度,使过程复杂化(如果有人同时更改密码怎么办?),并且不会给您带来任何好处。

    您要做的是删除用户名为“\u username”的记录(不是传递给您的值,而是字面上的“_username”)

    你必须:

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

     statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = `" + _password + "` AND `UserName` = `" + _username + "` ");
    
    b) 使用PreparedStatement(建议避免SQL注入攻击)


    编辑:另一方面,如果用户名是注册表的一个键(唯一标识符),则添加密码检查只会减慢操作速度,使过程复杂(如果有人同时更改密码怎么办?),并且不会给您带来任何好处。

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

     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();
    

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

     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();
    

    您正在将文本值_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和参数化查询。

    您正在将文本值\u password和\u 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和参数化查询。

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

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

    您尝试过这个吗

    这个.m_语句.executeQuery(“从
    PersonnelTable
    WHERE
    Password
    =”+\u Password+”和
    UserName
    =”+\u UserName中删除”)

    你试过这个吗


    这个.m_语句.executeQuery(“从
    PersonnelTable
    WHERE
    Password
    =”+\u Password+”和
    UserName
    =”+\u UserName中删除”)

    ??将函数参数注入查询,使
    Password
    =MYPASSWORD成为已执行查询的一部分?将函数参数注入查询,使
    Password
    =MYPASSWORD成为已执行查询的一部分?我非常想强调的是,
    b
    无疑是一个选择。总是准备好的陈述是你的朋友,使用它们。另外,请使用相同的模式来选择您的第一个结果集,您真的,真的不需要获得整个表并自己循环通过它来寻找匹配!是不是mysql中的DB对象分隔符和字符串文字分隔符?@tetsujinnoni可能是,我已经很久没有使用mysql了(现在我使用JPA)。如果你确定正确的语法,请随意更正。我想强调的是,
    b
    绝对是你的选择。总是准备好的陈述是你的朋友,使用它们。另外,请使用相同的模式来选择您的第一个结果集,您真的,真的不需要获得整个表并自己循环通过它来寻找匹配!是不是mysql中的DB对象分隔符和字符串文字分隔符?@tetsujinnoni可能是,我已经很久没有使用mysql了(现在我使用JPA)。如果您确定正确的语法,请随意更正它。