0

当我清楚地识别出变量时,Oracle 不断给我一个无效的标识符错误。

  //get parameters from the request
   String custID=request.getParameter("cust_ID");
   String saleID=request.getParameter("sale_ID");
   String firstName=request.getParameter("first_Name");
   String mInitial=request.getParameter("mI");
   String lastName=request.getParameter("last_Name");
   String streetName=request.getParameter("street");
   String city=request.getParameter("city");
   String state=request.getParameter("state");
   String zipCode=request.getParameter("zip_Code");
   String DOB2=request.getParameter("DOB");
   String agentID=request.getParameter("agent_ID");
   String homePhone=request.getParameter("home_Phone");
   String cellPhone=request.getParameter("cell_Phone");
   String profession=request.getParameter("profession");
   String employer=request.getParameter("employer");
   String referrer=request.getParameter("referrer");


  query =
    "UPDATE customer"
    + " SET customer.cust_ID=custID, customer.sale_ID=saleID, customer.first_Name=firstName, customer.mI=mInitial, customer.last_Name=lastName, customer.street_Name=streetName, customer.city=city, customer.state=state, customer.zip_Code=zipCode,customer. DOB=DOB2, customer.agent_ID=agentID, customer.home_Phone=homePhone, customer.cell_Phone=cellPhone, customer.profession=profession, customer.employer=employer, customer.referrer=referrer"
    + " WHERE customer.cust_ID=custID " ;

  preparedStatement = conn.prepareStatement(query);


  preparedStatement.executeUpdate();

SQL 表

        CREATE TABLE customer
          (cust_ID      NUMBER          NOT NULL,
          sale_ID       NUMBER          NOT NULL,
          first_NameVARCHAR2(30)                NOT NULL,
          mI            VARCHAR2(2)         ,
          last_Name     VARCHAR2(50)        NOT NULL,
          street_Name       VARCHAR2(50)        ,
          city          VARCHAR2(30)        NOT NULL,
          state         VARCHAR2(50)        NOT NULL,
          zip_Code      VARCHAR2(5)     NOT NULL,
          DOB           DATE            ,
          agent_ID      NUMBER              ,
          home_Phone        VARCHAR2(12)        UNIQUE,         
          cell_Phone        VARCHAR2(12)        UNIQUE,
          profession        VARCHAR2(30)            ,
          employer      VARCHAR2(30)            ,
          referrer      VARCHAR2(30)            
   );       
4

3 回答 3

6

您的代码没有按照您的想法执行。看这个:

query =
"UPDATE customer"
+ " SET customer.cust_ID=custID, customer.sale_ID=saleID, customer.first_Name=firstName, customer.mI=mInitial, customer.last_Name=lastName, customer.street_Name=streetName, customer.city=city, customer.state=state, customer.zip_Code=zipCode,customer. DOB=DOB2, customer.agent_ID=agentID, customer.home_Phone=homePhone, customer.cell_Phone=cellPhone, customer.profession=profession, customer.employer=employer, customer.referrer=referrer"
+ " WHERE customer.cust_ID=custID "

query此时的内容正是将要发送到数据库的内容。在将查询发送到数据库之前, JSP不会神奇地为您填写custID, saleID(等等)。正因为如此,Oracle 不知道是什么custID(它肯定不是表中其他列的名称customer)。因此,您会收到无效标识符错误。

认为您正在尝试这样做:

query =
"UPDATE customer"
+ " SET customer.cust_ID=" + custID + ", customer.sale_ID=" + saleID + ...

就像提到的 duffymo 一样,这会带来严重的 SQL 注入麻烦(想想客户端可以提交的值,以便通过该custID字段劫持您的 SQL)。更好的方法是在 a 上使用参数PreparedStatement

query =
"UPDATE customer"
+ " SET customer.cust_ID=?, customer.sale_ID=? ...";

PreparedStatement statement = conn.prepareStatement(query);
statement.setString(1, custID);
statement.setString(2, saleID);
statement.executeUpdate();
于 2011-04-17T17:48:41.430 回答
5

我建议不要在您的 JSP 中使用脚本。尽可能快地学习 JSTL。

答案似乎很明显:您的参数都是字符串,但 Oracle 模式有一些数据和数字类型。插入时必须转换为正确的类型。

此代码正在乞求 SQL 注入攻击。在 INSERT 之前不进行任何绑定或验证。你不可能比这更不安全。我希望您不打算将此站点用于网络上的任何内容。

更好的方法是将 scriptlet 代码从 JSP 中取出,只使用 JSTL 来编写它,并引入一个 servlet 和一些其他层来帮助绑定、验证、安全等。

于 2011-04-17T16:30:08.493 回答
2

我认为在 sql 查询中,您在客户、DOB 之间输入了空格。

顾客。出生日期=出生日期2

于 2011-04-17T18:12:47.620 回答