За последние 24 часа нас посетили 52598 программистов и 1801 робот. Сейчас ищут 876 программистов ...

Следующая\предыдущая запись из бд

Тема в разделе "PHP для новичков", создана пользователем Cyrius, 6 ноя 2017.

  1. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    Думал над реализацией вывода записей из бд, относительно данной.
    Записи должны быть отсортированы по "рейтингу" и выводиться после нажатия на соотвествующие кнопки.

    вот собстна код, не пойму, что не работает в нем

    PHP:
    1.             <?
    2.         $db = new mysqli("localhost","php",12345,"anek");
    3.         if(!isset($_GET['id'])){
    4.             $sql = "
    5.        SELECT * FROM `articles`
    6.        WHERE `rate` =
    7.        (SELECT MAX(rate) FROM `articles`)";
    8.  
    9.         $select = $db->query($sql);
    10.         $select = $select->fetch_array();
    11.         $_GET['id'] = $select['id'];
    12.         $_GET['rate'] = $select['rate'];
    13.         }
    14.  
    15.         else{
    16.         $ID = $_GET['id'];
    17. //NEXT-------------------
    18.         if(isset($_GET['right'])){
    19.         $sqlN = "
    20.        SELECT * FROM `articles`
    21.        WHERE `id` > {$ID}
    22.        ORDER BY `rate` DESC
    23.        ";
    24.  
    25.         $selecT = $db->query($sqlN);
    26.         $selecT = $selecT->fetch_array();
    27.        
    28.         }
    29.        
    30. //PREVIEW----------------
    31.         if(isset($_GET['left'])){
    32.         $sqlP = "
    33.        SELECT * FROM `articles`
    34.        WHERE `id` < {$ID}
    35.        ORDER BY `rate` ASC
    36.        ";
    37.  
    38.         $selectT = $db->query($sqlP);
    39.         $selectT = $selectT->fetch_array();
    40.         }
    41.  
    42. }
    43.        
    44.        
    45.                    
    46.             ?>
    47.             <div class="content">
    48.             <?
    49.             echo $select['text'].$selecT['text'];
    50.             ?>
    51.            
    52.             </div>
    53.             <form id="np">
    54.             <span left>←<input type="submit" name="left" style="display: none;" value="true"></span>
    55.             <span right><input type="submit" name="right" style="display: none;" value="true">→</span>
    56.             </form>
    57.            

    и js на всякий случай кидаю, но тут вроде всё норм и в гет уходят вэлью с кнопок
    Код (Javascript):
    1.             var right = document.querySelector('[right]'),
    2.                     left  = document.querySelector('[left]');
    3.  
    4.             window.onkeydown = function(event){
    5.                 if(event.which == 39){
    6.                     document.getElementsByName('right')[0].click(np.submit());
    7.                     right.className = 'right';
    8.                 }
    9.                 if(event.which == 37){
    10.                     document.getElementsByName('left')[0].click(np.submit());
    11.                     left.className = 'left';
    12.                 }

    Ошибок никаких нет, просто ничего не робит
     
  2. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Вы используете разные запросы для выборки одной последовательности.
    Для начала нужно написать один единый запрос для выборки записей в нужной последовательности, а затем модифицировать его при помощи LIMIT ?,1
     
  3. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    не силен в mysql, можете привести код, если вам не сложно?
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Общий запрос:
    Код (Text):
    1. SELECT * FROM `articles`  ORDER BY `rate` DESC
    Запрос для выборки одной записи:
    Код (Text):
    1. SELECT * FROM `articles`  ORDER BY `rate` DESC LIMIT ?,1
    Максимальный рейтинг:
    Код (Text):
    1. SELECT * FROM `articles`  ORDER BY `rate` DESC LIMIT 0,1
    Если текущая запись 13-я в этом списке:
    Код (Text):
    1. SELECT * FROM `articles`  ORDER BY `rate` DESC LIMIT 12,1
    то пердыдущая:
    Код (Text):
    1. SELECT * FROM `articles`  ORDER BY `rate` DESC LIMIT 11,1
    и следующая:
    Код (Text):
    1. SELECT * FROM `articles`  ORDER BY `rate` DESC LIMIT 13,1
    т.е адресация по записям идет не по ID, а по порядковому номеру в результатах основного запроса.
     
  5. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    Смысл до меня дошел, но как применить это в моем случае?
    + если я всё правильно понял, то разницы между вашим и моим запросами практически нет, вы используете лимит, а я ид?
     
  6. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Cyrius, разницы нет. Только выборка по ID не отвечает этому условию:
    Я бы через GET передавал номер нужной записи в отсортированном списке вместо ID
     
  7. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    как же получить ее номер, если это не id?
     
  8. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Он получается из результатов запроса.
    Если Вы выбрали запись с номером X, то на кнопку "left" в GET ставите номер (X-1), а на кнопку "right" (X+1). Только не в сами параметры 'left' и 'right', а в какой-нибудь общий параметр, например 'num'

    Например, для записи с максимальным рейтингом номер будет 0. При этом предыдущей записи нет и кнопка "left" должна быть неактивной, а на кнопке "right" стоять номер 1.
     
  9. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    спасибо, буду разбираться, вы очень помогли!