2017-03-03 10 views
0

ユーザー用のフィードを作成していますが、ページの読み込み時に呼び出される最初の2つの投稿より古いコンテンツを取得しようとしています。下にスクロールすると、最初の2つの結果のレコードが何度も何度も繰り返されています。私がする必要があるのは、last_idより古いデータを追加することだけです。これはJsonから完全に取得しています。古い投稿を追加すると返されたレコードが返されます

また、DESC LIMITが必要ですが、DESC LIMIT $ last_idをクエリに追加すると、JSON応答データがまったく取得されないため、取り除かなければなりませんでした。

AJAX機能

last_idがキャッチされ、第1スクロールに戻って私のPHPページへので、$ _POST [「last_id」]を送られた最後の挿入されたレコードに0から更新されますされています。 - テスト済み

<script> 
    var last_id = 0; 
    function loadAll() { 
    $.ajax({ 
    url: 'commentedoncontent.php', 
    type: 'POST', 
    dataType: 'JSON', 
    data: { last_id: last_id}, 
    success: function(data) { 
    $.each(data.posts, function(i, response) { 
    }); 
    last_id = data.last_id; 
    } 
    }) 
    } 
    </cript> 

PHP

私の最後のIDは、JSONの罰金て来ています。しかし、私はこの面で何が起こっているのか分かりません。私はDESC順に結果を必要とDESCのLIMITます$ last_idと私のフィードを追加しようとしただけで完全に消え、何のJSON配列を

 $last_id=(isset($_POST['last_id']) && $_POST['last_id'] > 1) 
    ? $last_id = $_POST['last_id'] : $last_id = 0; 
    $user1_id=$_SESSION['id']; 
    $query = "SELECT * 
    FROM streamdata m 
    INNER JOIN streamdata_feedback t1 
    WHERE 
    m.streamitem_id=t1.feedback_streamid 
    AND 
    t1.feedback_userid=$user1_id 
    AND 
    t1.feedback_rating=1 
    ORDER BY t1.feedback_id DESC LIMIT 2,2 "; 
    $result = mysqli_query($mysqli, $query) or die('Error: ' .mysqli_error($mysqli)); 
    $rowcount = mysqli_num_rows($result); 

    $json = array(); 
    while ($row = mysqli_fetch_array($result)) { 

    $last_id = $row['streamitem_id']; 
    $json[] = array(
    'streamitem_id' => $row['streamitem_id'], 
    'streamitem_content' => $row['streamitem_content'], 
    ); 
    } 
    echo json_encode(array('posts' => $json, 'last_id' => $last_id)); 

を返されません、私は最高のJSONに新しい機能にそれを送り返さdata.last_idを使用しています別のPHPページで新しいクエリでm.streamitem_id < $last_idのようなことをしていますか?

+1

あなたがLIMITに2つの引数を渡す場合は、最初の引数は行数のオフセットであります最後のレコードのIDではなく、始まります。 IDは連続である必要はなく、逆順でレコードを返すので、last_idをLIMIT句に渡すことは実際にはあまり意味がありません。私はあなたがおそらくWHERE t1.feedback_id <$ last_id LIMITと言っている方が良いと思います。2. last_idがない場合は、その句をクエリから除外することができます。 – ADyson

+0

Last_id = 0ならどうすればよいのでしょうか?それはゼロから始まり、最初の2つのレコードを取得してから、そこからlast_idが渡されます。 – Gateway

答えて

0

古いlast_idの場合、@ADysonと彼の有益なコメントの助けを借りて、私はこれをはるかに簡単に対比することができました。

if ($last_id==0){ 
$query = "SELECT * 
FROM streamdata m 
JOIN streamdata_feedback t1 
WHERE 
m.streamitem_id=t1.feedback_streamid 
AND 
t1.feedback_userid=$user1_id 
AND 
t1.feedback_rating=1 
ORDER BY t1.feedback_id DESC LIMIT 2"; 
$result = mysqli_query($mysqli, $query) or die('Error: ' . mysqli_error($mysqli)); 

}else{ 
$testa=$_POST['last_id']; 
$query = "SELECT * 
FROM streamdata m 
JOIN streamdata_feedback t1 
WHERE 
t1.feedback_id < $testa 
AND 
m.streamitem_id=t1.feedback_streamid 
AND 
t1.feedback_userid=$user1_id 
AND 
t1.feedback_rating=1 
ORDER BY t1.feedback_id DESC LIMIT 2"; 
} 
+0

は実際にあなたがしたことですか? 2つのクエリは同じです。コピー/ペーストエラーですか? :-) – ADyson

+0

彼らは同一ではありません。下位のものはconditionより小さいstreamitem_idを持つ。彼らはif else文にも入っています。今すぐ完璧に動作します。 – Gateway

+1

申し訳ありませんが、それは日曜日に最後のものを見てはいけません、私は笑ってください。 if/elseを使用してWHERE句に余分な行を生成するだけで、文の90%を2回書くのではなく、より少ないコードを複製することができます。 – ADyson

1

ここにあなたの答えのより合理化バージョンは、より保守コードで、ません、と何の重複:

$query = "SELECT * 
    FROM streamdata m 
    JOIN streamdata_feedback t1 
WHERE"; 

if ($last_id != 0) { 
    $query .= " t1.feedback_id < $last_id AND"; 
} 

$query .= " m.streamitem_id = t1.feedback_streamid AND 
    t1.feedback_userid = $user1_id 
    AND 
    t1.feedback_rating = 1 
ORDER BY t1.feedback_id DESC LIMIT 2"; 

$result = mysqli_query($mysqli, $query) or die('Error: ' . mysqli_error($mysqli)); 
+0

私はちょうどそれがサブの答えによって質問への実際の答えではないので投票しました。しかし、本当にありがとう。私はこれが好きで、将来のコードを減らすためにこのテクニックを使用します。 @アディソン、素晴らしい助けをしてくれて本当にありがとうございます。 – Gateway

+1

@Gateway問題なし、喜んで助けてください:-) – ADyson

関連する問題