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 は、クエリをデータベースに送信する前に、魔法のように, (etc...) を入力しません。このため、オラクルは何が何であるかを明確に把握していません (テーブル内の他の列の名前ではないことは確かです)。したがって、無効な識別子エラーが表示されます。custIDsaleIDcustIDcustomer

あなたはこれをやろうとしていたと思います:

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

duffymo が述べたように、これは深刻な SQL インジェクションの問題を引き起こしています (custIDフィールドを介して SQL をハイジャックするためにクライアントが送信できる値を考えてみてください)。より良い方法は、でパラメータを使用すること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 スキーマにはいくつかのデータ型と数値型があります。INSERT 時に正しい型に変換する必要があります。

このコードは、SQL インジェクション攻撃を求めています。INSERT の前にバインディングや検証を行いません。これよりも安全ではない可能性があります。このサイトをウェブ上で使用するつもりがないことを願っています。

より良いアプローチは、JSP からスクリプトレット コードを取り除き、JSTL のみを使用して記述し、バインディング、検証、セキュリティなどに役立つサーブレットとその他のレイヤーを導入することです。

于 2011-04-17T16:30:08.493 に答える
2

SQLクエリで、顧客とDOBの間にスペースを入力したと思います。

お客様。DOB=DOB2

于 2011-04-17T18:12:47.620 に答える