Announcement

Collapse
No announcement yet.

So sánh chuỗi String java và SQL

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Java] So sánh chuỗi String java và SQL

    Đang rãnh nên coi thêm java, mình làm form đăng nhập, có sử dụng sql thì bị lỗi như sau mong các bạn giúp đỡ: :kiss:

    PHP Code:
            Connection con;
        
    Statement stm;
        
    ResultSet rst;
        
    String username="admin";
        
    String password="abc";
        
        
    String dbUrl="jdbc:odbc:Driver={SQL Server};Server=.;Database=Test;UserName=sa;Password=123"
        
    con DriverManager.getConnection(dbUrl);
        
    stm=con.createStatement();
        
        
    String strSql="";
        
    String strPass="";
        
        
    strSql="SELECT * FROM LOGIN WHERE username='"+username+"'";
        
    rst=stm.executeQuery(strSql);
        
        if(
    rst.next())
        {
            
    strPass=rst.getString("password");
            
            if(
    strPass.equals(password))
            {
                
    out.println("Thành công");
            }
            else 
    out.println("Sai mật khẩu");
        }
        else 
    out.println("Sai username"); 

    Trong sql mình có table LOGIN(username, password), có dữ liệu là admin và abc.
    Khi mình chạy thì kết quả in ra là Sai mật khẩu, phần kết nối csdl thì đã ok, chỉ còn chỗ if(strPass.equals(password)) nó toàn ra false. Không biết so sánh vậy có đúng không, nhờ mọi người giúp đỡ :shy:

  • #2
    Originally posted by bpdt View Post
    Đang rãnh nên coi thêm java, mình làm form đăng nhập, có sử dụng sql thì bị lỗi như sau mong các bạn giúp đỡ: :kiss:

    PHP Code:
            Connection con;
        
    Statement stm;
        
    ResultSet rst;
        
    String username="admin";
        
    String password="abc";
        
        
    String dbUrl="jdbc:odbc:Driver={SQL Server};Server=.;Database=Test;UserName=sa;Password=123"
        
    con DriverManager.getConnection(dbUrl);
        
    stm=con.createStatement();
        
        
    String strSql="";
        
    String strPass="";
        
        
    strSql="SELECT * FROM LOGIN WHERE username='"+username+"'";
        
    rst=stm.executeQuery(strSql);
        
        if(
    rst.next())
        {
            
    strPass=rst.getString("password");
            
            if(
    strPass.equals(password))
            {
                
    out.println("Thành công");
            }
            else 
    out.println("Sai mật khẩu");
        }
        else 
    out.println("Sai username"); 

    Trong sql mình có table LOGIN(username, password), có dữ liệu là admin và abc.
    Khi mình chạy thì kết quả in ra là Sai mật khẩu, phần kết nối csdl thì đã ok, chỉ còn chỗ if(strPass.equals(password)) nó toàn ra false. Không biết so sánh vậy có đúng không, nhờ mọi người giúp đỡ :shy:
    Tại bạn không sử dụng hàm cắt các khoảng trông thừa thôi
    bạn nên sử dụng hàm trim() tại các vị trí sau:
    strPass=rst.getString("password").trim();

    Comment


    • #3
      Originally posted by 10520130 View Post
      Tại bạn không sử dụng hàm cắt các khoảng trông thừa thôi
      bạn nên sử dụng hàm trim() tại các vị trí sau:
      strPass=rst.getString("password").trim();

      Mình làm giống bạn nhưng nó vẫn báo sai mật khẩu

      Comment


      • #4
        Originally posted by bpdt View Post
        Đang rãnh nên coi thêm java, mình làm form đăng nhập, có sử dụng sql thì bị lỗi như sau mong các bạn giúp đỡ: :kiss:

        PHP Code:
                Connection con;
            
        Statement stm;
            
        ResultSet rst;
            
        String username="admin";
            
        String password="abc";
            
            
        String dbUrl="jdbc:odbc:Driver={SQL Server};Server=.;Database=Test;UserName=sa;Password=123"
            
        con DriverManager.getConnection(dbUrl);
            
        stm=con.createStatement();
            
            
        String strSql="";
            
        String strPass="";
            
            
        strSql="SELECT * FROM LOGIN WHERE username='"+username+"'";
            
        rst=stm.executeQuery(strSql);
            
            if(
        rst.next())
            {
                
        strPass=rst.getString("password");
                
                if(
        strPass.equals(password))
                {
                    
        out.println("Thành công");
                }
                else 
        out.println("Sai mật khẩu");
            }
            else 
        out.println("Sai username"); 

        Trong sql mình có table LOGIN(username, password), có dữ liệu là admin và abc.
        Khi mình chạy thì kết quả in ra là Sai mật khẩu, phần kết nối csdl thì đã ok, chỉ còn chỗ if(strPass.equals(password)) nó toàn ra false. Không biết so sánh vậy có đúng không, nhờ mọi người giúp đỡ :shy:
        Vấn đề đầu tiên mình xin nhắc bạn là vấn đề bảo mật, việc kiểm tra tên đăng nhập và mật khẩu sẽ chỉ được xử lý ở hệ quản trị cơ sở dữ liệu và giá trị trả về từ hệ quản trị là "Có" hoặc "Không", nếu bạn lấy toàn bộ danh sách mật khẩu từ hệ quản trị thì điều gì xảy ra nếu gói tin đó được lấy cắp trên đường truyền.

        Vấn đề thứ 2 là tối ưu hóa băng thông, tại sao không lấy giá trị trả về "Có" hoặc "Không" mà phải lấy toàn bộ danh sách mật khẩu, băng thông sẽ khác hẳn.

        Vấn đề thứ 3 là tối ưu hóa xử lý, một số developer sẽ nghĩ rằng xử lý ở Server sẽ giảm tải một phần nhỏ trong việc xử lý ở hệ quản trị, đúng là như vậy, nhưng các bạn không biết các hệ quản trị đã xây dựng các "Core" ở lớp ngôn ngữ C/C++ cực mạnh riêng biệt cho việc thao tác dữ liệu. Mặc dù các "Core" ở ngôn ngữ cấp cao như Java, .Net đều xây dựng dựa trên ngôn ngữ cấp thấp nhưng rõ ràng đã qua bước trung gian.
        Chém gió thôi các chú http://forum.uit.edu.vn/emo/sweet_kiss.gif

        Comment


        • #5
          Originally posted by 09520147 View Post
          Vấn đề đầu tiên mình xin nhắc bạn là vấn đề bảo mật, việc kiểm tra tên đăng nhập và mật khẩu sẽ chỉ được xử lý ở hệ quản trị cơ sở dữ liệu và giá trị trả về từ hệ quản trị là "Có" hoặc "Không", nếu bạn lấy toàn bộ danh sách mật khẩu từ hệ quản trị thì điều gì xảy ra nếu gói tin đó được lấy cắp trên đường truyền.

          Vấn đề thứ 2 là tối ưu hóa băng thông, tại sao không lấy giá trị trả về "Có" hoặc "Không" mà phải lấy toàn bộ danh sách mật khẩu, băng thông sẽ khác hẳn.

          Vấn đề thứ 3 là tối ưu hóa xử lý, một số developer sẽ nghĩ rằng xử lý ở Server sẽ giảm tải một phần nhỏ trong việc xử lý ở hệ quản trị, đúng là như vậy, nhưng các bạn không biết các hệ quản trị đã xây dựng các "Core" ở lớp ngôn ngữ C/C++ cực mạnh riêng biệt cho việc thao tác dữ liệu. Mặc dù các "Core" ở ngôn ngữ cấp cao như Java, .Net đều xây dựng dựa trên ngôn ngữ cấp thấp nhưng rõ ràng đã qua bước trung gian.
          Chém gió thôi các chú http://forum.uit.edu.vn/emo/sweet_kiss.gif
          :sogood:Thanks bạn nhiều Mình mới làm quen với java nên làm thử cái này , chắc chỗ câu select thêm cái password zô cái where rồi trả về Có, Không cho nó lành

          Comment


          • #6
            Datatype của trường password bạn lưu dưới database có mã hóa không thế? Đoạn code so sánh của bạn thì không có vấn đề. Thử in ra giá trị của strPass trong khối if xem thử giá trị nó ra thế nào?

            Comment


            • #7
              Originally posted by 08520021 View Post
              Datatype của trường password bạn lưu dưới database có mã hóa không thế? Đoạn code so sánh của bạn thì không có vấn đề. Thử in ra giá trị của strPass trong khối if xem thử giá trị nó ra thế nào?
              Mình không có mã hóa, kiểu dữ liệu là varchar(10), out.println(strPass)=abc. Thằng equals như vậy là đúng rồi ah :sad:

              Comment


              • #8
                Ừ, so sánh String dùng equals thì đúng rồi. bạn có thể paste nguyên cái hàm main và kết quả lên đây được không?

                Comment


                • #9
                  Mình bị nhầm lẫn trong cái CSDL, code của mình là kết nối zí thằng sa, mà mình nhớ dữ liệu của thằng khác, password="123" thì mới đúng :beatbrick:
                  Thanks các bạn quan tâm, mình sẽ rút kinh nghiệm cái vụ này :beatbrick::beatbrick:

                  Comment


                  • #10
                    Đối tượng ResultSet trả về false nếu câu truy vấn trả về không có dòng nào và true khi có ít nhất 1 dòng,vậy sao bạn không thêm cái điều kiện ở câu truy vấn password= passnhậpvào sau đó kiểm tra đối tượng ResultSet trả về true hoặc false là được.
                    Nhưng mà đây là làm cho hiểu thôi chứ chẳng ai mà kiểm tra đăng nhập theo kiểu này )
                    Hà Tĩnh Quê Choa:sunglasses:
                    FACEBOOK

                    Comment

                    LHQC

                    Collapse
                    Working...
                    X