За последние 24 часа нас посетили 47258 программистов и 1806 роботов. Сейчас ищут 875 программистов ...

Где может быть ошибка в скрипте?

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

Метки:
  1. Linne

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

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    БД служит каталог с xml-файлами. В каждом файле (являющимся статьёй) есть узел <categoryid>. Скрипт должен выводить на страницу только те статьи, которые относятся к определённой категории (т. е. с конкретным содержимым узла <categoryid>, например «6»), а также ссылки на страницы (пагинацию). Допустим, в каталоге 4 файла, 3 из которых имеют содержимое <categoryid> = 6. Скрипт должен вывести только их и при условии, что задано выводить по 1 файлу на страницу, то ссылок пагинации должно быть — 3. Скрипт же выводит правильно файлы, но ссылок на страницы выводит — 4, т. е., как будто все файлы имеют содержимое <categoryid> = 6, следовательно, выводит лишнюю ссылку на страницу (очевидно считая все файлы каталога и не обращая внимание на <categoryid>. В чём может быть ошибка? Давно уже с ним маюсь, тупо не могу понять где может быть косяк.

    Собственно скрипт:

    PHP:
    1. $perPage = 2;
    2.  
    3. $catid = (isset($_GET['catid'])) ? (int)$_GET['catid'] : 1;
    4. $files = scandir($fileDir);
    5.  
    6. foreach($files as $num => $file) {
    7.     $full = $fileDir . '/' . $file;
    8.     if(is_file($full)) {
    9.         $articleFile = simplexml_load_file($fileDir . $file);
    10.         if ((string)$articleFile->categoryid == $_GET['catid']) {
    11.             if (!is_dir($fileDir . $file) && !preg_match('/^article.*\.xml$/i', $file)) continue;
    12.         $files[$file] = filemtime($full);
    13.         }
    14.     }
    15.     unset($files[$num]);
    16. }
    17. arsort($files);
    18.  
    19. $total = count($files);
    20. $pages = (int) ceil($total / $perPage);
    21.  
    22. if($total > 0) {
    23.  
    24.     $page = (isset($_GET['page'])) ? (int)$_GET['page'] : 1;
    25.  
    26.     if($page > $pages or $page < 1)
    27.     exit('Нет такой страницы');
    28.  
    29.     $start = ($page - 1) * $perPage;
    30.     $out = array_slice($files, $start, $perPage);  
    31.  
    32.     foreach($out as $file => $date) {
    33.  
    34.         $articleFile = simplexml_load_file($fileDir . $file);
    35.  
    36.         if ((string)$articleFile->categoryid == $catid) {
    37.  
    38.             echo '<li><a href="' . $articleFile['id'] . '">' . $articleFile->headline . '</a></li>';
    39.         }  
    40.  
    41.  
    42.     }
    43.  
    44.     if($pages > 1) {
    45.         echo '<div>';
    46.         for($pr = '', $i = 1; $i <= $pages; $i++) {
    47.             echo $pr = (($i == 1 || $i == $pages || abs($i - $page) < 2) ? ($i == $page ? " $i " : '<a href="/category.php?catid=' . $catid . '?page='. $i .'">' . $i . '</a> ') : (($pr == ' ... ' || $pr == '') ? '' : ' ... '));
    48.         }
    49.         echo '</div>';
    50.     }  
    51.  
    52. }
    53. else {
    54.     echo '<p>Нет файлов для отображения на этой странице</p>';
    55. }
    Заранее, признателен.
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Может, равно перед значением categoryid в обрабатываемых файлах мешает?

    Совет: переходите на БД, пока не поздно.
     
  3. Linne

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

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    Он просто количество страниц неправильно считает. Там где-то косяк. А вот где, никак не могу понять.

    А в файлах там таким образом:

    HTML:
    1. <categoryid>6</categoryid>
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    А почему у вас один и тот же массив используется и в scandir и при накоплении элементов, соответствующих критерию? Вместо того чтобы сформировать новый сокращенный массив, вы расширяете исходный.
     
  5. Linne

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

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    Он просто количество страниц неправильно считает.
    Так, начинают вроде бы мозги шевелиться у меня. А ткните носом пожалуйста где при накоплении и как исправить это можно (в каком направлении думать).
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Ну так у вас все на count($files) завязано.
    --- Добавлено ---
    Уже :) Внимательно прочитайте, что я написал выше ;)
     
  7. Linne

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

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    А как исправить? Я просто новичок, не совсем пойму как создать массив новый. $files это ведь и есть массив, в котором содержатся все страницы глобально, вот он и выводит как на все страницы ссылки без критерия $catid?
     
  8. Linne

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

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    Получилось! Теперь нормально считает. Добавил $catfiles[$file] = $catid; и вот здесь изменил $total = count($catfiles);

    Только на последней странице вот такие ошибки получаются:

    Warning: simplexml_load_file(): I/O warning : failed to load external entity "/home/www/minimalism.org/xml/0" in /home/www/minimalism.org/category.php on line 111

    Notice: Trying to get property of non-object in /home/www/minimalism.org/category.php on line 115
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    в 5 строку пропишите
    print_r ( $file );
    exit;

    увидите в массивах идут значения . и ..
    вот это мешает считать кол-во файлов
    используйте функцию glob с рекурсией
     
  10. Linne

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

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    Всё, разобрался. Всем большое спасибо. Тему можно закрывать как решённую.