БД служит каталог с xml-файлами. В каждом файле (являющимся статьёй) есть узел <categoryid>. Скрипт должен выводить на страницу только те статьи, которые относятся к определённой категории (т. е. с конкретным содержимым узла <categoryid>, например «6»), а также ссылки на страницы (пагинацию). Допустим, в каталоге 4 файла, 3 из которых имеют содержимое <categoryid> = 6. Скрипт должен вывести только их и при условии, что задано выводить по 1 файлу на страницу, то ссылок пагинации должно быть — 3. Скрипт же выводит правильно файлы, но ссылок на страницы выводит — 4, т. е., как будто все файлы имеют содержимое <categoryid> = 6, следовательно, выводит лишнюю ссылку на страницу (очевидно считая все файлы каталога и не обращая внимание на <categoryid>. В чём может быть ошибка? Давно уже с ним маюсь, тупо не могу понять где может быть косяк. Собственно скрипт: PHP: $perPage = 2; $catid = (isset($_GET['catid'])) ? (int)$_GET['catid'] : 1; $files = scandir($fileDir); foreach($files as $num => $file) { $full = $fileDir . '/' . $file; if(is_file($full)) { $articleFile = simplexml_load_file($fileDir . $file); if ((string)$articleFile->categoryid == $_GET['catid']) { if (!is_dir($fileDir . $file) && !preg_match('/^article.*\.xml$/i', $file)) continue; $files[$file] = filemtime($full); } } unset($files[$num]); } arsort($files); $total = count($files); $pages = (int) ceil($total / $perPage); if($total > 0) { $page = (isset($_GET['page'])) ? (int)$_GET['page'] : 1; if($page > $pages or $page < 1) exit('Нет такой страницы'); $start = ($page - 1) * $perPage; $out = array_slice($files, $start, $perPage); foreach($out as $file => $date) { $articleFile = simplexml_load_file($fileDir . $file); if ((string)$articleFile->categoryid == $catid) { echo '<li><a href="' . $articleFile['id'] . '">' . $articleFile->headline . '</a></li>'; } } if($pages > 1) { echo '<div>'; for($pr = '', $i = 1; $i <= $pages; $i++) { 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 == '') ? '' : ' ... ')); } echo '</div>'; } } else { echo '<p>Нет файлов для отображения на этой странице</p>'; } Заранее, признателен.
Может, равно перед значением categoryid в обрабатываемых файлах мешает? Совет: переходите на БД, пока не поздно.
Он просто количество страниц неправильно считает. Там где-то косяк. А вот где, никак не могу понять. А в файлах там таким образом: HTML: … <categoryid>6</categoryid> …
А почему у вас один и тот же массив используется и в scandir и при накоплении элементов, соответствующих критерию? Вместо того чтобы сформировать новый сокращенный массив, вы расширяете исходный.
Он просто количество страниц неправильно считает. Так, начинают вроде бы мозги шевелиться у меня. А ткните носом пожалуйста где при накоплении и как исправить это можно (в каком направлении думать).
Ну так у вас все на count($files) завязано. --- Добавлено --- Уже Внимательно прочитайте, что я написал выше
А как исправить? Я просто новичок, не совсем пойму как создать массив новый. $files это ведь и есть массив, в котором содержатся все страницы глобально, вот он и выводит как на все страницы ссылки без критерия $catid?
Получилось! Теперь нормально считает. Добавил $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
в 5 строку пропишите print_r ( $file ); exit; увидите в массивах идут значения . и .. вот это мешает считать кол-во файлов используйте функцию glob с рекурсией