Bạn đang chèn thẳng tên người dùng vào SQL mà không cần thoát hoặc thậm chí trích dẫn. Tôi nghĩ đơn giản là bạn đã bỏ sót dấu nháy đơn.
Để ngăn chặn sự cố chèn SQL, KHÔNG BAO GIỜ chèn hằng số chuỗi SQL từ dữ liệu động, LUÔN LUÔN sử dụng PreparedStatement và chèn các điểm đánh dấu.
Ngoài ra, hãy thoát khỏi các giá trị, nhưng sử dụng các điểm đánh dấu sẽ an toàn hơn nhiều và cải thiện hiệu suất SQL bằng cách cho phép cơ sở dữ liệu lưu vào bộ nhớ cache câu lệnh SQL đã biên dịch.
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());
Lưu ý: Câu trả lời được mở rộng để giải quyết vấn đề séc rỗng.
Khi bạn đang sử dụng chèn chuỗi đơn giản, "A='" + name + "'"
trở thành A='Joe'
cho một giá trị không phải null nhưng A='null'
cho một giá trị null, đó chắc chắn không phải là những gì bạn muốn.
Bằng cách sử dụng các dấu tham số, giá trị của ?
có thể là null
, có nghĩa là IFNULL(?, Name)
sẽ cung cấp hành vi chính xác cần thiết, tức là sử dụng giá trị của ?
khi nó không rỗng và giá trị của NAME
khi nào ?
là null.