下一个和上一个按钮

时间:2014-06-27 23:02:50

标签: php mysql

我知道有些库我可以使用它来进行排序,但我几乎在那里使用我的代码。

关于代码及其尝试的内容。我有一个mysql表,其中有各种新闻文章,并按新闻类别分组。

我设法让前进按钮正常工作。因此,它会查找属于同一类别的下一篇新闻文章。这有效,代码如下。

//Gets the next story from the same story type in line. 
$query= "SELECT * FROM news WHERE storytype2 = '$storytype2' AND id > '$currentid'";
$result = mysql_query($query) or die ("Error in query: $query " . mysql_error());
$row = mysql_fetch_array($result); 
$num_results = mysql_num_rows($result);

if ($num_results > 0){ 
   echo "<td width=\"20%\"align=\"right\"><a href=\"news.php?id=".$row['id']."\"><img title=\"Next News\" src=\"webImg/forwardarrow.png\"/></a></td></tr>";
}else{
   echo "<td width=\"20%\"align=\"right\"></td></tr>";
}
//End of the next button

然而,当我尝试对前一个按钮执行相同操作时。无论我的迭代在哪里,所有我似乎都回来的是该类别的第一个id。例如,如果我在新闻文章10上并尝试转到前一个id为7的内容,它将自动显示该类别中的第一篇新闻文章,例如id 4.

以下是代码。

//Gets the next story from the same story type in line. 
$query= "SELECT * FROM news WHERE storytype2 = '$storytype2' AND id < '$currentid'";
$result = mysql_query($query) or die ("Error in query: $query " . mysql_error());
$row = mysql_fetch_array($result); 
$num_results = mysql_num_rows($result);

if ($num_results > 0){ 
   echo "<td width=\"20%\"align=\"left\"><a href=\"news.php?id=".$row['id']."\"><img title=\"Previous News\" src=\"webImg/backarrow.png\"/></a></td>";        
}else{
   echo "<td width=\"20%\"align=\"left\"></td>";
}
//End of the next button

我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

您的查询都不正确。您的“下一个”代码选择任何行,其ID高于当前行,不一定是下一行;如果你得到下一个,那只是偶然的。

您应该使用ORDER BYLIMIT来控制选择哪一行:

下一步:

SELECT * 
FROM news 
WHERE storytype2 = '$storytype2' AND id > '$currentid'
ORDER BY id
LIMIT 1

一个:

SELECT * 
FROM news 
WHERE storytype2 = '$storytype2' AND id < '$currentid'
ORDER BY id DESC
LIMIT 1

答案 1 :(得分:0)

如果没有任何进一步的信息,我认为您不能认为第一行查询将是您正在寻找的ID。首先按ID排序可能会解决您的问题;您也可以将查询限制为一行,因为它是您唯一要查看的行。以下内容可能会解决您的问题(其中x为$ storytype2且y为$ currentid:

SELECT * FROM news
WHERE storytype2 = x
 AND id < y
ORDER BY id DESC /* <-- THIS */
LIMIT 1

ORDER BY id ASC用于其他情况。 请注意,不推荐使用PHP系列的PHP,如果它还没有支持,它的支持将会消失。请查看PDOMySQLi

另请注意,您正在将变量直接插入SQL代码,这绝不是一个好主意。我希望你对变量有一些很好的输入检查。

让我们看一下PDO获取上一篇文章ID的方法:

$dbh = new PDO(..);
// Use ? where dynamic input will come
$sql = $dbh->prepare('SELECT * FROM news
  WHERE storytype2 = ?
  AND id < ?
  ORDER BY id DESC
  LIMIT 1');

// Fill the ? safely with PDO's execute function
$sql->execute(array($storytype2, $currentid));
$result = $sql->fetch(PDO::FETCH_ASSOC);

if($result && isset($result['id'])) {
   // Process previous ID
}