2011-09-26 50 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之间的额外空间,我也会尝试你的方法..所有的想法都让我觉得更好。 –

相关问题