【问题标题】:Trouble setting PHP variable in if statement在 if 语句中设置 PHP 变量时遇到问题
【发布时间】:2011-08-23 03:42:39
【问题描述】:

我有一个 Ajax 调用来创建一个图片库。有一个组合框来设置每页的图像数量,以及用于浏览页面的分页。它工作正常,除了如果一个人在最后一页,并且他们增加了每页的图像数量,它会重新加载到当前页码。这是一个问题,因为现在页面少了,所以页面是空白的。换句话说,例如,您最终会使用page 7 of 5

我认为问题出在 PHP 中,因为这是计算页数的地方。我想出了一个if 声明来处理这个问题:

if ($page > $no_of_paginations) {
 $page = $no_of_paginations;
}

但是,我不知道该放在哪里。原因是,$page 需要在 mysql_query之前定义,但 $no_of_paginations 在查询之后定义。

有什么想法可以让这个功能发挥作用吗?

我会在下面贴出相关代码:

<?php
$page = 0;
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
}
$cur_page = $page;
$page -= 1;
if((int) $_GET['imgs'] > 0){ 
    $per_page = (int) $_GET['imgs']; 
} else { 
    $per_page = 16; 
}
$start = $per_page * $page;

include"db.php";

$query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` ".
"ORDER BY `imgDate` DESC LIMIT $start, $per_page";

$result_pag_data = mysql_query($query_pag_data) or die('MySql Error' . mysql_error());

echo "<ul class='new_arrivals_gallery'>";
while($row = mysql_fetch_assoc($result_pag_data)) { 
    echo "<li><a target='_blank' href='new_arrivals_img/".$row['imgURL']."' class='gallery' title='".$row['imgTitle']."'><img src='new_arrivals_img/thumbnails/".$row['imgURL']."'></a></li>";
  }
echo "</ul>";   


/* --------------------------------------------- */
$query_pag_num = "SELECT COUNT(*) AS count FROM images";
$result_pag_num = mysql_query($query_pag_num);
$row = mysql_fetch_array($result_pag_num);
$count = $row['count'];
$no_of_paginations = ceil($count / $per_page);
?>

感谢您的帮助!

【问题讨论】:

    标签: php ajax


    【解决方案1】:

    正如您目前所做的那样,将最后一部分移到主查询上方不会有任何问题。

    使用 MySQL 查找总记录的更好方法是在主查询中使用 SQL_CALC_FOUND_ROWS 关键字(所以这里是 SELECT SQL_CALC_FOUND_ROWS imgURL, imgTitle FROM images WHERE etc)然后您可以查询 SELECT FOUND_ROWS() 并获取在最后一个查询。除了更快、更高效之外,这还避免了在两个查询之间添加记录时出现竞争条件。

    但是,在这种情况下,您可能应该只以相反的顺序执行两个当前查询,因为您唯一的其他选择是检查最后并在必要时重复。

    【讨论】:

    • 我尝试了你的两个建议。更改查询破坏了我的分页,我感觉这与我没有包含的控制分页的代码有关。我也尝试了您的第二个建议,并且在我的 if 语句下没有问题。也许我的陈述在某种程度上是错误的?我对 PHP 很陌生。
    • 您需要提供更多关于发生了什么的信息,您更改后的输出是什么?
    • 我能够通过颠倒两个查询及其各自变量的顺序来使其工作。我是否可以推测,既然我这样做了,我就不能使用SQL_CALC_FOUND_ROWS?我假设这是 $query_pag_num 现在定义之前 $query_pag_data
    • 没错:您需要先进行查询以填充变量 found_rows() 返回
    【解决方案2】:

    你应该使用查询:

    $query_pag_data = "SELECT SQL_CALC_FOUND_ROWS `imgURL`,`imgTitle` FROM `images` ".
    "ORDER BY `imgDate` DESC LIMIT $start, $per_page";
    

    而不是

    $query_pag_num = "SELECT COUNT(*) AS count FROM images";
    

    使用

    $query_pag_num = "SELECT FOUND_ROWS()";
    

    【讨论】:

    • 并使用我已经放在一起的if 语句?在您看来,我会将if 声明放在哪里?
    • 按照您的建议更改查询已经破坏了我的分页。现在只有组合框有效。可能和我没给你看的PHP有关。
    • 尝试使用代替$row = mysql_fetch_array($result_pag_num); $count = $row['count']; - $count = mysql_fetch_field($result_pag_num);
    • 看来我的解决方案并不能解决您的问题。您可以查看slideshare.net/suratbhati/… 并尝试选择最佳变体。
    【解决方案3】:

    如果您在脚本的早期执行“SELECT COUNT(*) ...”查询(至少在其他查询之前),您将更早地获得 $no_of_paginations,并且可以使用它将 $page 限制在正确的范围内.

    【讨论】:

    • 我尝试了你的建议,我在if声明下没有问题。也许我的陈述在某种程度上是错误的?我对 PHP 很陌生。
    【解决方案4】:

    有时你只需要硬着头皮做两次查询。接受用户提供的“我想要第 X 页”值,并尝试获取该特定页面。如果它最终超出了可用数据的末尾,您可以说“嘿,等等……这不对”并中止,或者重做循环并默认到最后一个可用页面。

    while(true) {
         $sql = "select sql_calc_found_rows .... limit $X,$Y";
         $result = mysql_query($sql) or die(mysql_error());
    
         $sql = "select found_rows();"; // retrieve the sql_calc_found_rows_value
         $res2 = mysql_query($sql);
    
         $row = mysql_fetch_array($res2);
         $total_rows = $row[0];
    
         if ($total_rows < $requested_row) {
            ... redo the loop and request last possible page ...
         } else {
            break;
         }
    }
    

    found_rows() 函数here的详细信息。

    【讨论】:

    • 天哪,我明白你在解释什么......有点。但是使用代码,我如何按照您的建议“重做循环”?另外,我还没有尝试过,但其他人建议我将查询更改为包含sql_calc_found_rows,它会破坏我的分页。这可以像我现有的查询那样工作吗?
    • sql_calc 不应该改变任何东西。它只是让 mysql 计算查询将返回多少行,如果它不是用于限制子句的话。它根本不会改变实际的查询结果。至于重做位,只需复制您的查询设置位,您可以在其中计算使用限制,但是如果用户确实请求了最后一页(例如,将 $page 更改为 5 而不是 7 或他们要求的任何内容)并使用新限制重新运行查询。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多