【问题标题】:Pagination for SESSION Arrays is not Properly Paginating ArraysSESSION 数组的分页不是正确的数组分页
【发布时间】:2014-04-20 08:39:37
【问题描述】:

我有一个 PHP 页面,可以在我的 $_SESSION['products'] 会话中检索数组。该会话中的每个数组都是用户添加到其“购物车”中的产品。目前我的会话有 11 个数组,这意味着我已将 11 个产品添加到购物车中。我现在正试图在我的 view_cart.php 页面上显示数组,并将它们分页十。基本上我希望页面显示前十个数组,然后在view_cart.php?Page=2 上显示第十一个数组。现在,代码在第一页显示前十个结果,但在view_cart.php?Page=2 上它再次显示相同的十个结果。

这是我的 view_cart.php 页面的完整代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
<?php
session_start();
include_once("config.php");

$objConnect = mssql_connect('gdafgm','gdacf','Rdas!');  
$objDB = mssql_select_db('Gdar',$objConnect ); 

$strSQL = "SELECT * FROM products WHERE 1=1 ".$cheack." ORDER BY id ASC"; 

$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");  
$Num_Rows = mssql_num_rows($objQuery);  

$Per_Page = 10;   // Per Page  
$Page = $_GET["Page"];  
if(!$_GET["Page"])  
{  
$Page=1;  
}  

$Prev_Page = $Page-1;  
$Next_Page = $Page+1;  

$Page_Start = (($Per_Page*$Page)-$Per_Page);  
if($Num_Rows<=$Per_Page)  
{  
$Num_Pages =1;  
}  
else if(($Num_Rows % $Per_Page)==0)  
{  
$Num_Pages =($Num_Rows/$Per_Page) ;  
}  
else  
{  
$Num_Pages =($Num_Rows/$Per_Page)+1;  
$Num_Pages = (int)$Num_Pages;  
}  
$Page_End = $Per_Page * $Page;  
IF ($Page_End > $Num_Rows)  
{  
$Page_End = $Num_Rows;  
}  
?>

<?php
    if(isset($_SESSION["products"]))
    {
        $total = 0;
        echo '<form method="post" action="PAYMENT-GATEWAY">';
        echo '<ul>';
        $cart_items = 0;
$i = 0;
foreach ($_SESSION['products'] as $cart_itm)
   {
     if(++$i > 10) break;
            $product_code = $cart_itm["code"];
           $queryy = "SELECT TOP 1 product_name,product_desc, price FROM products WHERE product_code='$product_code' LIMIT " . $Page_Start . "," . $Per_Page;
           $results = mssql_query($queryy, $mysqli);
           $obj = mssql_fetch_object($results);

            echo '<li class="cart-itm">';
            echo '<span class="remove-itm"><a href="cart_update.php?removep='.$cart_itm["code"].'&return_url='.$current_url.'">&times;</a></span>';
            echo '<div class="p-price">'.$currency.$obj->price.'</div>';
            echo '<div class="product-info">';
            echo '<h3>'.$obj->product_name.' (Code :'.$product_code.')</h3> ';
            echo '<div class="p-qty">Qty : '.$cart_itm["qty"].'</div>';
            echo '<div>'.$obj->product_desc.'</div>';
            echo '</div>';
            echo '</li>';
            $subtotal = ($cart_itm["price"]*$cart_itm["qty"]);
            $total = ($total + $subtotal);

            echo '<input type="hidden" name="item_name['.$cart_items.']" value="'.$obj->product_name.'" />';
            echo '<input type="hidden" name="item_code['.$cart_items.']" value="'.$product_code.'" />';
            echo '<input type="hidden" name="item_desc['.$cart_items.']" value="'.$obj->product_desc.'" />';
            echo '<input type="hidden" name="item_qty['.$cart_items.']" value="'.$cart_itm["qty"].'" />';
            $cart_items ++;

        }

        echo '</ul>';
        echo '<span class="check-out-txt">';
        echo '<strong>Total : '.$currency.$total.'</strong>  ';
        echo '</span>';
        echo '</form>';
        echo '<a href="checkout.php">Checkout</a>';
    }

?>
</body>
</html>

这是我的config.php 页面的所有代码:

<?php
$mysqli = mssql_connect('gda','Gbc','Rgda');  
$objConnectee = mssql_select_db('Gbdac',$mysqli ); 
?>

以下是我在运行view_cart.php 页面时遇到的错误:

Warning: mssql_query() [function.mssql-query]: message: Must declare the scalar variable "@start". (severity 15) in D:\Hosting\4502990\html\partscatalogue\view_cart4.php on line 65

Warning: mssql_query() [function.mssql-query]: Query failed in D:\Hosting\4502990\html\partscatalogue\view_cart4.php on line 65

Warning: mssql_fetch_object(): supplied argument is not a valid MS SQL-result resource in D:\Hosting\4502990\html\partscatalogue\view_cart4.php on line 66

感谢您的帮助。非常感谢所有帮助。

【问题讨论】:

  • 您在代码中的哪个位置设置了 $_SESSION["products"] 的值?
  • 基本上我有一个名为catalogue.php 的产品目录页面,它显示产品供用户通过&lt;form&gt; 添加到他们的购物车中。该表单创建该产品的数组,从名为 products 的 MSSQL 表中检索其信息,并通过浏览器缓存将该产品的信息存储到 $_SESSION["products"] 中新创建的数组中。
  • 快速更正 - 我认为你有 if(++$i > 10) 它应该在 if($i++ > 10)

标签: php arrays session pagination shopping-cart


【解决方案1】:

不会修复它:

你必须用这行替换你的 $queryy 赋值:

$query = "SELECT TOP 1 product_name,product_desc, price FROM products WHERE product_code='$product_code' LIMIT " . $Page_Start .

",". $Per_Page;

没有在你的代码上测试过,如果没有,你能发布结果吗 解决您的问题?也想到 MySQL 的LIMIT _start_,_length_ 来 用于分页的建议目的。

编辑:

抱歉,SQL Server 过度读取

修复 SQL Server:

用这个替换$query分配:

$query = "SELECT TOP 1 product_name,product_desc, price FROM products WHERE product_code='$product_code'
     AND product_id BETWEEN ($Page_Start) AND ($Page_Start + $Per_Page)";

【讨论】:

  • SQL Server 不理解LIMIT,最后我检查了。这就是TOP # 的用途:只选择第一行#
  • 我已经在我的问题中发布了结果。我还将view_cart.php 页面的代码更新为我目前拥有的代码。
  • 不用担心,我已将问题中的错误更新为我目前得到的错误。我目前使用$queryy = "SELECT TOP 1 product_name,product_desc, price FROM products WHERE a.rownum BETWEEN (@start) AND (@start + @rowsperpage)"; 作为我的查询变量。
  • 抱歉,您显然需要替换占位符。我会更新我的答案。
【解决方案2】:

您应该能够通过说类似的话来获得页面的结果价值

$strSQL = "
    SELECT * FROM products
    WHERE 1=1 {$cheack}
    ORDER BY id
    OFFSET (($Page - 1) * $Per_Page)
    FETCH NEXT $Per_Page ONLY
";

(当然,在确保设置了适当的 PHP 变量之后)。

【讨论】:

  • 我不想从产品表中获取结果。我正在尝试从$_SESSION['products'] 的数组中获取结果。
  • 那么,我不太确定你在问什么。如果听起来像这样,那么您需要在$_SESSION['products'] 中粘贴所有行——甚至是你还没有使用的东西。从那里,你会说for ($row_num = $start; $row_num &lt; $end; ++$row_num) { $row = $_SESSION['products'][$row_num]; /* do stuff with $row */ }。但这有点难看,除非您在某个时候需要所有行。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多