За последние 24 часа нас посетили 15676 программистов и 1636 роботов. Сейчас ищут 852 программиста ...

Автоматическая подгрузка информации с бд

Тема в разделе "PHP для новичков", создана пользователем danies, 28 июл 2014.

  1. danies

    danies Новичок

    С нами с:
    21 июл 2014
    Сообщения:
    38
    Симпатии:
    0
    Начну свою прелюдию с того,что когда я пытался сделать это сам,то испорил весь язык php,вот мой нелогичный, РАБОЧИЙ как оказалось код(задачей была подгрузка списка пользователей при прокрутке страницы(нажатии на кнопку)):
    Код (Text):
    1. <?php
    2.     $startFrom=0;
    3. $res = mysql_query("SELECT * FROM `users` ORDER BY `user_id` DESC LIMIT {$startFrom},10");
    4. $articles = array();
    5. while($row = mysql_fetch_assoc($res))
    6. {
    7.     $articles[] = $row;
    8. }
    9. ?>
    10. <div id="articles">
    11.  
    12.  <?php  
    13.         foreach ($articles as $article):   
    14. $timestamp2 = $article['date_online'];
    15. $timestamp1 = date("Y-m-d H:i:s");
    16. $diff = strtotime($timestamp1) - strtotime($timestamp2);
    17. $second=$diff;
    18. if ($second>900) {
    19. $online="<font style='color:red;'>Offline</font>";
    20. } else {
    21. $online="<font style='color:green;'>Online</font>";
    22. }
    23.     $user_show=sprintf("<img src='%s' width='50px' height='50px'><a href='show_user.php?user_id=%d' class='link' >%s %s(%s)</a><br>", get_web_path($article['user_pic_path']), $article['user_id'], $article['first_name'], $article['last_name'], $online);
    24.      echo $user_show;    
    25.          endforeach;
    26.  
    27.          
    28.          ?>
    29.          
    30.          <input type="button" id="more" value="dasdasd">
    31.          <script>
    32.          inProgress=false;
    33.         ar=<?php echo $startFrom; ?>;
    34.          $('#more').click(function() {
    35.          
    36.        
    37.          inProgress=true;
    38.          function h() {
    39.          
    40.          ar+=10;
    41.          
    42.        
    43.          b="'";
    44.         a= '<?php  
    45.        
    46. $res1 = mysql_query("SELECT * FROM `users` ORDER BY `user_id` DESC LIMIT {$startFrom}, 10;");
    47. $articles1 = array();      
    48.         while($row1 = mysql_fetch_assoc($res1))
    49. {
    50.     $articles1[] = $row1;
    51. }  
    52. foreach ($articles1 as $article1): 
    53. $timestamp2 = $article1['date_online'];
    54. $timestamp1 = date("Y-m-d H:i:s");
    55. $diff = strtotime($timestamp1) - strtotime($timestamp2);
    56. $second=$diff;
    57. if ($second>900) {
    58. $online1="<font style='+b+'color:red;'+b+'>Offline</font>";
    59. } else {
    60. $online1="<font style='+b+'color:green;'+b+'>Online</font>";
    61. }
    62.     $user_show1=sprintf("<img src='+b+'%s'+b+' width='+b+'50px'+b+' height='+b+'50px'+b+'><a href='+b+'show_user.php?user_id=%d'+b+' class='+b+'link'+b+' >%s %s(%s)</a><br>", $article1['user_pic_path'], $article1['user_id'], $article1['first_name'], $article1['last_name'], $online1);
    63.     echo $user_show1;
    64. echo $startFrom;   
    65.          endforeach;
    66.          
    67.        
    68.         ?>';
    69.        
    70.          $("#articles").append(a);
    71.            
    72.          }
    73.          h();
    74.          inProgress=false;
    75.          
    76.          
    77.          });
    78.          </script>
    79. </div>
    Дело тут лишь в том,что в LIMIT никак не подставить нужное значение с js,чтобы информация не выводилась повторно.А если писать что-то типа $startFrom+=10; в вызове функции-это не работает.Вот еще 1 рабочий метод,который я взял с сайта:
    Основная страница,где выводится результат:
    Код (Text):
    1. <?php
    2.     $startFrom=0;
    3. $res = mysql_query("SELECT * FROM `users` ORDER BY `user_id` DESC LIMIT {$startFrom},10");
    4. $articles = array();
    5. while($row = mysql_fetch_assoc($res))
    6. {
    7.     $articles[] = $row;
    8. }
    9. ?>
    10. <div id="articles">
    11.  
    12.  <?php  
    13.         foreach ($articles as $article):   
    14. $timestamp2 = $article['date_online'];
    15. $timestamp1 = date("Y-m-d H:i:s");
    16. $diff = strtotime($timestamp1) - strtotime($timestamp2);
    17. $second=$diff;
    18. if ($second>900) {
    19. $online="<font style='color:red;'>Offline</font>";
    20. } else {
    21. $online="<font style='color:green;'>Online</font>";
    22. }
    23.     $user_show=sprintf("<img src='%s' width='50px' height='50px'><a href='show_user.php?user_id=%d' class='link' >%s %s(%s)</a><br>", get_web_path($article['user_pic_path']), $article['user_id'], $article['first_name'], $article['last_name'], $online);
    24.      echo $user_show;    
    25.          endforeach;
    26.  
    27.          
    28.          ?>
    29.          
    30.        
    31. </div>
    Скрипт аякса,который срабатывает при прокрутке:
    Код (Text):
    1. $(document).ready(function(){
    2.  
    3. /* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */    
    4. var inProgress = false;
    5. /* С какой статьи надо делать выборку из базы при ajax-запросе */
    6. var startFrom = 10;
    7.  
    8.     /* Используйте вариант $('#more').click(function() для того, чтобы дать пользователю возможность управлять процессом, кликая по кнопке "Дальше" под блоком статей (см. файл index.php) */
    9.     $(window).scroll(function() {
    10.        
    11.         /* Если высота окна + высота прокрутки больше или равны высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос */
    12.         if($(window).scrollTop() + $(window).height() >= $(document).height() && !inProgress) {
    13.    
    14.         $.ajax({            
    15.             /* адрес файла-обработчика запроса */
    16.             url: 'obrabotchik.php',
    17.             /* метод отправки данных */
    18.             method: 'POST',
    19.             /* данные, которые мы передаем в файл-обработчик */
    20.             data: {"startFrom" : startFrom},
    21.             /* что нужно сделать до отправки запрса */
    22.             beforeSend: function() {
    23.             /* меняем значение флага на true, т.е. запрос сейчас в процессе выполнения */
    24.             inProgress = true;}
    25.             /* что нужно сделать по факту выполнения запроса */            
    26.             }).done(function(data){
    27.            
    28.             /* Преобразуем результат, пришедший от обработчика - преобразуем json-строку обратно в массив */
    29.             data = jQuery.parseJSON(data);
    30.            
    31.             /* Если массив не пуст (т.е. статьи там есть) */
    32.             if (data.length > 0) {
    33.                
    34.             /* Делаем проход по каждому результату, оказвашемуся в массиве,
    35.             где в index попадает индекс текущего элемента массива, а в data - сама статья */                
    36.             $.each(data, function(index, data){
    37.            
    38.  
    39.             /* Отбираем по идентификатору блок со статьями и дозаполняем его новыми данными */    
    40.   $("#articles").append("<img src='" + data.user_pic_path + "' width='50px' height='50px'><a href='show_user.php?user_id="+data.user_id+"' class='link' >"+data.first_name+" "+data.last_name+"()</a><br>");
    41.             });
    42.            
    43.             /* По факту окончания запроса снова меняем значение флага на false */
    44.             inProgress = false;
    45.             // Увеличиваем на 10 порядковый номер статьи, с которой надо начинать выборку из базы
    46.             startFrom += 10;
    47.             }});  
    48.         }
    49.     });
    50. });
    И обработчик:
    Код (Text):
    1. <?php
    2. require 'config1280/database_connection.php';
    3.  
    4. // C какой статьи будет осуществляться вывод
    5. $startFrom = $_POST['startFrom'];
    6.  
    7. // Получаем 10 статей, начиная с последней отображенной
    8. $res = mysql_query("SELECT * FROM `users` ORDER BY `user_id` DESC LIMIT {$startFrom}, 10");
    9.  
    10.  
    11.  
    12.  
    13. // Формируем массив со статьями
    14. $articles = array();
    15. while ($row1 = mysql_fetch_assoc($res))
    16. {
    17.     $articles[] = $row1;
    18. }
    19.  
    20. // Превращаем массив статей в json-строку для передачи через Ajax-запрос          
    21. echo json_encode($articles);
    Но и тут я не знаю,как добыть переменную $online.Т.е. в скрипте добываются только те переменные,которые есть в базе.Пробовал переменую заменить аналогичной в самом скрипте,получается бред(пытался взять разность дат на js).Вопрос в том,как ее добыть или заменить.

    Добавлено спустя 33 минуты 3 секунды:
    Проблему решил,просто добавил в тот же файл еще 1 функцию
    Код (Text):
    1. $.ajax({            
    2.             /* адрес файла-обработчика запроса */
    3.             url: 'obrabotchik1.php',
    4.             /* метод отправки данных */
    5.             method: 'POST',
    6.             /* данные, которые мы передаем в файл-обработчик */
    7.             data: {"startFrom" : startFrom},
    8.             /* что нужно сделать до отправки запрса */
    9.          
    10.             /* что нужно сделать по факту выполнения запроса */            
    11.             }).done(function(data){
    12.            
    13.             /* Преобразуем результат, пришедший от обработчика - преобразуем json-строку обратно в массив */
    14.             data = jQuery.parseJSON(data);
    15.            
    16.             /* Если массив не пуст (т.е. статьи там есть) */
    17.             if (data.length > 0) {
    18.                
    19.             /* Делаем проход по каждому результату, оказвашемуся в массиве,
    20.             где в index попадает индекс текущего элемента массива, а в data - сама статья */                
    21.             $.each(data, function(index, data){
    22.            
    23.  
    24.  g=data.name;
    25.  });
    26.            
    27.             /* По факту окончания запроса снова меняем значение флага на false */
    28.             inProgress = false;
    29.             // Увеличиваем на 10 порядковый номер статьи, с которой надо начинать выборку из базы
    30.            
    31.             }});  
    + сделал ячейку в таблице,которая обновляеся при любом действии любого пользователя и вписывает туда текущее время.
    Потом я просто высчитал результат
    Код (Text):
    1. var y1=new Date(g);
    2.             var y2=new Date(data.date_online);
    3.            
    4.            
    5.            
    6.            
    7.            var online=(new Date(y1).getTime() - new Date(y2).getTime())/1000;
    8.            
    9.            if(online>900) {
    10.            online="<font style='color:red;'>Offline</font>";
    11.            } else {
    12.            online="<font style='color:green;'>Online</font>";
    13.            }
    Немного заковыристо,но иначе не умею)