2017-09-08 15 views
1

テーブルには多くの列(content_id、content_type、..so)が含まれています。 私は、content_typeとcontent_idに基づいて次の行と前の行に移動するためのコードを使用しました。次回と前回の自動インクリメント列の作成方法

私は、そのIDが他のコンテンツ

例と連続していない次の行に移動することができるようにコードを改善したい:私は次へと戻るを実装する以下の表に

ビデオ(5 - - - 2 1 7)のすべてのCONTENT_TYPEをナビゲートすることができますリンクの横と前のリンク上で次の結果を見つけるための

 
-------------------------------------------- 
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

あなたが正しいことを理解したら、次の(前の)content_idに同じcontent_typeが必要ですか?

このため、すべてのより大きなIDをフェッチし、昇順に並べ替えて最初のものを取るだけです。これは、1つの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 

結果は、次/前の要素を含んでいるでしょう降順すべての小さい方と順番にそれらを取ります終了または最初の場合はnullです。

補足として、準備文を使用してください。

1

をクリックすることで、どのようにあなたは後のID、クエリのすべてを取得し、その後1で制限してみてくださいについて:以前の結果を見つけるための

SELECT * FROM contents WHERE content_type='Video' && content_id > $id ORDER BY content_id ASC LIMIT 1 

、あなたは記号(<)よりも低い場合を除き、同様のことを行うことができます。これにより、IDの前に来るすべての結果が得られますが、順序が間違っています。たとえば、IDが4だった場合、123LIMITがなかった場合)の順であるため、1が得られます。したがって、我々はLIMIT文の前ORDER BY content_id DESCを追加することによって行うことができ、結果を、逆にする必要があります。

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を参照してください。

+0

最初のケースでは、ORDER BY content_id ASCを追加する必要があります。 –

+0

@FabianN。追加されました。私はOPが元のコードでそれを持っていなかったので、私はこれを置くことを忘れたと思う。ありがとう – Toastrackenigma

関連する問題