0

複数のテーブルからデータを取得するのに問題があります。これは、検索フォームとそのリレーショナルデータベースになります。

質問1:複数のテーブルからデータを取得するにはどうすればよいですか?

質問2:同時に、私が直面しているもう1つの問題は、名前または姓だけで検索しようとすると結果が得られないことです。生年月日を使用した場合にのみ結果が得られます。なんで?

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        java.io.PrintWriter out = response.getWriter();
        Connection conn = null;{ // while there is no connections, proceed to the next step
        try {
            Class.forName("org.postgresql.Driver"); // importing the driver to use the getConnection method
            conn = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/caglar", "postgres", //?searchpath=cag
                    "abracadabra");
            System.out.println("Connected to the database"); // console message
            String  agent_name  = request.getParameter("givenname"); // variable - reads from user input
            String  agent_lastname  = request.getParameter("familyname"); // variable - reads from user input
            String  dob  = request.getParameter("birthyear"); // variable - reads from user input

            ArrayList al=null;
            ArrayList agent_list =new ArrayList();

            //Problem 1: If dob is not given, it is not searching by name or lastname.

            //String query = "select * from agent where givenname='"+agent_name+"' or familyname='"+agent_lastname+"' or birthyear='"+dob+"' order by givenname";

            String query = "select * from agent where givenname='"+agent_name+"' or familyname='"+agent_lastname+"' ";
            if(dob!=null && !"".equals(dob)) // if date of birth fiel is left blank, it will still proceed to the results page
              query = query + " or birthyear='"+dob+"'"; // if date of birth exists, it will take it into account as well

            query = query+  "order by givenname"; // ordering by first name


            System.out.println("query" + query); // console message
            Statement st = conn.createStatement(); // connection statement
            ResultSet  rs = st.executeQuery(query); // executing our query


            while(rs.next())
            {
                al  = new ArrayList();

              al.add(rs.getString(1));//id
              al.add(rs.getString(2));//dob
              al.add(rs.getString(3));//name
              al.add(rs.getString(4));//lastname
              System.out.println("al :: "+al);
              agent_list.add(al);
            }

            request.setAttribute("agentList",agent_list);
4

1 に答える 1

2

他の人が上で指摘していることを繰り返すために、これは「危険な」コードです。PreparedStatementsを使用しないことで、SQLインジェクション攻撃にさらされることになります。これにより、悪意のあるユーザーがSQLステートメントを作成して、テーブル内のすべてのデータを削除できます。上記の@craig-ringerが指摘しているように、データベースからテーブルを削除するのは簡単な送信データです。

それを指摘し、数回下線を引き、蛍光黄色のマークで強調表示した後、次に進んで質問に答えてみましょう。

1)SQL結合を使用して、複数のテーブルからデータをクエリできます。これがJOINSに関するPostgreSQLチュートリアルです-他にもたくさんありますが、最初に見つけたものを選びました。

2)データベース内の正確なデータと提供されている正確なパラメーターがないと、答えることは困難ですが、問題は大文字と小文字の区別であると思います。PostgreSQLでの比較では大文字と小文字が区別されるため、データベースの名前が「Smith」で、パラメータが「smith」の場合、データは見つかりません。したがって、簡単にするために、パラメータとデータの両方を同じケースに変換する必要があります。例:SELECT * FROM agent where LOWER(familyname)='smith'

また、日付のフォーマットで問題が発生する可能性があることも指摘しておきます。これも、プリペアドステートメントを使用して対処します。

あなたはJava、SQL、JDBCにまったく慣れていないようです。いくつかのチュートリアルに従って、いくつかの本を読むことをお勧めします。理解することはたくさんあります-頑張ってください!

于 2012-04-24T06:55:04.703 に答える