如何为单页显示网站创建上一个/下一个功能?

时间:2016-02-09 13:54:40

标签: php html mysql

我希望创建一个功能,在单页网站的标题上显示prev-next按钮。

$query = "SELECT * FROM `issue` ORDER BY `issue_no` DESC LIMIT 1";

整个网站的内容都来自数据库中的主键,标题是" issue_no" issue_no中的所有内容都是要在一个页面上显示的内容。

if($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "<article id='date_published'><p>Date published:&nbsp;" . $row['date_published'] . "</p></article>";
        echo "<article id='article_head'>" . $row['article_head'] . "</article>";
        echo "<article id='article_body'>" . $row['article_body'] . "</article>";
        echo "<article id='vidpicks_embed'>" . $row['vidpick'] . "</article>";
        echo "<article id='quote_body'>" . $row['quote_body'] . "&mdash;</article>";
        echo "<article id='quote_auth'>" . $row['quote_auth'] . "</article>";
        echo "<article id='wotd_body'>" . $row['wotd_body'] . "</article>";
        echo "<article id='wotd_desc'>" . $row['wotd_desc'] . "</article>";     
    }
}

这显示在index.php

目前,它会在发布日期显示待处理的最新问题,但我想添加该功能以返回上一版和下一版。

除此之外,我还想在下拉列表选项菜单中推出所有问题,让您选择说&#34;问题23&#34;它会将您链接到该问题中包含的相应内容。

另外 - 我如何确保每个网站都有干净的网址?

e.g。 http://www.example.com/issue/023

任何帮助都非常感激。

我已经尝试过阅读分页,但我发现围绕这个分页有点复杂。

感谢。

2 个答案:

答案 0 :(得分:1)

你说:

  

除此之外,我想在下拉列表选项菜单中推出所有问题,允许您选择说“问题23”,它会将您链接到该问题中包含的相应内容。

假设(例如)像“http://www.example.com/issue.php?issue=23”这样的网址(现在推迟了'干净'网址问题),您可以通过这种方式解决所有问题:

$issueId = $_GET['issue'];

/* 01: Retrieve ALL id */
$result = $con->query( "SELECT GROUP_CONCAT( `issue_no` ORDER BY `issue_no` DESC ) FROM `issue`" );
$allId = explode( ',', $result->fetch( PDO::FETCH_NUM )[0] );

/* 02: Check if $issueId exists and set previous/next id */
$prev = $next = False;
$found = array_search( $key, $allId );
if( $found === False )         $found = count( $allId )-1;
if( $found > 0 )               $prev = $allId[$found-1];
if( $found < count($allId)-1 ) $next = $allId[$found+1];

/* 03: Retrieve current issue: */
$result = $con->query( "SELECT * FROM `issue` WHERE `issue_no` = '{$allId[$found]}'" );
$row = $result->fetch_assoc();

/* 04: Output previous/next page link: */
if( $prev !== False ) echo "<a href=\"?issue=$prev\">Prev Page</a>";
else                  echo "<span class=\"inactive\">Prev Page</span>";
if( $next !== False ) echo "<a href=\"?issue=$next\">Next Page</a>";
else                  echo "<span class=\"inactive\">Next Page</span>";

// Your code from here

以上代码仅作为示例。通过这种方式,所有issue_no都存储在$allId变量中,因此您也可以轻松实现下拉菜单issue_no字段按降序检索,如果您更喜欢升序,则可以更改ORDER BY issue_no ASC中的第一个查询(#01)。

请注意,如果用户没有要求任何特定问题(即调用http://www.example.com/issue.php),则将当前问题设置为第一个数组值$allId(#02):如果您愿意产生类似“此问题不存在”的警报,您必须以这种方式修改脚本:

$found = array_search( $key, $allId );
if( $found === False )
{
    // Your error routine here
}
else
{
    if( $found > 0 ) $prev = $allId[$found-1];
    (...)
}

在上一页/下一页网址(#04)的输出中,我使用了基本的<a href>标记,但您可以使用按钮。

清除网址

我强烈建议首先生成一个完整的工作代码,忽略“干净”的URL问题。然后,您需要更改的只是一行。

顺便说一句,要激活干净的网址,您必须以这样的方式修改网站的 .htaccess 文件:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^issue/.*$ /issue.php [NC,L]
</IfModule>

然后,在您的issue.php脚本中,您必须使用以下内容更改$issueId = $_GET['issue'];

$issueId = array_pop( explode( '/', $_SERVER['REQUEST_URI'] ) );

RewriteRule 只是一个示例,实际上我认为您对所有网站的干净网址感兴趣,因此最佳解决方案是将所有传入的网址重定向到redirect.php处理REQUEST_URI并包含适当的页面或回显'未找到'消息。

Here您可以在 RewriteRule

上找到有关基础知识的更多信息

答案 1 :(得分:0)

这些代码我没有经过测试,根本不稳定。你必须优化它。

获取数据的功能

在PHP中:

<?php
$issueno = $_GET["issueno"];
if($issueno == null){
$issueno = 0;
}
$servername = "localhost";
$username = "username";
$password = "password";

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
$query = "SELECT * FROM `issue` ORDER BY `issue_no` DESC LIMIT " + $issueno + ",1";
if($row = mysqli->query($query, MYSQLI_USE_RESULT))
{
/* row is the row selected */
        echo "<article id='date_published'><p>Date published:&nbsp;" . $row['date_published'] . "</p></article>";
    echo "<article id='article_head'>" . $row['article_head'] . "</article>";
    echo "<article id='article_body'>" . $row['article_body'] . "</article>";
    echo "<article id='vidpicks_embed'>" . $row['vidpick'] . "</article>";
    echo "<article id='quote_body'>" . $row['quote_body'] . "&mdash;</article>";
    echo "<article id='quote_auth'>" . $row['quote_auth'] . "</article>";
    echo "<article id='wotd_body'>" . $row['wotd_body'] . "</article>";
    echo "<article id='wotd_desc'>" . $row['wotd_desc'] . "</article>";
}else{
echo "It does not exist";
}
$mysqli->close();
?>

<强> NEXT

在Javascript中,通过使用issueno参数重定向

function next(){
var currentissueno = getQueryVariable("issueno");
if (currentissueno == null){
//Added 1 here as NEXT
currentissueno = 0;
}
//Maximum issues No. OutOfBounds not handled... I have to sleep now
currentissueno++;
//Redirect (should use window.location.href instead of static url)
//window.location = window.location.href + "?issueno=" + currentissueno; 
window.location = "http://www.example.com/index.php?issueno=" + currentissueno; 
}

<强> PREVIOUS

在Javascript中,通过使用issueno参数重定向

function prev(){
var currentissueno = getQueryVariable("issueno");
if (currentissueno == null){
alert("The last previous page");
return;
}
currentissueno--;
//Redirect (should use window.location.href instead of static url)
//window.location = window.location.href + "?issueno=" + currentissueno; 
window.location = "http://www.example.com/index.php?issueno=" + currentissueno; 
}

GET url参数的功能

必需。来自Using the GET parameter of a URL in JavaScript

function getQueryVariable(variable) {
  var query = window.location.search.substring(1);
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    if (pair[0] == variable) {
      return pair[1];
    }
  } 
  return null;
}