2013-03-19 25 views
0

每次当我运行下面的PHP代码我得到的输出错误使用Oracle序列在PHP

预订确认!恭喜。您的预订ID为:6

预订成功。

该bookingid是一个序列,然后我得到的预订ID形式插入的值来获得序列的当前值。所以我不知道我做错了什么。

<html><body> 
    <?php 
     $con = oci_connect("system", "password", "localhost/XE"); 
      if (!$con) { 
      $m = oci_error(); 
     exit('Connect Error ' . $m['message']); 
     } 
     $thid = $_GET["hid"]; 
     $trno = $_GET["rno"]; 
     $tgid = $_GET["gid"]; 
     $sd = $_GET["sdate"]; 
     $ed = $_GET["edate"]; 
     $dchange = "ALTER SESSION SET NLS_DATE_FORMAT= 'YYYY-MM-DD'"; 
     $stid1 = oci_parse($con,$dchange); 
     oci_execute($stid1); 
     $c1 = "SELECT * FROM B WHERE HOTELID = '$thid' AND ROOMNO = '$trno' AND ((STARTDATE < '$sd' AND ENDDATE > '$sd') or (STARTDATE < '$ed' AND ENDDATE > '$ed') or (STARTDATE >= '$sd' AND ENDDATE <= '$ed'))"; 
     $c2 = oci_parse($con, $c1); 
     oci_execute($c2); 
     $row = oci_fetch_row($c2); 
     if(!$row) 
     { 
     $temp = "INSERT INTO B VALUES(bno.nextval,'$thid','$trno','$tgid','$sd','$ed')"; 
     $stid = oci_parse($con,$temp); 
     oci_execute($stid); 
     oci_free_statement($stid); 
     //$c7 = "SELECT bookid FROM B WHERE HOTELID = '$thid' AND ROOMNO = '$trno' AND GUEStID = '$tgid' AND STARTDATE = '$sd' AND ENDDATE = '$ed'"; 
     //printf("<h3>Booking Confirmed! Congatulation. </h3>") ; 
     **$c8 = oci_parse($con, "SELECT MAX(BOOKID) FROM B"); 
     oci_execute($c8); 
     printf("<h3>Booking Confirmed! Congratulation. Your Booking Id is: %u</h3>", $c8);** 
     } 
     else 
      printf("<h3>Booking already exist. </br>Please try with another search.</h3>"); 


     ?> 
</n> <form action="index.php"><input type="submit" value="BACK" /> 
    </form> 

</BODY> 

回答

0

为您提供了一些建议。

  1. 你应该使用bind variables并在SQL语句中不拼接文本(除非你想让你的数据库的性能,您填写的共享池最多降低)。

  2. SELECT MAX(BOOKID) FROM B是获取预订ID的错误和不安全的方式。就好像两个并行的会话进行了预订一样,您可能会得到错误的结果(如果表中的最大ID高于当前序列值,您也可能得到错误的结果)。而不是select bno.currval from dual或使用returning clause作为插入的一部分(假设PHP适用于该插入)

  3. 对于您的插入,您应该指定好的练习的列名称。即做INSERT INTO B (BOOKID, HOTELID, ROOMNO, STARTDATE, ENDDATE) VALUES(bno.nextval....

+0

我没有任何平行预订..但仍然我没有得到正确的预订ID。首先,我尝试了bno.currval,但即便如此,也没有尝试过其他方式。但输出没有变化。在我试图检索bookingid的那个部分存在一些问题。因为如果我检查我的预订表,它是正确插入的。 – 2013-03-19 22:15:10

+0

@HarshShah虽然maxi(bookid)的oci_fetch_row是哪里?你似乎正在打印语句句柄ID'$ c8'与提取的行值 – DazzaL 2013-03-19 22:17:46

+0

谢谢Dazzal找出我错在哪里。感谢它的工作。 – 2013-03-19 22:30:53