0

次のPHPコードを実行するたびに、出力が得られます

予約確定!おめでとうございます。あなたの予約IDは: 6

予約を成功させるために。

予約IDはシーケンスであり、挿入された値からその予約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>

4

1 に答える 1

0

あなたのためのいくつかの提案。

  1. SQLステートメントでリテラルをスプライスしないでバインド変数を使用する必要があります(共有プールがいっぱいになるとDBのパフォーマンスが低下する場合を除く)。

  2. SELECT MAX(BOOKID) FROM B予約IDを取得するための間違った安全でない方法です。2つのセッションが並行して予約されたかのように、間違った結果が得られる可能性があります(テーブルの最大IDが現在のシーケンス値よりも大きい場合にも、間違った結果が得られる可能性があります)。代わりに、挿入の一部としてreturning句select bno.currval from dualを実行または使用します(PHPがそれで動作すると仮定します)

  3. 挿入では、グッドプラクティスのために列名を指定する必要があります。すなわちしますINSERT INTO B (BOOKID, HOTELID, ROOMNO, STARTDATE, ENDDATE) VALUES(bno.nextval....

于 2013-03-19T22:05:12.353 に答える