Masalah:
Apabila melaksanakan pertanyaan menggunakan PreparedStatement dalam Java, MySQLSyntaxErrorException berlaku dengan mesej ralat: "Anda mempunyai ralat dalam sintaks SQL anda... berhampiran '? atau MemberName = ?'."
Kod:
String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?"; Connection conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD); PreparedStatement s = conn.prepareStatement(query); s.setInt(1, 2); s.setString(2, "zen"); ResultSet rs = s.executeQuery(query);
Punca:
Ralat sintaks disebabkan oleh tanda soal (?) dalam pertanyaan SQL. MySQL mentafsirkannya sebagai tanda soal literal, bukan sebagai pemegang tempat parameter. Ini mengakibatkan sintaks SQL tidak sah.
Penyelesaian:
Untuk menyelesaikan isu, gantikan tanda soal dalam pertanyaan SQL dengan parameter bernama. Ini akan membolehkan PreparedStatement mengikat nilai parameter dengan betul:
String query = "select MemberID, MemberName from members where MemberID = :member_id or MemberName = :member_name";
Dalam kod Java, gunakan kaedah PreparedStatement#setString untuk menetapkan parameter yang dinamakan:
s.setString("member_id", "2"); s.setString("member_name", "zen");
Sebagai alternatif, anda boleh menggunakan kaedah s.executeQuery() tanpa argumentasi dan bukannya s.executeQuery(query) untuk mengelakkan mengatasi yang disediakan pertanyaan dengan pertanyaan asal.
Kebocoran Sumber:
Perhatikan bahawa kod yang disediakan mempunyai isu kebocoran sumber. Objek Sambungan, Pernyataan dan ResultSet harus ditutup dalam blok akhirnya untuk mengelakkan keletihan sumber.
Atas ialah kandungan terperinci Mengapa Penyata Disediakan Saya Menghasilkan Pengecualian 'Anda Mempunyai Ralat dalam Sintaks SQL Anda' dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!