同一方法 allSel() 根據頁碼動態組裝兩種 SQL:
LIMIT ?, 6(兩個參數)LIMIT ?, ?(兩個參數,第二個由 page.getLastPageNum() 提供)結果:**每次第一次執行非尾頁 SQL 都報錯,之後重試卻正常**。
LIMIT ?, 6 只有一個佔位符 ?,但程式可能嘗試設定兩個參數(如 ps.setInt(1, ...); ps.setInt(2, 6)),導致 Parameter index out of range。PreparedStatement,首次建立時參數元資料不匹配,重試時複用已修正的快取而成功。LIMIT offset, row_count 需兩個數值,若寫成 LIMIT ?, 6 需確保只設一個參數(offset),6 直接寫死或用 LIMIT ?, ? 統一處理。// 統一使用兩個參數,避免邏輯分支
String sql = "SELECT * FROM item WHERE ite_title LIKE ? OR ite_descr LIKE ? OR ite_type LIKE ? LIMIT ?, ?";
ps = conn.prepareStatement(sql);
ps.setString(1, "%" + keyword + "%");
ps.setString(2, "%" + keyword + "%");
ps.setString(3, "%" + keyword + "%");
ps.setInt(4, offset); // 起始筆數
ps.setInt(5, pageSize); // 每頁筆數,尾頁時傳入 page.getLastPageNum()
ps.toString() 或開啟驅動日誌 (log4jdbc) 觀察實際 SQL 與參數。SQLException 並印出 getErrorCode()、getSQLState() 定位問題。