2015-10-27 5 views
0

Я показываю сообщения в таблице, а затем пытаюсь вызвать другие сообщения с помощью ajax, но здесь возникают проблемы с нажатием кнопки показать, что снова появляются те же сообщения, что и для вызова следующих сообщений по идентификатору , и еще одна проблема заключается в том, чтобы щелкнуть мышью, показывая, что она изменяется на загрузку и остается их, я хочу, чтобы она скрывалась после загрузки сообщений.Загрузите новые сообщения с помощью ajax, php

Я снова звоню в целую таблицу. Думаю, мне лучше было бы назвать только строки. Вот мои два файла

index.php

<script type="text/javascript"> 
$(document).ready(function(){ 
    $(document).on('click','.show_more',function(){ 
     var ID = $(this).attr('id'); 
     $('.show_more').hide(); 
     $('.loding').show(); 
     $.ajax({ 
      type:'POST', 
      url:'ajax_more.php', 
      data:'id='+ID, 
      success:function(html){ 
       $('#show_more_main'+ID).remove(); 
       $('#posts').append(html); 
      } 
     }); 

    }); 
}); 
</script> 


    $sql = "SELECT * FROM posts order by id desc limit 6"; 
    $query = $db->prepare($sql); 
    $query->execute(); 
    $row = $query->fetch(PDO::FETCH_ASSOC); 
    $ID = $row['id']; 

    <div id="posts"> 
    <table> 
    <tr> 
    <?php do { //horizontal looper?> 
    <td> 
    <div>id</div>   
    <div>title</div> 
    <div>body</div>   
    <div>date</div> 
    </td> 
    <?php 
    $row = $query->fetch(PDO::FETCH_ASSOC); 
    if (!isset($nested_List)) { 
    $nested_List= 1; 
    } 
    if (isset($row) && is_array($row) && $nested_List++%3==0) { 
    echo "</tr><tr>"; 
    } 
    } while ($row); //end horizontal looper 
    ?> 
    </table> 
    <div class="show_more_main" id="show_more_main<?php echo $ID; ?>"> 
<span id="<?php echo $ID; ?>" class="show_more" title="Load more posts">Show more</span> 
<span class="loding" style="display: none;"><span class="loding_txt">Loading…</span></span> 
</div> 
</div> 

ajax_more.php

<?php 
include('db.php'); 
if(isset($_POST["id"]) && !empty($_POST["id"])){ 

$sql = "SELECT * FROM posts order by id desc limit 6"; 
$query = $db->prepare($sql); 
$query->execute(); 
$row = $query->fetch(PDO::FETCH_ASSOC); 
$ID = $row['id']; 
?> 

<table> 
<tr> 
<?php do { //horizontal looper?> 
<td> 
<div>id</div>   
<div>title</div> 
<div>body</div>   
<div>date</div> 
</td> 
<?php 
$row = $query->fetch(PDO::FETCH_ASSOC); 
if (!isset($nested_List)) { 
$nested_List= 1; 
} 
if (isset($row) && is_array($row) && $nested_List++%3==0) { 
echo "</tr><tr>"; 
} 
} while ($row); //end horizontal looper 
?> 
</table> 
<div class="show_more_main" id="show_more_main<?php echo $ID; ?>"> 
<span id="<?php echo $ID; ?>" class="show_more" title="Load more posts">Show more</span> 
<span class="loding" style="display: none;"><span class="loding_txt">Loading…</span></span> 
</div> 
<?php 
} 
?> 

ответ

1

Вы должны будете использовать OFFSET и LIMIT для SQL Query. В настоящее время вы используете SELECT * FROM posts order by id desc limit 6. Это не будет загружать вас «больше», так как оно всегда будет получать только 6 самых больших сообщений (упорядоченных по убыванию по их идентификатору).

1

У вас есть пара проблем.

Когда ваш вызов AJAX завершен, и вы хотите, чтобы сообщение загрузки исчезло, вам нужно скрыть это в своем обратном вызове вызова ajax. Как так:

$(document).on('click','.show_more',function(){ 
    var ID = $(this).attr('id'); 
    $('.show_more').hide(); 
    $('.loding').show(); 
    $.ajax({ 
     type:'POST', 
     url:'ajax_more.php', 
     data:'id='+ID, 
     success:function(html){ 
      $('#show_more_main'+ID).remove(); 
      $('#posts').append(html); 
      $('.loding').hide(); 
     } 
    }); 
}); 

В вашем SQL, вы ничего не делаете, чтобы выбрать альтернативные сообщения, потому что после проверки, если идентификатор был отправлен. Вы ничего с этим не делаете. Измените свой SQL, чтобы выбрать id больше, чем он, если он существует.

$postedId = (int)$_POST['id']; 
$sql = "SELECT * FROM posts order by id desc WHERE id > $postedId limit 6"; 

Вы хотите, чтобы идентификатор был экранирован, чтобы предотвратить любую инъекцию SQL. Итак, как простая мера, я преобразовал ее в целое число (я предполагаю, что). В противном случае вы должны изучить использование подготовленных операторов для своих запросов, чтобы предотвратить SQL-инъекцию. http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

+0

Обратите внимание, что OP использует 'PDO', а не' mysqli'. Так что ссылка о подготовленных операциях в mysqli может не очень помочь ему. Тем не менее, хороший ответ. – SpencerD

1

Ваш SQL-запрос должен быть исправлен. Допустим, вы хотите загрузить следующие 6 (упорядоченные в порядке убывания по ID). Чтобы сделать это, вы должны отправить какую-то переменную, например offset. Тогда вы можете сказать:

$sql = "SELECT * FROM posts ORDER BY id DESC LIMIT $offset, $end;" 

Где $end = $offset + 6;

Перед использованием этого, однако, не забудьте проверить, что $offset числовой, чтобы предотвратить инъекции SQL. Это может быть реализовано с помощью:

if(i!sset($_POST["id"]) || empty($_POST["id"])){ 
     die("No ID value present."); 
} 

$offset = (isset($_POST['offset']) ? $_POST['offset'] : 0); 
if(!is_numeric($offset)){ 
     die("Abnormal input detected."); 
} else { 
     // Input is numeric 
     $offset = intval($offset); 
} 

$end = $offset + 6; 
$sql = "SELECT * FROM posts ORDER BY id DESC LIMIT $offset, $end;" 

    /* Your code for actually querying the DB and processing results */ 

Примечания: Я не слишком хорошо знаком с PDO, однако, это должно быть совместимо с PDO и безопасной/безопасной для использования.

+0

, поэтому я должен использовать этот код только для 'ajax_more.php'? и когда вы говорите: «Чтобы сделать это, вы должны отправить какую-то переменную, такую ​​как смещение», вы хотите сказать, что смещение смещения от 'mains.php' до' ajax_more.php' –

+0

@ bɪɡɪnə, вы можете использовать этот код в 'ajax_more .php', чтобы вернуть следующие 6 сообщений, начиная с определенной точки ('offset'). Поэтому ваш запрос к 'ajax_more.php' просто сказал бы что-то вроде' data: 'id =' + ID + '& offset =' + The_Number_Of_Posts_You_Are_Already_Displaying' (очевидно, вы хотели бы присвоить правильное значение 'offset').Я настоятельно рекомендую вам прочитать [Справочное руководство по MySQL SELECT] (https://dev.mysql.com/doc/refman/5.0/en/select.html). – SpencerD

Смежные вопросы