我知道有些库我可以使用它来进行排序,但我几乎在那里使用我的代码。
关于代码及其尝试的内容。我有一个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
我做错了什么?
由于
答案 0 :(得分:1)
您的查询都不正确。您的“下一个”代码选择任何行,其ID高于当前行,不一定是下一行;如果你得到下一个,那只是偶然的。
您应该使用ORDER BY
和LIMIT
来控制选择哪一行:
下一步:
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,如果它还没有支持,它的支持将会消失。请查看PDO或MySQLi。
另请注意,您正在将变量直接插入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
}