2

関数を使用して "mysql.db" からデータを取得すると、SQL 例外 (認識されないトークン) が発生します。文字列アドレスに引用符が含まれている場合、例外が発生します。

私はすでにこの行を変更しようとしました

KEY_ADDRESS + "='" + address + "'",

KEY_ADDRESS + "=\"" + address + "\"",

一重引用符 (') と (`) を含む文字列の問題は解決しますが、二重引用符 (") を含む文字列では別の問題が生じます。

使ってみた

DatabaseUtils.sqlEscapeString(address);

効果なし。

この質問からエスケープ機能を使用しようとしました: MySQL で特殊文字をエスケープするにはどうすればよいですか? 、しかし、それはうまくいきませんでした。

これは私のコードです:

public Cursor getNameFromAddress(String address) throws SQLException
{
    Cursor mCursor =
            db.query(DATABASE_TABLE_PRINC, new String[] {
                    KEY_ROWID,
                    KEY_NAME,
                    KEY_ADDRESS
                    },
                    KEY_ADDRESS + "='" + address + "'",
                    null,
                    null,
                    null,
                    null,
                    null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}
4

3 に答える 3

5

これらのselectionArgs/whereArgsは、そのために使用されることを意図しています:

Cursor mCursor =
        db.query(DATABASE_TABLE_PRINC, new String[] {
                KEY_ROWID,
                KEY_NAME,
                KEY_ADDRESS
                },
                KEY_ADDRESS + "=?",
                new String[] { address },
                null,
                null,
                null,
                null);

"='" + stuff + "'"すべてを置き換えて"=?"、データを入れて、?s に入力する必要がある順序で s を入力します。String[]

?その後、エスケープされた文字列データに自動的に置き換えられます。

于 2012-10-24T15:02:51.487 に答える
2
queryText = "select * from yourtable where address = ?";
mDb.rawQuery(queryText, new String[] {addressValue}); 

このようにして、問題を解決し、SQLインジェクションからシステムを守ります。

于 2012-10-24T15:04:27.873 に答える
2

ない "?" シンボル

Cursor mCursor =
        db.query(DATABASE_TABLE_PRINC, new String[] {
                KEY_ROWID,
                KEY_NAME,
                KEY_ADDRESS
                },
                KEY_ADDRESS + "=?" ,
                new String[]{address},
                null,
                null,
                null,
                null);
于 2012-10-24T15:01:49.890 に答える