java
  • mysql
  • 2011-02-23 72 views 1 likes 
    1

    我是新來連接Java與MySQL數據庫。這有什麼錯我的查詢這裏:mysql在java中的select查詢

    PreparedStatement statement = conn.prepareStatement("SELECT * FROM q_table, choices, answers WHERE q_table.QID='" + number_input + "' AND choices.CID='" + number_input + "' AND answers.AID='" + number_input + "'"); 
    
    +0

    什麼*去*錯?你會得到什麼錯誤? –

    回答

    4

    在您的對賬單" ... q_table.QID='" + number_input + "' AND ...中,變量number_input包含在單引號(')中。這用於string lieterals。如果刪除單引號,它應該工作:

    String prest= "SELECT * FROM q_table, choices, answers WHERE questions.QID=? AND choices.CID=? AND answers.AID=?"; 
    
    prest.setInt(1,1980); 
    prest.setInt(2,2004); 
    . 
    . 
    ResultSet rs = prest.executeQuery(); 
    while (rs.next()){ 
        String mov_name = rs.getString(1); 
        int mov_year = rs.getInt(2); 
        count++; 
        System.out.println(mov_name + "\t" + "- " + mov_year); 
    } 
    System.out.println("Number of records: " + count); 
    prest.close(); 
    con.close(); 
    
    +0

    異常處理是遺漏的。 –

    +0

    在你的sql中有一個錯誤。 「從q_table ...到WHERE questions.QID ...」 – Cid54

    1

    好了,第一個問題是,你通過你的SQL包括直接值開自己到一個SQL注入攻擊。改爲使用參數化查詢。

    現在,我們真的不能告訴什麼是錯的,除此之外,雖然,你引用了的事實似乎可疑,象您使用相同的值的問題ID,選擇的事實ID和答案ID。這似乎不太合適。

    如果您能給我們提供更多有關正在發生的事情與您預期發生的事情的信息,那真的會有所幫助。

    1

    當您使用準備好的語句時,您不能在那裏設置值。

    您必須先使用問號準備語句,然後再設置參數。

    下面是一個例子:

    public void updateCoffeeSales(HashMap<String, Integer> salesForWeek) throws SQLException { 
    
        PreparedStatement updateSales = null; 
        PreparedStatement updateTotal = null; 
    
        String updateString = "update " + dbName + ".COFFEES " + 
              "set SALES = ? where COF_NAME = ?"; 
    
        String updateStatement = "update " + dbName + ".COFFEES " + 
              "set TOTAL = TOTAL + ? where COF_NAME = ?"; 
    
        try { 
         con.setAutoCommit(false); 
         updateSales = con.prepareStatement(updateString); 
         updateTotal = con.prepareStatement(updateStatement); 
    
         for (Map.Entry<String, Integer> e : salesForWeek.entrySet()) { 
         updateSales.setInt(1, e.getValue().intValue()); 
         updateSales.setString(2, e.getKey()); 
         updateSales.executeUpdate(); 
    
         updateTotal.setInt(1, e.getValue().intValue()); 
         updateTotal.setString(2, e.getKey()); 
         updateTotal.executeUpdate(); 
         con.commit(); 
         } 
        } catch (SQLException e) { 
         JDBCTutorialUtilities.printSQLException(e); 
         if (con != null) { 
         try { 
          System.err.print("Transaction is being rolled back"); 
          con.rollback(); 
         } catch(SQLException excep) { 
          JDBCTutorialUtilities.printSQLException(excep); 
         } 
         } 
        } finally { 
         updateSales.close(); 
         updateTotal.close(); 
         con.setAutoCommit(true); 
        } 
        } 
    
    +1

    不,您*可以*在準備好的聲明中包含文字。如果它們是用戶提供的,你就不應該這樣做。通常情況下,一個準備好的語句可能有一個硬編碼字面值。 –

    1

    SELECT * FROM q_table,選擇,回答WHERE q_table .QID = ' 「+ number_input +」' AND choices.CID ='」 + number_input + 「 'AND answers.AID ='」 + number_input + 「'」

    SELECT * FROM 問題,選擇,答案WHERE 個問題 .QID = ' 「+ number_input +」' AND choices.CID = ' 「+ number_input +」' AND answers.AID ='」 + number_input + 「'」

    1

    這不是一個正確的prepareStatement。這是一個連接的查詢,只會導致你注入sql注入的恐怖。 Look here

    相關問題