Почему я получаю <java.sql.SQLException: ORA-00904: «ПАРОЛЬ»: неверный идентификатор>

1

Это модельная часть моего MVC-приложения, и она должна связываться с базой данных (Oracle 10g XE). Вот код, который я написал,

package com.cid_org.model;

import java.sql.*;

public class LoginModelPOJO {

private String username;
private String password;
private Connection connection;

public LoginModelPOJO(String username, String password, Connection connection){
    this.username = username;
    this.password = password;
    this.connection = connection;
    validate();
}

private void validate(){
    try {
        String query = "SELECT * FROM CRIME_SOLVING_OFFICIAL where OFFICIAL_USERNAME=? and OFFICIAL_PASSWORD=?";
        PreparedStatement ps = connection.prepareStatement(query);
        ps.setString(1, username);
        ps.setString(2, password);
        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
             // String name=rs.getString(3);
              System.out.println("success");
        } else {
            System.out.println("access denied");
        }
    } catch (Exception e) {
        System.out.println("Connection " + e);
      }
}
}

но по мере его выполнения он генерирует следующую ошибку:

Connection java.sql.SQLException: ORA-00904: "PASSWORD": invalid identifier

Вот таблица, которую я создал в Oracle,

Вот изображение Изображение 174551

Кстати, я знаю, что этот вопрос будет заклеймен как дублирующий вопрос, и действительно, это только FYI. Я просмотрел все доступные сообщения, связанные с этим вопросом (вы можете видеть все вкладки, открытые в firefox на картинке), но не смогли найти ответ.

Изменение: я сделал все строки "пароля", чтобы исчезнуть из-за идентификатора "ПАРОЛЬ", о котором говорит Исключение. И я также изменил имя столбца OFFICIAL_PASSWORD на OFFICIAL_PWD, чтобы быть уверенным в вещах.

Вот форма login.html,

<!DOCTYPE html>

<html>
    <head>
    <meta charset="utf-8">
    <title>Criminal Investigation Department-Home</title>


<link rel="stylesheet" href="css/login_page.css">
</head>

<body>
<img src="css/images/logo/CID_Logo_1.png" alt="CID Logo">
<nav id="navigation">
    <a id="link1" class="header_links" href="most_wanted.html">Most Wanted</a>
    <a id="link2" class="header_links" href="hotnews.html">Hot News</a>
    <a id="link3" class="header_links" href="report_crime.html">Report Crime</a>
    <a id="link4" class="header_links" href="login.html">Login</a>
    <a id="link5" class="header_links" href="about.html">About Us</a>
    <a id="link6" class="header_links" href="contact.html">Contact Us</a>
    <a id="link7" class="header_links" href="safety_measures.html">Safety Measures</a>
</nav>
<div id="login_page_border">
    <form action="LoginScript.do" method="POST">
        <div id="form_border">
        <span id="login_label">Login</span><br>
        <div id="login_contents">
        <span class="login_field">Username:</span> <input name="username" type="text"><br><br>
        <span class="login_field">Password:</span> <input name="pass" type="password">
        <input id="login_button" type="submit" value=" ">
        </div>
    </div>
    </form>
</div>
</body>

Вот сервлет контроллера,

package com.cid_org.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cid_org.model.*;

import java.sql.*;

/**
 * Servlet implementation class LoginControllerServlet
 */

public class LoginControllerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public LoginControllerServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    /*Take the data submitted by the user though the login 
     * form(Remember the HTTP Post request ->HttpServletRequest request object*/
    String username = request.getParameter("username");
    String pwd = request.getParameter("pass");
    System.out.println(username + "aaa");
    System.out.println(pwd);
    Connection connection = (Connection)getServletContext().getAttribute("connection_context_param");

    LoginModelPOJO lmpojo = new LoginModelPOJO(username, pwd, connection);
    boolean isValidFlag = lmpojo.isValid();

    if(isValidFlag){
        RequestDispatcher view =request.getRequestDispatcher("view_profile.jsp");
        view.forward(request, response);
    }
    else{
        response.sendRedirect("/CrimeReportingSystem/static/login_access_denied.html");
    }

}

}

И вот немного модифицированная версия части модели,

package com.cid_org.model;

import java.sql.*;

public class LoginModelPOJO {

private String username;
private String pwd;
private Connection connection;
private boolean isValidFlag;

public LoginModelPOJO(String username, String pwd, Connection connection){
    this.username = username;
    this.pwd = pwd;
    this.connection = connection;
    isValidFlag=false;
    validate();
}

private void validate(){
    try {

        String query = "SELECT * FROM CRIME_SOLVING_OFFICIAL where OFFICIAL_USERNAME=? and OFFICIAL_PWD=?";
        PreparedStatement ps = connection.prepareStatement(query);
        ps.setString(1, username);
        ps.setString(2, pwd);
        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
             // String name=rs.getString(3);
              System.out.println("success");
              isValidFlag = true;
        } else {
            System.out.println("access denied");
        }
    } catch (Exception e) {
        System.out.println("Connection " + e);
      }
}

public boolean isValid(){
    return isValidFlag;
}
}

Наконец, вот ContextListener,

package com.cid_org.listener;

import java.sql.*;

import javax.servlet.*;


/*This listener will initialize a connection and set the context
 * attribute reference with a string at the time of application deployment time or
 * when the ServletContext will be initialized*/
public class DatabaseServletContextListener implements ServletContextListener {

Connection connection = null;
public void contextInitialized(ServletContextEvent event) {
    ServletContext sc = event.getServletContext();
    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "java");
        System.out.println("la la la ...");
        //Set the Attribute for the connection
        sc.setAttribute("connection_context_param", connection);
    }
    catch(Exception e){
        //To be decided Later- I dislike "checked" exceptions
        System.out.println("conn...bzzz "+e);
    }

}

public void contextDestroyed(ServletContextEvent event) {
    try {
        /*Connection will be closed at the time of undeployment of the application or
         * when the context is destroyed*/
        connection.close();
    } catch (Exception e) {
        System.out.println("connection pika fucked " + e);
    }
}

}

Btw: Ошибка все тот же.

  • 0
    Пароль - это ключевое слово - спросите Google, как избежать восстановленных ключевых слов
  • 0
    @pulp_fiction Это странно. Значение пароля совпадает со строкой "ПАРОЛЬ"?
Показать ещё 9 комментариев
Теги:

1 ответ

0

Я бы порекомендовал посмотреть, с чего начинаются ваши строки имени пользователя и пароля:

System.out.println(username);
System.out.println(password);

Просто чтобы убедиться, что вы не получаете нули, запустите запрос непосредственно в Oracle и посмотрите, дает ли он ошибку с кодом, который у вас выше, т.е.:

SELECT * FROM CRIME_SOLVING_OFFICIAL where OFFICIAL_USERNAME= *Your username and OFFICIAL_PASSWORD=*YourPassword

См., Если это дает ошибку, если это вызывает синтаксис SQL.

  • 0
    К сожалению, я не могу дать вам +1 из-за моей репутации, но спасибо за совет, но это не решило мою проблему. Я привязал размещение операторов println, и он ничего не печатает на консоли, и это странное поведение но в любом случае я опубликую полную информацию, чтобы понять, что происходит.
  • 0
    Попробуйте использовать скобки, это может помочь остановить, если пароль является зарезервированным словом, например Заменить: SELECT * FROM CRIME_SOLVING_OFFICIAL, где OFFICIAL_USERNAME =? и OFFICIAL_PWD =? WITH: SELECT * FROM [CRIME_SOLVING_OFFICIAL], где [OFFICIAL_USERNAME] =? и [OFFICIAL_PWD] =? Я занимаюсь разработкой приложения на языке c #. Мне кажется, что следующий код очень полезен, чтобы увидеть значения, которые могут помочь самим себе: Response.Write (@ "<script language = 'javascript'> alert ('Значение вашего varable равно" + Variable + ".') </ скрипт> "); В вашем примере это будет: Response.Write (@ "<script language = 'javascript'> alert ('" + username + ".'); </ Script>");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню