Где я могу ошибаться в этом скрипте разбиения на страницы PHP ORACLE?

У меня есть эта проблема, из-за которой я не могу отображать записи из базы данных оракула в своем веб-приложении, используя PHP в качестве языка сценариев на стороне сервера. Может ли кто-нибудь сказать мне, где я мог делать неправильно? Я хочу, чтобы к концу дня можно было выполнить разбиение на страницы и заменить ROWNUM и rnum переменными, которыми пользователи могут манипулировать при переходе со страницы на страницу.

     <?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";

    ?>

person Joseph    schedule 26.09.2011    source источник
comment
В чем собственно проблема. Ошибка или данные не возвращены.   -  person Sodved    schedule 26.09.2011


Ответы (3)


Если вы получаете сообщение об ошибке, скорее всего, ; в конце вашего запроса вызовет ошибку. ; не является частью самого SQL, он обычно требуется любому клиенту, с которым вы играете, чтобы отметить конец SQL. Поэтому при встраивании простого SQL в программу вы не должны заканчивать его ;

ПРИМЕЧАНИЕ. Если ; является частью PL/SQL, поэтому, если вы встраиваете его, вам необходимо включить его

person Sodved    schedule 26.09.2011
comment
я удалил ; в конце запроса, и теперь он выглядит следующим образом: -2011' AND VOUCHER_DATE ‹='26-Sep-2011' AND SOURCE_LOCATION='KIAMBU CLINIC' ORDER BY VOUCHER_DATE)a где ROWNUM ‹=20) где rnum ›=10; но тогда он еще не отображал никаких данных. - person Joseph; 26.09.2011
comment
Извините, если это глупый вопрос, но вы подтвердили, что получаете данные (и более 10 строк), если вы удаляете две проверки ROWNUM из запроса? - person Sodved; 26.09.2011
comment
Спасибо, sodved. Я действительно сделал именно это, и как только я сделал это таким образом, я понял, что перед SOURCE_LOCATION в запросе был ненужный пробел, и это приводило к сбою запроса. Спасибо за понимание. Это очень помогло. Огромное спасибо - person Joseph; 27.09.2011

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 (хотя он и против 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();  
person Trevor North    schedule 27.09.2011
comment
Спасибо, Тревор. Позже я понял, откуда возникла моя проблема. Я также попробую ваш подход. Все ваши идеи заставили меня лучше думать. Спасибо - person Joseph; 27.09.2011
comment
Спасибо, Тревор. Позже я понял, откуда взялась моя проблема. Это дополнительное пространство между AND и SOURCE_LOCATION. Я также попробую ваш подход. Все ваши идеи заставили меня лучше думать. - person Joseph; 27.09.2011

Я понял, что проблема возникла из-за предыдущего ненужного пробела перед 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>";

         ?>
person Joseph    schedule 27.09.2011