Di Java, apabila melaksanakan pertanyaan menggunakan PreparedStatement, seseorang mungkin menghadapi MySQLSyntaxErrorException dengan nombor ralat 1064 yang menunjukkan ralat sintaks berhampiran "?". Ini mungkin berlaku walaupun pertanyaan berfungsi dalam penyemak imbas pertanyaan MySQL dengan nilai yang digantikan.
Setelah diperiksa lebih dekat, ternyata MySQL tidak dapat mentafsir "?" pemegang tempat dalam pertanyaan SQL, menganggapnya sintaks tidak sah. Ini kerana PreparedStatement tidak menggantikan ruang letak ini.
Coretan kod yang anda kongsi tersilap menulis ganti pertanyaan yang disediakan dengan versi asal. Untuk membetulkannya, gunakan PreparedStatement#executeQuery() dan bukannya Statement#executeQuery(String):
PreparedStatement s = conn.prepareStatement(query); s.setInt(1, intValue); s.setString(2, strValue); rs = s.executeQuery(); // Correct
Nota: Walaupun tidak berkaitan dengan isu semasa, kod anda gagal menutup Sambungan, Penyata dan ResultSet. Peninggalan ini boleh menyebabkan kehabisan sumber dan ranap aplikasi seterusnya. Laksanakan simpulan bahasa JDBC yang betul dengan menutup objek ini dalam blok akhirnya:
try (Connection conn = DriverManager.getConnection(...); PreparedStatement s = conn.prepareStatement(...); ResultSet rs = s.executeQuery()) { // Query execution code } finally { if (rs != null) rs.close(); if (s != null) s.close(); if (conn != null) conn.close(); }
Atas ialah kandungan terperinci Mengapa Saya Mendapat 'Ralat sintaks berhampiran '?'' dengan MySQL PreparedStatements?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!