2011-09-26 18 views
0

我有這個問題,我無法使用PHP作爲服務器端腳本語言將記錄從oracle數據庫顯示到我的web應用程序。有人請告訴我我可能做錯的地方嗎?我希望在一天結束時能夠實現分頁,並用用戶在從一頁頁面移動到另一頁面時可以操作的變量替換ROWNUM和rnum。我在哪裏可以在這個PHP ORACLE分頁腳本中做錯?

 <?php 

    /* Connection string to Oracle view */ 
    /* user is patients */ 
    /* password is patients */ 
    $conn=oci_connect('patients','patients','192.168.1.100/hosecare'); 

    /* Query expected to do pagination and get records */ 
    $qry="select * 
    from (select a.*, ROWNUM rnum 
    from (select BILL_NO,AK_NO,PAT_NAME,VOUCHER_DATE,USER_NAME,PAYMENT_AMT from patients WHERE VOUCHER_DATE >='01-Sep-2011' AND VOUCHER_DATE <='26-Sep-2011' AND SOURCE_LOCATION='KIAMBU CLINIC' ORDER BY VOUCHER_DATE)a 
    where ROWNUM <=20) 
    where rnum >=10;"; 


    $stid=oci_parse($conn,$qry); 
    oci_execute($stid); 

    /* Table begins here */ 
    echo "<table border='1'>\n"; 
    echo "<tr>\n"; 

    /* Table Column headers */ 
    echo "<td>".'<h3>BILL NO</h3>'."</td>"; 
    echo "<td>".'<h3>ACCOUNT NO</h3>'."</td>"; 
    echo "<td>".'<h3>PATIENT NAME</h3>'."</td>"; 
    echo "<td>".'<h3>VOUCHER DATE</h3>'."</td>"; 
    echo "<td>".'<h3>USER NAME</h3>'."</td>"; 
    echo "<td>".'<h3>PAYMENT AMOUNT</h3>'."</td>"; 
    echo "</tr>\n"; 

    /* Populating Table cells with records resulting from the pagination query */ 
    while($row=oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS)) { 
    echo "<tr>\n"; 
    foreach($row as $item){ 
      echo "<td>".($item !==null ? htmlentities($item,ENT_QUOTES) : "&nbsp;")." </td>\n"; 
    } 
    echo "</tr>\n"; 
    } 

    echo "</table>\n"; 

    ?> 
+1

什麼是實際問題。錯誤或沒有數據返回。 – Sodved

+0

沒有數據返回。 –

回答

0

我意識到由於查詢中的SOURCE_LOCATION之前的前一個不必要的空間以及查詢結尾處的不必要的分號(;),問題就出現了。

代碼完美地按照我想要的方式工作。感謝每個人和每個人對您爲回答問題做出的貢獻。

我非常感謝您的努力。

工作代碼現在看起來如下:

 <?php 

     //Connection string to Oracle view 
     //user is patients 
     //password is patients 
     $conn=oci_connect('patients','patients','192.168.1.100/hosecare'); 
     //Query expected to do pagination and get records 

     //$page will vary depending on which page the user has accessed. 

     $page=1; 
     $pageSize=20; 
     $maxrowfetch=(($page * $pageSize) + 1); 
     $minrowfetch=((($page - 1) * $pageSize) + 1); 

     //QUERY WORKING...MODIFIED TO FIT USER REQUIREMENTS 
     $qry="select * 
     from (select a.*, ROWNUM rnum 
     from (select BILL_NO,AK_NO,PAT_NAME,VOUCHER_DATE,USER_NAME,PAYMENT_AMT from smart WHERE VOUCHER_DATE >='20-Sep-2011' AND VOUCHER_DATE <='26-Sep-2011' AND SOURCE_LOCATION='KIAMBU CLINIC' ORDER BY BILL_NO ASC)a 
     where ROWNUM <="."$maxrowfetch".") 
     where rnum >="."$minrowfetch".""; 


     //QUERY NOT WORKING...THE 2 SPACES BEFORE SOURCE_LOCATION IN THE QUERY WAS THE PROBLEM 
     /*** 
     $qry="select * 
     from (select a.*, ROWNUM rnum 
     from (select BILL_NO,AK_NO,PAT_NAME,VOUCHER_DATE,USER_NAME,PAYMENT_AMT from patients WHERE VOUCHER_DATE >='01-Sep-2011' AND VOUCHER_DATE <='26-Sep-2011' AND SOURCE_LOCATION='KIAMBU CLINIC' ORDER BY VOUCHER_DATE ASC)a 
     where ROWNUM <=20) 
     where rnum >=10"; 
     ***/ 


     //QUERY WORKING...1 SPACE BEFORE SOURCE_LOCATION IN QUERY 
     /*** 
     $qry="select * 
     from (select a.*, ROWNUM rnum 
     from (select BILL_NO,AK_NO,PAT_NAME,VOUCHER_DATE,USER_NAME,PAYMENT_AMT from patients WHERE VOUCHER_DATE >='01-Sep-2011' AND VOUCHER_DATE <='26-Sep-2011' AND SOURCE_LOCATION='KIAMBU CLINIC' ORDER BY VOUCHER_DATE ASC)a 
     where ROWNUM <=20) 
     where rnum >=10"; 
     ***/ 


     $stid=oci_parse($conn,$qry); 
     oci_execute($stid); 

     //Table begins here 
     echo "<table border='1'>\n"; 
     echo "<tr>\n"; 

     //Table Column headers 
     echo "<td>".'<h3>BILL NO</h3>'."</td>"; 
     echo "<td>".'<h3>ACCOUNT NO</h3>'."</td>"; 
     echo "<td>".'<h3>PATIENT NAME</h3>'."</td>"; 
     echo "<td>".'<h3>VOUCHER DATE</h3>'."</td>"; 
     echo "<td>".'<h3>USER NAME</h3>'."</td>"; 
     echo "<td>".'<h3>PAYMENT AMOUNT</h3>'."</td>"; 
     echo "</tr>\n"; 

     //Populating Table cells with records resulting from the pagination query 
     while($row=oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS)) { 
     echo "<tr>\n"; 


      echo "<td>"; 
      echo $row["BILL_NO"]; 
      echo "</td>"; 
      echo "<td>"; 
      echo $row["AK_NO"]; 
      echo "</td>"; 
      echo "<td>"; 
      echo $row["PAT_NAME"]; 
      echo "</td>"; 
      echo "<td>"; 
      echo $row["VOUCHER_DATE"]; 
      echo "</td>"; 
      echo "<td>"; 
      echo $row["USER_NAME"]; 
      echo "</td>"; 
      echo "<td>"; 
      echo $row["PAYMENT_AMT"]; 
      echo "</td>"; 
      echo "</tr>"; 


     } 

     echo "</table>\n"; 

     echo "MAX ROW FETCH ".$maxrowfetch."<br>"; 
     echo "MIN ROW FETCH ".$minrowfetch."<br>"; 
     echo $qry."<br>"; 

     ?> 
2

如果你得到一個錯誤的最有可能的;在查詢的結束將導致錯誤。 ;不是SQL本身的一部分,它通常只需要你正在玩的任何客戶端來標記SQL的結尾。因此,在程序中嵌入普通的SQL時,你不應該用;

注結束吧:如果;是PL/SQL的一部分,所以如果你嵌入您需要包括它

+0

我已經刪除了;在查詢結束時,它現在看起來像這樣:(select a。*,ROWNUM rnum from(select BILL_NO,AK_NO,PAT_NAME,VOUCHER_DATE,USER_NAME,PAYMENT_AMT from WHERE VOUCHER_DATE> =' 2011年9月1日'AND VOUCHER_DATE <='26-Sep-2011'和SOURCE_LOCATION ='KIAMBU CLINIC'ORDER BY VOUCHER_DATE)a 其中ROWNUM <= 20) 其中rnum> = 10「;但它尚未顯示任何數據。 –

+1

很抱歉,如果這是一個愚蠢的問題,但是如果您從查詢中刪除了兩個ROWNUM檢查,您是否已驗證是否獲取了數據(以及多於10行)? – Sodved

+0

謝謝sodved.I實際上是這樣做的,只要我這樣做,我意識到在查詢中存在SOURCE_LOCATION之前的一些不必要的空間,導致查詢失敗。感謝您提供此洞察。它幫了很多忙。謝謝一堆 –

1

ROWNUM是在返回結果集後計算,因此不會幫助分頁腳本,就好像您希望內部查詢中的行在完整查詢中作爲第10-20行返回一樣,它將重置並從1開始。

嘗試改爲使用使用ROW_NUMBER()進行分析查詢,而不是像這樣

SELECT * FROM 
(SELECT BILL_NO, 
     AK_NO, 
     PAT_NAME, 
     VOUCHER_DATE, 
     USER_NAME, 
     PAYMENT_AMT, 
     ROW_NUMBER() OVER (ORDER BY VOUCHER_DATE ASC) RN 
    FROM patients  
    WHERE VOUCHER_DATE >='01-Sep-2011' 
    AND VOUCHER_DATE <='26-Sep-2011' 
    AND SOURCE_LOCATION='KIAMBU CLINIC' 
    ORDER BY VOUCHER_DATE) 
WHERE RN BETWEEN 10 and 20; 

從性能的角度來看,上面的內容並不是很好,因爲它會觸發數據庫服務器並且每次都請求完整的結果集,所以如果您可以運行查詢來獲取數據一次,然後使用PHP以編程方式使用前向/後向鏈接遍歷結果集。

要試試這個,看看這個php pagination script(雖然這是針對MySQL的,它應該給你一個起點寫類似使用Oracle一些東西,不導致性能問題)

//Include the PS_Pagination class 
include('ps_pagination.php'); 

//Connect to mysql db 
$conn = mysql_connect('localhost','root',''); 
mysql_select_db('yourdatabase',$conn); 
$sql = 'SELECT post_title FROM wp_posts WHERE post_type="post" ORDER BY ID DESC'; 

//Create a PS_Pagination object 
$pager = new PS_Pagination($conn,$sql,10,10); 

//The paginate() function returns a mysql result set 
$rs = $pager->paginate(); 
while($row = mysql_fetch_assoc($rs)) { 
    echo $row['post_title'],"\n"; 
} 

//Display the full navigation in one go 
echo $pager->renderFullNav(); 
+0

謝謝Trevor ..我後來意識到我的問題來自哪裏..我也會嘗試你的方法..所有的想法都讓我覺得更好。謝謝 –

+0

謝謝Trevor ..我後來意識到我的問題來自哪裏..這就是AND和SOURCE_LOCATION.I之間的額外空間,我也會嘗試你的方法..所有的想法都讓我覺得更好。 –

相關問題