1

DATETIME に基づいてテーブルからエントリのサブセットを選択しようとしています。コマンドラインで、次のように入力します

SELECT * FROM routes_table WHERE time > '2012-05-28 11:01:01' ORDER BY time

私は得る

mysql> SELECT * FROM routes_table WHERE time > '2012-05-28 11:01:01' ORDER BY time;
+-----------+--------------+------+---------------------+--------------+
| driver    | type         | num  | time                | destination  |
+-----------+--------------+------+---------------------+--------------+
| Ma Lvjing | Bus          | B127 | 2012-06-22 15:00:00 | Colina Hotel |
+-----------+--------------+------+---------------------+--------------+
1 row in set (0.00 sec)

ただし、JDBC を介してまったく同じクエリを実行すると、「2012-05-28 11:01:01」より前の時刻のエントリを含む、テーブルのすべての結果が得られます。なぜこれが起こっているのですか?

これは、JSP の JDBC コードの一部です。

String database = "routes";
String routes_table = "routes_table";
String column_time = "time";
<%
    try {
        Class.forName("com.mysql.jdbc.Driver"); //Load the MySQL driver
        con = DriverManager.getConnection("jdbc:mysql://localhost/"
                + database, "root", "admin");
        stmt = con.createStatement();

        String currentDATETIME = new TimeToolbox().getCurrentDATETIME();

        rs = stmt.executeQuery("SELECT * FROM " + routes_table + " WHERE "
                + column_time + " > '" + currentDATETIME + "'"
                + " ORDER BY " + column_time);
%>
4

1 に答える 1

1

日付の値を渡すには、パラメータとDate変数を含むPrepared Statementsを使用する必要があります。このようにして、問題を解決し、SQL インジェクションを防ぐことができます ...

String query = "SELECT * FROM " + routes_table + " WHERE "
                + column_time + " > ?"
                + " ORDER BY " + column_time;
PreparedStatement prest = con.prepareStatement(query);
prest.setDate(1,new Date());
于 2012-05-28T06:08:37.287 に答える