2011-10-12 41 views
0

我正在使用以下代码来生成SQL。使用oci_execute()时需要帮助删除ORA-00911错误()

$sql = "INSERT INTO SUBSTATION VALUES (". 
      "SEQ_SUBSTATION_FEATURE_ID.NEXTVAL, ". 
      "'".$_REQUEST['substationName']."', ". // SUBSTATION NAME 
      "null, ".        // SLD_PATH  
      "null, ".        // GEOMETRY 
      "'".$_REQUEST['substationType']."', ". // SUBSTATION_TYPE 
      $_REQUEST['capacity'].", ".    // CAPACITY 
      "'".$_REQUEST['address_1']."', ".  // ADDRESS_1 
      "'".$_REQUEST['address_2']."', ".  // ADDRESS_2 
      "'".$_REQUEST['landmark']."', ".  // LANDMARK 
      "'".$_REQUEST['state']."', ".   // STATE 
      "'".$_REQUEST['district']."', ".  // DISTRICT 
      "'".$_REQUEST['pin']."', ".    // PIN 
      $_REQUEST['noOfTransformers'].", ".  // NO_OF_TRANSFORMERS 
      $_REQUEST['noOfLTBreakers'].", ".  // NO_OF_LT_BREAKERS 
      $_REQUEST['noOfHTBreakers'].", ".  // NO_OF_HT_BREAKERS 
      $_REQUEST['noOfHTIsolators'].", ".  // NO_OF_HT_ISOLATORS 
      $_REQUEST['noOfLTBoards'].", ".   // NO_OF_LT_BOARDS 
      "to_date('".$_REQUEST['commissioningDate']."','DD/MM/YYYY'), ". // COMMISSIONING DATE 
      "'".$_REQUEST['schemeNo']."', ".  // SCHEME_NO 
      "to_date('".$_REQUEST['schemeDate']."','DD/MM/YYYY'), ".  // SCHEME_DATE 
      "'".$_REQUEST['comments']."', ".  // COMMENTS 
      "'N', ".        // APPROVED 
      "null, ".        // APPROVER 
      "null);";        // APPROVED_ON 

这里是SQL生成

INSERT INTO SUBSTATION VALUES 
(SEQ_SUBSTATION_FEATURE_ID.NEXTVAL, 'S/S 3 4400', NULL, NULL, 'D', 5000, 
'The Address 1', 'The Address 2', 'The Landmark', '15', '1', '234234', 
34, 65, 12, 98, 43, 
to_date('01/09/2010','DD/MM/YYYY'), 'Scheme 12345', 
to_date('06/10/2010','DD/MM/YYYY'), 'This substation has following assets', 
'N', null, null); 

现在,我直接运行在SQL Developer中生成的SQL,它工作正常。但是,当我运行查询使用oci_execute($ sql)PHP,它不起作用。虽然使用下面的代码调试:

$st = oci_parse($conn, $sql) or die("<br />Error parsing query. "); 
if(!oci_execute($st)){ 
    $err = oci_error($st); 
    echo $err['message']; 
} 

它显示错误消息:

ORA-00911:非法字符

任何帮助,请.......

+0

请使用带有绑定参数的查询,而不是串联的串在一起的:它会让你的插入更容易理解,将工作时的一个你输入包含单引号,并且会阻止SQL注入。 – Codo

回答

1

在生成的SQL语句末尾删除分号,然后重试。

+0

嗨,我试过了。但没有运气。看到我已经设置的解决方案。谢谢反正 –

+0

为我工作,谢谢! – maialithar

0

我通过使用oci_bind_by_name来解决问题以准备语句。请参考以下链接...

Inserting data in oracle database using php

我摆脱了ORA-00911的。这一次,错误ORA-01461,这是无效月份,同时插入日期。以下链接解决了这个问题...

[Resolved] ORA-01461 Error on ocibindbyname

感谢

+0

我很高兴你可以使用绑定参数解决它。这将一次解决五个问题:您最初的问题,代码的可读性,引号,SQL注入以及不要忘记速度。 – Codo