奇怪的PHP分页行为

时间:2013-11-01 12:50:02

标签: php

我正在尝试列出包含输入关键字的mysql数据库中的句子。下面我有一个名为quoteme.html的php脚本,其中包含一个提交表单。当我使用quoteme.html提交关键字时,它仅列出第一页。当我点击“Next 10 Records”时,我得到一个空页面(仅显示“Next 10 Records”链接)。 如果我在查询行中输入关键字,如:

 $sql = "SELECT * FROM `text` WHERE MATCH(body) AGAINST('freak' IN BOOLEAN MODE)LIMIT      $offset, $rec_limit";

效果很好并列出了所有链接的句子

编辑:

虽然

  $sql = "SELECT * FROM `text` WHERE MATCH(body) AGAINST('$q' IN BOOLEAN MODE)LIMIT      $offset, $rec_limit";

仅适用于首页。

freak$q之间的差异是什么?为什么$q = $_GET['q'];会在下一页重置其值?

EDIT2:

我尝试调试错误,我在查询行之后将下面的代码放在php脚本中。

echo '<pre>';
var_dump($_GET);
var_dump($offset);
var_dump($rec_limit);
echo '</pre>';
第一页后,

$_GET变量消失,$offset$rec_limit变量都可以。

那么现在我怎样才能在下一页上使$_GET持续下去?     

$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db('quotes');
/* Get total number of records */
$q = $_GET['q'];
$sql = "SELECT count(*) FROM text ";
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
$row = mysql_fetch_array($retval, MYSQL_NUM );
$rec_count = $row[0];

if( isset($_GET{'page'} ) )
{
$page = $_GET{'page'} + 1;
$offset = $rec_limit * $page ;
}
else
{
$page = 0;
$offset = 0;
}
$left_rec = $rec_count - ($page * $rec_limit);


$sql = "SELECT * FROM `text` WHERE MATCH(body) AGAINST('$q' IN BOOLEAN MODE)LIMIT      $offset, $rec_limit";

$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
echo "SENTENCE :{$row['body']}  <br> ".
     "--------------------------------<br>";
} 

if( $page > 0 )
{
$last = $page - 2;
echo "<a href=\"$_PHP_SELF?page=$last\">Last 10 Records</a> |";
echo "<a href=\"$_PHP_SELF?page=$page\">Next 10 Records</a>";
}
else if( $page == 0 )
{
echo "<a href=\"$_PHP_SELF?page=$page\">Next 10 Records</a>";
}
else if( $left_rec < $rec_limit )
{
$last = $page - 2;
echo "<a href=\"$_PHP_SELF?page=$last\">Last 10 Records</a>";
}
mysql_close($conn);
?>

有人会告诉我代码中有什么问题吗? 感谢。

3 个答案:

答案 0 :(得分:0)

你有一些错误。

第一个不是真正的错误,但令人困惑:将$_GET{'page'}更改为官方$_GET['page']

第二:你在页码上加1。为什么?如果我作为用户,请转到url.php?page = 2我想看第二页,而不是第3页。

最后:$offset应该是($page - 1) * $rec_limit:Page 1以偏移量0开始,第2页从偏移量10开始。

编辑它现在刚刚进入我的脑海:您是否也将q查询参数传递给后续页面?因此,您的网址应如下所示:<myscript.php>?q=freak&page=3。因为php不会将变量保存在请求之上,所以您应该将查询与页面一起传递。

答案 1 :(得分:0)

使用这个模板代码,它对我很有用

$limit = 40; //how many results on a page
@$s = $_GET['s']; //current page
$con = mysqli_connect("localhost", "youruser", "yourpass", "yourdbase");
// Check connection
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$qry = "SELECT ... FROM ... where  ... ";

$result = mysqli_query($con, $qry);
$numrows = mysqli_num_rows($result); 
if ($numrows > 0) {
    // determine if s has been passed to script, if not use 0 
    if (empty($s)) {
        $s = 0; 
    } 
    $qry = "SELECT ... FROM ... LIMIT $s, $limit";
    $result = mysqli_query($con, $qry);
    $count = 1 + $s;

    while ($row = mysqli_fetch_array($result)) { //the main loop
        // .
        // .
        // .
    }

    $currPage = (($s / $limit) + 1); 
    echo "<br />"; 

    //link to other results
    if ($s >= 1) { // bypass previous link if s is 0            
       $prevs = ($s - $limit);
       echo "&nbsp;<a href=\"yourpage.php?s=$prevs\">&lt;&lt;Prev Page</a>&nbsp;&nbsp;"; 
    }

    // calculate number of pages needing links 
    $pages = intval($numrows / $limit); 
    if ($numrows % $limit) { 
        $pages++; 
    } 

    //start page links
    $currentpage=($s / $limit + 1);
    if ($pages > 2) {
        for ($t = 1; $t < $pages + 1; $t++) {
            echo(" ");
            if ($t != $currentpage) {
                $news = ($t * $limit) - $limit;
                 echo("<a href=\"yourpage.php?s=$news\">");
            }
            echo($t);
            if ($t != $currentpage) {
                 echo("</a>");
            }
            echo(" ");
        }
    }

    // check to see if last page 
    if (!((($s + $limit) / $limit) == $pages) && $pages != 1) { // not last page so 
        // give â€next†link 
        $news = $s + $limit; 
        echo "&nbsp;<a href=\"yourpage.php?s=$news\">Next page&gt;&gt;</a>"; 
    } 

    $a = $s + $limit; 
    if ($a > $numrows) { 
        $a = $numrows ; 
    } 
    $b = $s + 1 ; 
    echo "<p><b>Showing results $b to $a of $numrows</b></p>"; 
}

mysqli_close($con);

答案 2 :(得分:0)

我经过数小时的搜索和修改代码后修复了它。它是“$ _GET”变量问题,因为它通过URL传递。在我的代码中,缺少通过URL重定向变量的部分。我在这里添加了一些exra代码,效果很好。感谢所有想要帮助的人。

以下是模式部分:

if( $page >  0 )
{
$last = $page - 2;
echo "<a href=\"$_PHP_SELF?q=$q&page=$last\">Last 10 Records</a> |";
echo "<a href=\"$_PHP_SELF?q=$q&page=$page\">Next 10 Records</a>";
}
else if( $page == 0 )
{

echo "<a href=\"$_PHP_SELF?q=$q&page=$page\">Next 10 Records</a>";
}
else if( $left_rec < $rec_limit )
{
$last = $page - 2;
echo "<a href=\"$_PHP_SELF?q=$q&page=$last\">Last 10 Records</a>";
}