【问题标题】:pagination always showing page first分页总是首先显示页面
【发布时间】:2015-11-10 16:59:40
【问题描述】:

hy,我在使用 PHP 和 oracle 数据库设置分页时遇到问题,该页面仅显示第一页值。当我单击下一步按钮时,页面从第 1 页更改为第 2 页、第 3 页等,但值仍然与第 1 页相同。我不知道,我不知道如何修复此错误..

这是我设置记录集的代码..

<?php
// Set up recordset
define("ewSqlSelectCount", "SELECT count(*) count FROM sid_mst_dealer", true);
$sSql_count = BuildSqlang(ewSqlSelectCount, ewSqlWhere, ewSqlGroupBy, ewSqlHaving, ewSqlOrderBy, $sDbWhere, $sOrderBy);
//echo "$sSql_count" . "<br/ >";
$rs_count = moi_query($sSql_count , $conn) or die("Failed to execute query at line " . __LINE__ . ": " . moi_error($conn) . '<br>SQL: ' . $sSql);
//echo $rs_count;
oci_execute($rs_count);
$nTotalRecs = oci_fetch_array($rs_count);
$nTotalRecs = $nTotalRecs['COUNT'];

$rs = moi_query($sSql, $conn) or die("Failed to execute query at line " . __LINE__ . ": " . moi_error($conn) . '<br>SQL: ' . $sSql);
//echo $rs;
oci_execute($rs);

if ($nDisplayRecs <= 0) { // Display all records
    $nDisplayRecs = $nTotalRecs;
}
$nStartRec = 1;
SetUpStartRec(); // Set up start record position
?>

这是函数..

function SetUpStartRec()
{

  // Check for a START parameter
  global $nStartRec;
  global $nDisplayRecs;
  global $nTotalRecs;
  if (strlen($_GET[ewTblStartRec]) > 0) 
  {
     $nStartRec = $_GET[ewTblStartRec];
     $_SESSION[ewSessionTblStartRec] = $nStartRec;
  } elseif (strlen($_GET["pageno"]) > 0) 
  {
     $nPageNo = $_GET["pageno"];
     if (is_numeric($nPageNo)) 
     {
         $nStartRec = ($nPageNo-1)*$nDisplayRecs+1;

         if ($nStartRec <= 0) 
         {
            // echo 'jangan ke sini';
            $nStartRec = 1;
         } 
         elseif ($nStartRec >= (($nTotalRecs-1)/$nDisplayRecs)*$nDisplayRecs+1) 
         {
            $nStartRec = (($nTotalRecs-1)/$nDisplayRecs)*$nDisplayRecs+1;

         }
         $_SESSION[ewSessionTblStartRec] = $nStartRec;
     } 
     else 
     {

        $nStartRec = $_SESSION[ewSessionTblStartRec];
        if  (!(is_numeric($nStartRec)) || ($nStartRec == "")) 
        {
            $nStartRec = 1; // Reset start record counter
            $_SESSION[ewSessionTblStartRec] = $nStartRec;
        }
     }
 }

 else 
 {
     $nStartRec = @$_SESSION[ewSessionTblStartRec];
     if (!(is_numeric($nStartRec)) || ($nStartRec == "")) {
        $nStartRec = 1; // Reset start record counter

        $_SESSION[ewSessionTblStartRec] = $nStartRec;
     }
 }
}

这是查询

<?php
  define("ewTblVar", "sid_mst_dealer", true);
  define("ewTblRecPerPage", "RecPerPage", true);
  define("ewSessionTblRecPerPage", "sid_mst_dealer_RecPerPage", true);
  define("ewTblStartRec", "start", true);
  define("ewSessionTblStartRec", "sid_mst_dealer_start", true);
  define("ewTblShowMaster", "showmaster", true);
  define("ewSessionTblMasterKey", "sid_mst_dealer_MasterKey", true);
  define("ewSessionTblMasterWhere", "sid_mst_dealer_MasterWhere", true);
  define("ewSessionTblDetailWhere", "sid_mst_dealer_DetailWhere", true);
  define("ewSessionTblAdvSrch", "sid_mst_dealer_AdvSrch", true);
  define("ewTblBasicSrch", "psearch", true);
  define("ewSessionTblBasicSrch", "sid_mst_dealer_psearch", true);
  define("ewTblBasicSrchType", "psearchtype", true);
  define("ewSessionTblBasicSrchType", "sid_mst_dealer_psearchtype", true);
  define("ewSessionTblSearchWhere", "sid_mst_dealer_SearchWhere", true);
  define("ewSessionTblSort", "sid_mst_dealer_Sort", true);
  define("ewSessionTblOrderBy", "sid_mst_dealer_OrderBy", true);
  define("ewSessionTblKey", "sid_mst_dealer_Key", true);

  // Table level SQL
  define("ewSqlSelect", "SELECT * FROM sid_mst_dealer", true);
  if($_REQUEST[dealer_id]==""){
     if($_REQUEST[x_status]!=""){
     define("ewSqlWhere", " active_flag ='".$_REQUEST[x_status]."'", true);
    }else{
       define("ewSqlWhere", "active_flag='0'", true);
    }
  }else{
    define("ewSqlWhere", "", true);
   }
  define("ewSqlGroupBy", "", true);
  define("ewSqlHaving", "", true);
  define("ewSqlOrderBy", "", true);
  define("ewSqlOrderBySessions", "", true);
  define("ewSqlKeyWhere", "dealer_id = '@dealer_id'", true);
  define("ewSqlUserIDFilter", "", true);
?>

我真的需要帮助来解决这个问题。谢谢你:D

【问题讨论】:

  • 该代码很难阅读 - 是否有一个 limit 子句潜伏在那里?
  • @RamRaider 我也有同样的问题,这不是我的代码,我只是为此做增强。所以我对此一无所知..真的很困惑..我试图理解这一点,但这很难。
  • @user3661054 如果需要实现分页查询,那么看How pagination query works

标签: php oracle pagination


【解决方案1】:

我认为问题在于那个晦涩的 sql 中缺乏限制,这是分页难题的关键部分。如果您考虑以下几点:

select * from `users` where `name`='fred' limit 0,10;

这将显示用户称为“Fred”的前 10 条记录,然后

select * from `users` where `name`='fred' limit 10,10;

第二条语句将显示用户名为“Fred”的接下来 10 条记录

我根本不了解您构建 sql 的方法,但 IMO 您需要添加一个限制 - 以及用于计算您所在记录集中哪个 page 的相关逻辑,以便您可以添加下一个/上一个链接。

【讨论】:

  • 这应该是Oracle SQL 语法吗?因为 Oracle 不支持 LIMIT
  • 哪个 - 上面的 sql?不-它不应该是Oracle SQL,也许Oracle中没有limit~从来没有为Oracle db写过sql
  • 意思是,OP 使用的是Oracle 数据库。如果要在 Oracle 数据库上执行该查询,则会由于语法错误而失败,因为 Oracle 不支持 LIMIT。 Oracle中有不同的分页方式。对于pre-12c 版本,使用ROWNUM 进行分页查询。 12c 使用 FECTH 提供 Top-n 查询。 stackoverflow.com/questions/30321483/…
  • 那么,这个错误的最佳答案是什么? sql查询有什么错误吗??
  • @user3661054 我在你的代码中根本看不到任何分页。
【解决方案2】:

这是分页..

<table border="0" cellspacing="0" cellpadding="0">
                    <tr>
                      <td><span >Page&nbsp;</span>&nbsp;</td>
                      <!--first page button-->
                      <?php if ($nStartRec == 1) { ?>
                      <td><img src="images/firstdisab.gif" alt="First" width="16" height="16" border="0">&nbsp;</td>
                      <?php } else { ?>
                      <td><a href="sid_mst_dealerlist.php?start=1&x_status=<?php echo $_REQUEST[x_status]; ?>"><img src="images/first.gif" alt="First" width="16" height="16" border="0"></a>&nbsp;</td>
                      <?php } ?>
                      <!--previous page button-->
                      <?php if ($PrevStart == $nStartRec) { ?>
                      <td><img src="images/prevdisab.gif" alt="Previous" width="16" height="16" border="0">&nbsp;</td>
                      <?php } else { ?>
                      <td><a href="sid_mst_dealerlist.php?start=<?php echo $PrevStart; ?>&x_status=<?php echo $_REQUEST[x_status]; ?>"><img src="images/prev.gif" alt="Previous" width="16" height="16" border="0"></a>&nbsp;</td>
                      <?php } ?>
                      <!--current page number-->
                      <td><input type="text" name="pageno" value="<?php echo intval(($nStartRec-1)/$nDisplayRecs+1); ?>" size="4">&nbsp;</td>
                      <!--next page button-->
                      <?php if ($NextStart == $nStartRec) { ?>
                      <td><img src="images/nextdisab.gif" alt="Next" width="16" height="16" border="0">&nbsp;</td>
                      <?php } else { ?>
                      <td><a href="sid_mst_dealerlist.php?start=<?php echo $NextStart; ?>&x_status=<?php echo $_REQUEST[x_status]; ?>"><img src="images/next.gif" alt="Next" width="16" height="16" border="0"></a>&nbsp;</td>
                      <?php  } ?>
                      <!--last page button-->
                      <?php if ($LastStart == $nStartRec) { ?>
                      <td><img src="images/lastdisab.gif" alt="Last" width="16" height="16" border="0">&nbsp;</td>
                      <?php } else { ?>
                      <td><a href="sid_mst_dealerlist.php?start=<?php echo $LastStart; ?>&x_status=<?php echo $_REQUEST[x_status]; ?>"><img src="images/last.gif" alt="Last" width="16" height="16" border="0"></a>&nbsp;</td>
                      <?php } ?>
                      <td><span >&nbsp;of <?php echo intval(($nTotalRecs-1)/$nDisplayRecs+1);?></span>&nbsp;</td>
                    </tr>
                  </table>
                  <?php if ($nStartRec > $nTotalRecs) { $nStartRec = $nTotalRecs; }
$nStopRec = $nStartRec + $nDisplayRecs - 1;
$nRecCount = $nTotalRecs - 1;
if ($rsEof) { $nRecCount = $nTotalRecs; }
if ($nStopRec > $nRecCount) { $nStopRec = $nRecCount; } ?>
                  <span >Records <?php echo $nStartRec; ?> to <?php echo $nStopRec; ?> of <?php echo $nTotalRecs; ?></span>
                  <?php } else { ?>
                  <?php if ($sSrchWhere == "0=101") {?>
                  <span ></span>
                  <?php } else { ?>
                  <span >No records found</span>
                  <?php } ?>
                  <?php } ?>&nbsp;</td>
              </tr>
            </table>

【讨论】:

    【解决方案3】:

    正如@RamRaider 所述,您的分页方法有些模糊。 从 Oracle 12c 开始,您可以使用以下示例查询来实现分页。

    SELECT fieldA,fieldB 
    FROM table 
    ORDER BY fieldA 
    OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;
    

    访问 this 页面,了解有关 Oracle Database 12c 第 1 版 (12.1) 中前 N 个查询的行限制子句的更多信息

    【讨论】:

    • 我是甲骨文的新手,所以我很困惑,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多