Консультация № 142334
26.08.2008, 18:52
0.00 руб.
0 10 2
Доброго времени суток уважаемые! Вопрос таков: есть отдельный файл с текстом (*.txt). Хочу сделать так, чтобы скрипт делил текст по, допустим, 600 или 800 символов, выводил эту часть на страницу, а внизу распологалось бы навигационное меню (назад|вперед <1|2|...|5|6|7|...|15|16>)

Обсуждение

Неизвестный
26.08.2008, 18:58
общий
вопрос-то в чём? что не получается?
Неизвестный
26.08.2008, 19:02
общий
вообще самого алгоритма понять не могу. Недавно только с php разбираться начал
Неизвестный
26.08.2008, 19:16
общий
это ответ
Здравствуйте, Hugonavy!

ну если сторго по N символов, то алгоритм приблизительно следующий:
1)если параметр с номером страницы не указан - показывать первую страницу
2)показать символы с (page-1)*N по page*N
3)нагенерить (int)(length(text)/N+0.5) ссылок на страницы, при желании текущую можно как-то выделить

если совершенствовать скрипт, то стоит делить по границе слова (не резать слово посредине если оно не попадает в диапазон).
Неизвестный
26.08.2008, 19:41
общий
Что-то подобное я нашел, подстроил чуть-чуть под себя, но все равно что-то не то




<?php
function textpart($text, $count=100)
{
$number = @ $_GET['number'];

if($count > 0) { $text = wordwrap($text,$count, "[page]"); }

$str = explode("[page]", $text);
// Выясняем сколько страниц
$count = count($str);
//Выводим страницу
empty ($number) ? $number = 0 : $number < 0 ? $number = 0 : "";
echo $str[($number)];

echo "<br/>";
echo "<br/>";
// Если текущая страница первая, то выводим продолжить
if ($number == 0 and count($str) > 1) {
echo "<br/><a href='?number=" . ($number +1) . "'>[Читать дальше...]</a> <br/>"; }
else

{
// Проверяем текущая ли это страница
for ($i = 0; $i < $count; $i++) {
if ($i == $number) {
if ($i == ($count -1) and $count > 2) {
echo " <b>[$i]</b>";
echo " <a href='?number=0'> в начало</a>";
}
elseif ($i == ($count - ($count -1)) and $count > 2) {
echo " <a href='?number=" . ($count -1) . "'>в конец </a>";
echo " <b>[$i]</b>";

}
elseif ($i == $number) {
echo " <b>[$i]</b>";
}
} else {
echo " <a href='?number=$i'>[$i]</a>";

}
}
}
}
$str = file_get_contents("1.txt");
textpart($str,2000);
?>
Неизвестный
26.08.2008, 21:18
общий
это ответ
Здравствуйте, Hugonavy!
В приложении скрипт с небольшими коментариями, который осуществляет поставленную вами задачи. Файл и число символов(n) указывается на форме. Файл должен быть в папке со скриптом. Предполагается, что скрипт называется index.php
Удачи!!!


Приложение:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<form method="GET">
Введите N: <input type="text" name="n"/><BR>
Имя файла(должен находиться в директории со скриптом!): <input type="text" name="file"/><BR>
<input type="submit" value="Отправить!" /><BR>
</form>
<?php
//Если скрипту переданы имя файла и N, то обрабатываем файл
if (!empty($_GET['n']) && !empty($_GET['file']))
{
//Открываем файл для чтения
$file = fopen($_GET['file'], 'r');
//Если произошла ошибка, то выходим
if (!$file) exit('Ошибка открытия файла!');
//Читаем файл
$filestr = fread($file, filesize($_GET['file']));
//Закрываем файл
fclose($file);
//Создаем массив из содержимого файла с помощью str_split
$pages = str_split($filestr, $_GET['n']);
//Если передана номер страницы, то выводим эту страницу
if (!empty($_GET['pnum']))
echo $pages[$_GET['pnum']].'<BR>';
else
//Иначе выводим первую
echo $pages[0].'<BR>';
//Получаем кол-во страниц
$pagescount = count($pages);
//Выводим ссылки
for ($i = 0; $i < $pagescount; $i++)
{
$nn = $i + 1;
echo '<a href = "index.php?n='.$_GET['n'].'&file='.$_GET['file'].'&pnum='.$i.'">'.$nn.'</a> ';
}
if (empty($_GET['pnum']) || $_GET['pnum'] == 0)
{
$prev = 0;
$next = 1;
}
elseif ($_GET['pnum'] == ($pagescount - 1))
{
$prev = $_GET['pnum'] - 1;
$next = $_GET['pnum'];
}
else
{
$prev = $_GET['pnum'] - 1;
$next = $_GET['pnum'] + 1;
}
echo '<BR><a href = "index.php?n='.$_GET['n'].'&file='.$_GET['file'].'&pnum='.$prev.'">Предыдущая</a>';
echo '<BR><a href = "index.php?n='.$_GET['n'].'&file='.$_GET['file'].'&pnum='.$next.'">Следующая</a>';
}
?>
</body>
</html>
Неизвестный
27.08.2008, 09:43
общий
зачем так сложно единицу шифровать:
($count - ($count -1))
?
и на первый взгляд всё в порядке. Где именно "то-то не то"?
Неизвестный
27.08.2008, 21:40
общий
В своем скрипте я обнаружил одну ошибку, которая позволяет получить доступ к файловой системе сервера. Т. е. если указать имя файла /etc/shadow, то можно получить доступ к именам пользователей и хэшам их паролей Linux сервера. Чтобы этого избежать достаточно вместо строк:
Код:
//Открываем файл для чтения
$file =fopen($_GET['file'], 'r');

поставить эти:
Код:
//Открываем файл для чтения
$file = @fopen(basename($_GET['file']), 'r');

Таким образом, если будет указано имя файла /ect/shadow, то откроется не этот файл, а файл shadow в папке со скриптом.
Кроме того я немного улучшил скрипт в плане дизайна:
Код:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Вывод файла с постраничной навигацией</title>
</head>
<body>
<form method="GET">
Введите N: <input type="text" name="n" value="<?php echo $_GET['n'] ?>"/><BR>
Имя файла(должен находиться в директории со скриптом!): <input type="text" name="file" value = "<?php echo $_GET['file']?>"/><BR>
<input type="submit" value="Отправить!" /><BR><HR>
</form>
<?php
//Если скрипту переданы имя файла и N, то обрабатываем файл
if (!empty($_GET['n']) && !empty($_GET['file']))
{
//Открываем файл для чтения
$file = @fopen(basename($_GET['file']), 'r');
//Если произошла ошибка, то выходим
if (!$file) exit('Ошибка открытия файла!');
//Читаем файл
$filestr = fread($file, filesize($_GET['file']));
//Закрываем файл
fclose($file);
//Создаем массив из содержимого файла с помощью str_split
$pages = str_split($filestr, $_GET['n']);
//Если передана номер страницы, то выводим эту страницу
if (!empty($_GET['pnum']))
echo nl2br($pages[$_GET['pnum']]).'<BR>';
else
//Иначе выводим первую
echo nl2br($pages[0]).'<BR>';
//Получаем кол-во страниц
$pagescount = count($pages);
//Выводим ссылки
echo '<HR>';
if ($pagescount == 1)
{
$prev = 0;
$next = 0;
}
elseif (empty($_GET['pnum']) || $_GET['pnum'] == 0)
{
$prev = 0;
$next = 1;
}
elseif ($_GET['pnum'] == ($pagescount - 1))
{
$prev = $_GET['pnum'] - 1;
$next = $_GET['pnum'];
}
else
{
$prev = $_GET['pnum'] - 1;
$next = $_GET['pnum'] + 1;
}
echo '<BR><a href = "index.php?n='.$_GET['n'].'&file='.$_GET['file'].'&pnum='.$prev.'"><<Предыдущая</a> | ';
for ($i = 0; $i < $pagescount; $i++)
{
$nn = $i + 1;
echo '<a href = "index.php?n='.$_GET['n'].'&file='.$_GET['file'].'&pnum='.$i.'">'.$nn.'</a> | ';
}
echo '<a href = "index.php?n='.$_GET['n'].'&file='.$_GET['file'].'&pnum='.$next.'">Следующая>></a>';
}
?>
</body>
</html>
Неизвестный
28.08.2008, 02:25
общий
А нельзя ли сделать все тоже самое, только без формы? Я попытался сам исправить, но выдалась только ошибка
Неизвестный
28.08.2008, 11:47
общий
Вот, форма не нужна, открывается файл test.txt:
Код:

<?php
//Указываем n
$n = 800;
//Читаем файл test.txt
$filestr = file_get_contents('test.txt');
//Создаем массив из содержимого файла с помощью str_split
$pages = str_split($filestr,$n);
//Если передана номер страницы, то выводим эту страницу
if (!empty($_GET['pnum']))
echo nl2br($pages[$_GET['pnum']]).'<BR>';
else
//Иначе выводим первую
echo nl2br($pages[0]).'<BR>';
//Получаем кол-во страниц
$pagescount = count($pages);
//Выводим ссылки
echo '<HR>';
if ($pagescount == 1)
{
$prev = 0;
$next = 0;
}
elseif (empty($_GET['pnum']) || $_GET['pnum'] == 0)
{
$prev = 0;
$next = 1;
}
elseif ($_GET['pnum'] == ($pagescount - 1))
{
$prev = $_GET['pnum'] - 1;
$next = $_GET['pnum'];
}
else
{
$prev = $_GET['pnum'] - 1;
$next = $_GET['pnum'] + 1;
}
echo '<BR><a href = "index.php?n='.$_GET['n'].'&pnum='.$prev.'"><<Предыдущая</a> | ';
for ($i = 0; $i < $pagescount; $i++)
{
$nn = $i + 1;
echo '<a href = "index.php?n='.$_GET['n'].'&pnum='.$i.'">'.$nn.'</a> | ';
}
echo '<a href = "index.php?n='.$_GET['n'].'&pnum='.$next.'">Следующая>></a>';
?>
Неизвестный
28.08.2008, 12:56
общий
Спасибо!
Форма ответа