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. UserNameusername表の列は、関数に指定された _ と同じです。

それはうまくいきません:

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プリペアドステートメントです。

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) を実行して、最初の変数がパスワード変数になり、2 番目の変数がユーザー名変数になるようにします。

于 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 に答える