您正在将用户名直接插入SQL中,而没有转义,甚至不加引号。我认为您只是错过了撇号。
为了防止SQL注入问题,切勿从动态数据中插入SQL字符串常量,始终使用PreparedStatement并插入标记。
另外,可以转义值,但是使用标记要安全得多,并且可以通过允许数据库缓存已编译的SQL语句来提高SQL性能。
String updateQuery = "UPDATE " + USER_TABLE + " SET " + USER_TABLE_FIRST_NAME + "=IFNULL(? ," + USER_TABLE_FIRST_NAME + ")," +USER_TABLE_LAST_NAME + "=?," +USER_TABLE_about_ME + "=?," +USER_TABLE_CITY + "=?," +USER_TABLE_DOB + "=?" + " WHERe " + USER_TABLE_ID + "=?";PreparedStatement stmt = conn.prepareStatement(updateQuery);stmt.setString(1, user.getFirstName());stmt.setString(2, user.getLastName());stmt.setString(3, user.getaboutMe());stmt.setString(4, user.getCity());stmt.setString(5, user.getDateOfBirth());stmt.setString(6, user.getUserId());
注意: 答案已扩展至涵盖空检查问题。
当您使用简单的字符串注入时,
"A='" + name + "'"将变为
A='Joe'非空值,但变为
A='null'空值,这绝对不是您想要的。
通过使用参数标记,
?can的值可以为
null,这意味着
IFNULL(?,Name)将给出所需的确切行为,即使用
?when的值不为null以及
NAMEwhen的
?值为null。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)