Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Вывод информации из MySQL (http://forum.oszone.net/showthread.php?t=127371)

Moon Mag 30-12-2008 10:04 993578

Вывод информации из MySQL
 
Всех приветствую.
Есть база MySQL, таблица и ячейка в которой находится большой текс. Подскажите пожалуйста как вывести от туда информацию допустим на 20 строк, а остальное сформировать на 2 страницу и так далее.
Есть похожая тема но там описывается как сделать максимальное количество символов на странице, а хотелось бы именно ограничение по строкам.
http://forum.oszone.net/post-807556.html

Coutty 30-12-2008 10:32 993599

SELECT * FROM `my_table` ORDER BY `id` LIMIT 0, 20;
SELECT * FROM `my_table` ORDRE BY `id` LIMIT 20, 20;
и т.д. В LIMIT'е сначала с какой строки, а потом - сколько строк.

Moon Mag 30-12-2008 11:31 993634

К сожалению не работает.
Для эксперимента в нес в ячейку текст
1<br>2<br>3<br>4<br>5 и какой бы LIMIT не выставлял, текс выводится полностью

Coutty 30-12-2008 11:41 993641

Ааа... Я не правильно прочитал задание.
Вроде бы MySQL не может делить текст на строки.
Как насчёт php-функции
array explode (string separator, string string [, int limit])
Разбиваем возвращаемое значение на строки и выводим строки перебором нужных значений массива.

Moon Mag 30-12-2008 11:44 993643

Но за этот пример тоже спасибо, я заодно и в нем разобрался )
А эта функция по другому работает это когда в базе не сколько строк
table
id text
1 1-text
2 2-text
3 3-text
4 4-text
5 5text


$content = mysql_query ("SELECT * FROM content LIMIT 0, 2;", $db);
$contenT = mysql_fetch_array ($content);
do
{
echo "<br>".$content['text'];
}
while ($txT = mysql_fetch_array ($txt));

вот в таком случае выведется из базы 2 строчки
1-text
2-text

Moon Mag 30-12-2008 12:10 993665

А вот explode() я чего то не догнал, он же получается. что каждое слово помещает в массив, тем самым мы можем ограничить максиму выводимых слов, а слова могут быть разной длины.
Просто в чем дело, есть сайт где ограничена длина и поэтому информация должна разбиваться на несколько страниц.

Coutty 30-12-2008 13:23 993704

Почему обязательно слово?
PHP код:

$arr explode("\n"$str); 

Так по переводу строки.

PHP код:

$arr explode("<br />"$str); 

А так - по брейкам.

Можно разбить по предложениям ( explode(". ", $str); ), потом в цикле добавлять по одному предложению, пока суммарная длина текста не достигнет определённой длины. Или вообще в сам текст вставить разделители типа {{PAGE}} в нужных местах и потом по ним разбивать.

Moon Mag 30-12-2008 14:12 993736

А можно задать максимальную длину строки, допустим width 300 и разбить это опять же на какое то количество строк?
Не хотелось бы делать какую-то определенную привязку, потому-то делаю не для себя, а для человека который даже от HTML очень далек.
explode("\n", $str); а какие еще ключи бывают(\n)?

Coutty 30-12-2008 15:04 993762

Цитата:

Цитата Moon Mag
А можно задать максимальную длину строки, допустим width 300 и разбить это опять же на какое то количество строк? »

Можно, но строка скорее всего разорвётся посередине слова.
Выделить часть строки так: $str = substr($str, 0, 300); Соответственно где-нибудь в середине - $str = substr($str, 3600, 300);
Цитата:

Цитата Moon Mag
а какие еще ключи бывают(\n)? »

Да любые символы.
\n - знак новой строки
\t - знак табуляции
\r - перевод строки ( \r\n обычно объединяются)

Можно искать конец предложения регулярным выражением, например, но здесь я не смогу помочь :) Самый простой способ - по точке с пробелом.

Moon Mag 03-01-2009 19:48 996520

Спасибо большое за помощь Coutty.
И так после долгих мучение я смог вывести из MySQL определенное колличество строк на основе кода от chirs

Код:

$text = 'Первый пример текста. Второй пример текста. Третий пример текста. Четвертый пример текста.';
$max_length = 30;
$page = (isset($_GET['page']) ? $_GET['page'] : 2);
// Разбиваем $text на массив $arr[], находя в тексте пробелы между словами
$text.= ' ';
while (!empty($text)):
  if (strlen($text)>$max_length) $n = $max_length; else $n = strlen($text);
  for ($i = $n-1; $i>0; $i--) if ($text[$i]==' ') break;
  $arr[] = trim(substr($text,0,$i+1)); $text = substr($text,$i+1);
endwhile;
$k = count($arr);
// Выводим на экран текущую страницу
echo 'Страница '.$page.' из '.$k.'<br><br>';
echo $arr[$page-1];
// Теперь рисуем простенький навигатор страниц
$nav = '<a href="?page='.($page>1 ? $page-1 : 1).'">Предыдущая</a> ';
$nav.= '<a href="?page='.($page<$k ? $page+1 : $k).'">Следующая</a>';
echo '<br><br>'.$nav;
// А это для отладки, чтобы было видно, что происходит
echo '<pre>'; print_r($arr);

, но после радостного успеха я сильно обломался когда попробовал в текс добавить картинку или ссылку так как все это
PHP код:

$text 'Первый пример <img src=\"***.jpg\"> текста. Второй пример текста. Третий пример текста. Четвертый пример текста.'

считает одним текстом и может запись типа <img src=\"26_xp.jpg\"> разорвать на две части потому что там есть пробел между img_src и точно также ссылками.

Поэтому я сделал так
PHP код:

<?php 
$text 
'Первый пример <img src="***.jpg"> текста.{{PAGE}} Второй пример текста.{{PAGE}} Третий пример текста.{{PAGE}} Четвертый пример текста.';


$all_page substr_count($text,"{{PAGE}}"); /*Считаем сколько страниц*/
echo $all_page;  /*Для проверки, потом можно убрать*/

/*Делаем проверку переменной page от не санкционированного ввода*/
if (isset($_GET['page'])) {$page=$_GET['page'];}  
if (isset(
$_GET['page']) == false or $page != is_numeric($page) or $page or $page $all_page) {$page='1';} 


$string strpos($text"{{PAGE}}"0); /*Ищем в тексте первую метку {{PAGE}} и возвращаем её значение*/
do
{
$i=$string+8/*Так как наша метка состоит из 8 символов и чтоб метка не занасилась в массив и не выводилась на экран, нам нужно её перекрыть*/
$arr[] = trim(substr($text,0,$string)); /*Добавляем выборку из текста в массив - страница*/
$text substr($text,$i); /*Выбираем последующие страницы, выбираем от начального и до конца текста*/
}
while (
$string strpos($text"{{PAGE}}"0)); /*Ищем 2-3,4, и тд. метку {{PAGE}} */

/* Если убрать скобки то выдаст структуру массива
echo '<pre>'; print_r($arr);
*/   

/* Выводим на экран текущую страницу */
echo '<br>Страница '.$page.' из '.$all_page.'<br><br>';
echo 
$arr[$page-1];


// Теперь рисуем простенький навигатор страниц
$nav '<a href="?page='.($page>$page-1).'">Предыдущая</a> ';
$nav.= '<a href="?page='.($page<$all_page $page+$all_page).'">Следующая</a>';
echo 
'<br><br>'.$nav;

?>

я немного позаимствовал части кода из других примеров, авторам спасибо.
Теперь просто будет немного ручного труда, придется в ручную подбирать колличество строк передвигая метки {{PAGE}}.

Igor_I 05-01-2009 16:54 998019

Точно работает? :)
Остался непонятным вопрос - как всё-таки рссставил {{PAGE}}.
Как вариант может воспользоватся комментарием в HTML? <!-- -->

Moon Mag 08-01-2009 00:26 1000114

Точно работает :) Уже использую.
{{PAGE}} расставляешь методом подбора, смотришь если текс выходит за границы поднимаешь {{PAGE}} выше.
Не множко кропотливая работенка если большой текс, но зато работает.
Главное что и пользователь сайта понял, вроде.

В принципе и <!-- --> можно использовать, покрайней мере PHPBB такой способ используют.
А так в принципе все что душе угодно можно туда подставлять, главное чтоб в последствии заполнения сайта не попало такая же запись, а то долго будешь искать где же у тя косяк.

Igor_I 09-01-2009 18:44 1001815

Аааа, а я подумал ты расставляешь метки программно. Наверно всё-таки не пользователь сайта, а владелец? Ну это не важно.


Время: 10:08.

Время: 10:08.
© OSzone.net 2001-