Где я могу ошибаться в этом сценарии разбиения на страницы PHP ORACLE? - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть проблема, из-за которой я не могу отображать записи из базы данных 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";

    ?>

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

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

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

1 голос
/ 27 сентября 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();  
0 голосов
/ 27 сентября 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>";

         ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...