我有表包含许多列(content_id,content_type,.. so on)。 我使用了允许我根据content_type和content_id移动到下一行和上一行的代码。
但我想改进代码,以便能够移动到下一行,其id不与其他内容一致
示例:
在下表中我想实现Next和Previous链接,它将允许通过单击下一个和上一个链接来导航Video的所有content_type(1 - 2 - 5 - 7)
-------------------------------------------- content_id content_type content_name ----------------------------------------- 1 Video A ----------------------------------------- 2 Video B ----------------------------------------- 3 Audio C ----------------------------------------- 4 Audio D ----------------------------------------- 5 Video E ----------------------------------------- 6 Audio F ----------------------------------------- 7 Video G -----------------------------------------
$nextQuery = "SELECT * FROM contents WHERE content_type ='Video' && content_id = 1 + " .$id." LIMIT 1 ";
$nextResult = mysqli_query($conn,$nextQuery);
$nextRow = mysqli_num_rows($nextResult);
if($nextRow == 0){
$next = "<a href='#' >Next</a>";
print_r($nextRow);
}else{
$fetchNext = mysqli_fetch_array($nextResult);
print_r($fetchNext);
print_r($nextRow);
$next = "<a href='../services_tools/Watch.php?content_id=". $fetchNext['content_id']."' >Next</a>";
}
$prevQuery = "SELECT content_id FROM contents WHERE content_type ='Video' && content_id =".$id." -1 LIMIT 1";
$prevResult = mysqli_query($conn,$prevQuery);
$prevRow = mysqli_num_rows($prevResult);
if($prevRow == 0){
$pre = "<a href='#' >Pre</a>";
}else{
$fetchPre = mysqli_fetch_array($prevResult);
$pre = "<a href='../services_tools/Watch.php?content_id=".$fetchPre['content_id']."' >Pre</a>";
}
答案 0 :(得分:1)
要查找下一个结果,请尝试在
SELECT * FROM contents WHERE content_type='Video' && content_id > $id ORDER BY content_id ASC LIMIT 1
为了找到以前的结果,你可以做类似的事情,除了小于号(<
)。这将获得id之前的所有结果,但它们的顺序错误。例如,如果您的身份证明是4
,那么您将获得1
,因为它将按照123
的顺序排列(如果我们没有LIMIT
)。因此,我们需要撤消结果,我们可以通过在ORDER BY content_id DESC
语句之前添加LIMIT
来执行此操作:
SELECT * FROM contents WHERE content_type='Video' && content_id < $id ORDER BY content_id DESC LIMIT 1
即使结果不是连续的,这也是有效的,首先出现的结果总是小于之后出现的结果。
另外,请注意,如果您事先没有对$id
进行清理,那么您将面临SQL Injection的风险。查看Prepared Statements,或至少mysqli_real_escape_string
。
答案 1 :(得分:0)
当我理解你是正确的时,你只想让下一个(上一个)content_id
具有相同的content_type
?
为此你只需要获取所有更大的id,命令它们升序并取第一个。这在一个sql语句中都是可能的,你的接近这个:
SELECT * FROM contents WHERE content_type ='Video' AND content_id > ".$id." ORDER BY content_id ASC LIMIT 1
对于之前你拿走所有较小的一个并按顺序排序
SELECT * FROM contents WHERE content_type ='Video' AND content_id < ".$id." ORDER BY content_id DESC LIMIT 1
结果将包含next / prev元素,如果是结尾或第一个,则为null。
作为旁注,请更好地使用准备好的陈述!