1

Тема: Сессии и постраничный вывод

Всем Привет! Есть форма передающая данные методом POST, есть обработчик который выводит данные постранично.  Но работает только первая ссылка при переходе на следующие пишет не чего не найдено.  Понял что POST данные теряются при переходе, нужно POST передать в SESSION,  но не селен может подскажите. Заранее Спасибо.

<?php

session_start ();

session_register('country');
$_SESSION['country'] = $_POST['country'];
$country = $_SESSION['country'];

error_reporting(E_ALL);
// Коннект до базы данных
$link = mysql_connect('localhost', 'root', 'root');
if (!$link) die('Не могу соединиться с базой данных');
// Выбираем базу данных
mysql_select_db('test8', $link);

//Устанавливаем кодировку UTF8  
        mysql_query ("SET NAMES utf8");
        mysql_query ("set character_set_client='utf8'");
        mysql_query ("set character_set_results='utf8'");
        mysql_query ("set collation_connection='utf8_general_ci'");
        
        
function mymenu($page, $count, $pages_count, $show_link) 
{ 
// $show_link - это количество отображаемых ссылок; 
// нагляднее будет, когда это число будет парное 
// Если страница всего одна, то вообще ничего не выводим 


session_start ();



if ($pages_count == 1) return false; 
$sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками 
// Для придания ссылкам стиля 
$style = 'style="color: #808000; text-decoration: none;"'; 
$begin = $page - intval($show_link / 2); 

unset($show_dots); // На всякий случай :) 
// Сам постраничный вывод 
// Если количество отображ. ссылок больше кол. страниц 
if ($pages_count <= $show_link + 1) $show_dots = 'no'; 
// Вывод ссылки на первую страницу 
if (($begin > 2) && ($pages_count - $show_link > 2)) { 
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page=1> |< </a> '; 
} 
for ($j = 0; $j <= $show_link; $j++) // Основный цикл вывода ссылок 
{ 
$i = $begin + $j; // Номер ссылки 
// Если страница рядом с началом, то увеличить цикл для того, 
// чтобы количество ссылок было постоянным 
if ($i < 1) continue; 
// Подобное находится в верхнем цикле 
if (!isset($show_dots) && $begin > 1) { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$_SESSION['country'].''.($i-1).'><b>...</b></a> '; 
$show_dots = "no"; 
} 
// Номер ссылки перевалил за возможное количество страниц 
if ($i > $pages_count) break; 
if ($i == $page) { 
echo ' <a '.$style.' ><b>'.$i.'</b></a> '; 
} else { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$_SESSION['country'].''.$i.'>'.$i.'</a> '; 
} 
// Если номер ссылки не равен кол. страниц и это не последняя ссылка 
if (($i != $pages_count) && ($j != $show_link)) echo $sperator; 
// Вывод "..." в конце 
if (($j == $show_link) && ($i < $pages_count)) { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$_SESSION['country'].''.($i+1).'><b>...</b></a> '; 
} 
} 
// Вывод ссылки на последнюю страницу 
if ($begin + $show_link + 1 < $pages_count) { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='.$_SESSION['country'].''.$pages_count.'> >| </a>'; 
} 
return true; 
} // Конец функции


// Подготовка к постраничному выводу
$num = 1; // Количество отображаемых данных из БД

if (!empty($_GET['page']) || ($_GET['page'] <= 0)) {

$page = 1;

} else {
$page =(int) $_GET['page']; // Считывание текущей страницы

}
// Общее количество информации


if(!isset($_SESSION['country']) ||  $_POST['country'] > 1)

{$_POST['country'] = $_SESSION['country'];}




if(!isset($_POST['country']) ||  ($_SESSION['country']) > 1)

{ $_SESSION['country'] = $_GET['page'];
} 

$country = $_SESSION['country']; 

if ($country)  {
print "Вы выбрали <b>$country</b>.
  <br />";

 
$q = "select event_subject, event_body from `phpbb_calendar_events` 
WHERE event_subject='".$country."' OR event_subject=event_body";



 $count = mysql_num_rows(mysql_query($q)) or die('error! Записей не найденоoooo!');
$pages_count = ceil($count / $num); // Количество страниц

// Если номер страницы оказался больше количества страниц
if ($page > $pages_count) $page = $pages_count;
$start_pos = ($page - 1) * $num; // Начальная позиция, для запроса к БД

}
 

$numchar = 300;
// Извлекаем из URL текущую страницу

$page = $_GET['page'];


// Определяем общее число сообщений в базе данных
$res = mysql_query("SELECT COUNT(*) FROM `phpbb_calendar_events`
 WHERE event_subject='".$country."' OR event_subject=event_body",$link);
 
 
  
$rgPosts = mysql_fetch_row($res);
$posts=$rgPosts[0];
$total = intval(($posts - 1) / $num) + 1;
$page = intval($page);
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
$start = $page * $num - $num;
$res = mysql_query("SELECT * FROM `phpbb_calendar_events` 
WHERE event_subject='".$country."' OR event_subject=event_body  LIMIT $start, $num",$link) or die (mysql_error());

    

$table = "<table border=3 width=30% align=center>\n"; 
while ( $i = mysql_fetch_assoc($res)) 
{
   
   $table .= "<tr>\n"; 

$table .= "<td>".$i['event_subject']."</td>\n"; 
$table .= "<td>".$i['event_body']."</td>\n"; 
$table .= "</tr>\n"; 
}
$table .= "</table>\n";

echo $table; 

mymenu($page, $count, $pages_count,  10);


?>

2

Re: Сессии и постраничный вывод

Как я понял, форма передает некоторое значение в переменной $_POST['country'] по которому идет последующая выборка из БД. В таком случае, вы можете добавить параметр country в формируемый URL ссылки перелистывания, рядом с уже существующим параметром page. Если использовать переменную $_REQUEST['country'], то в ней окажутся данные передаваемые через POST или GET, что и можно использовать в вашем случае. Думаю сессия вам не понадобится.

Примерно будет выглядеть так:

if (!empty($_REQUEST['country'])) {
  $country = $_REQUEST['country'];
}

3

Re: Сессии и постраничный вывод

Спасибо! Но не совсем понятно, сессии совсем убрать? тогда не передается значение в переменную $country можно по подробней.
При запуске обработчик выводит данные из таблици так как надо и листалку с записью Вы выбрали Франция. При переходе на следующую страницу выдает: Вы выбрали Франция4 и ниже запись из первого запроса общей информации
error! Записей не найденооооо!
Если в запросы поставить в место переменной значение к примеру Франция, то вывод проходит так как надо по всем страничкам листалки, как только заменяю на переменную, то все пропадает.
P. S. В броузерной строке выводит ?page=Франция4

Код формы поиска

<?php

session_start ();
session_register('country');
$_SESSION['country'] = $_POST['country'];
$country = $_SESSION['country'];

// Константы для подключения к СУБД
define("HOST","localhost");
define("USER","root");
define("PASS","root");
define("DB","test7");

// Подключение к СУБД
$link = mysql_connect(HOST,USER,PASS) or die (mysql_error());  
        
        // Выбираем базу данных
        mysql_select_db(DB, $link);
        
        //Устанавливаем кодировку UTF8  
        mysql_query ("SET NAMES utf8");
        mysql_query ("set character_set_client='utf8'");
        mysql_query ("set character_set_results='utf8'");
        mysql_query ("set collation_connection='utf8_general_ci'");
              

echo "<form  name='input' method='POST' action='http://localhost:8888/zapros/f38.php' >";

echo "<select  class='input' type='text' name='country'>";

echo "<option value='' disabled selected='selected'>Выберите страну</option>";

echo "<option value='Австралия'>Австралия</option>";

echo "<option value='Австрия'>Австрия</option>";

echo "<option value='Алжир'>Алжир</option>";

echo "<option value='Англия'>Англия</option>";

echo "<option value='Бразилия'>Бразилия</option>";

echo "<option value='Испания'>Испания</option>";

echo "<option value='Португалия'>Португалия</option>";

echo "<option value='Франция'>Франция</option>";

echo "<option value='Япония'>Япония</option>";

echo "</select>

<input type='submit' name='show' value='вставить'></form>";

?>

Зарание спасибо за помощь!

4

Re: Сессии и постраничный вывод

tstas сказал:

В броузерной строке выводит ?page=Франция4

Проблема в том, что параметр page должна использовать листалка, а для задания страны необходимо использовать отдельный параметр country, тогда URL будет таким: ?page=1&country=Франция4

Только учтите одну особенность, при вставке кириллицы в URL, необходимо использовать функцию urlencode(), примерно так:

echo '?page=1&country=' . urlencode('Франция4');

5

Re: Сессии и постраничный вывод

Не совсем понял, переменную $country попробовал добавить в листалку, но результат тот же. Запрос на выборку не читает саму переменную $country выдает что запесей не найдено, хотя самой переменной значения пришедшие из формы присваиваются, так как выводит название страны и в броузере пишет название страны и номер страницы. В SQL запросе при переходе на другую страницу теряется значения $country.

6

Re: Сессии и постраничный вывод

tstas сказал:

Запрос на выборку не читает саму переменную $country выдает что запесей не найдено

Попробуйте вместо $_POST['country'] сделать так:

$country = $_REQUEST['country'];

7

Re: Сессии и постраничный вывод

Спасибо! Попробовал! Но без результатно.

8

Re: Сессии и постраничный вывод

tstas сказал:

Спасибо! Попробовал! Но без результатно.

Покажите как теперь выглядит ваш код.

9

Re: Сессии и постраничный вывод

Код выглядит так:

<?php
/*
session_start ();

session_register('country');
$_SESSION['country'] = $_POST['country'];
$country = $_SESSION['country'];


if  ($_REQUEST ['country'] )   {
$_SESSION['country']  = $_REQUEST['country'];
$country = $_REQUEST['country'];
}
*/

error_reporting(E_ALL);
// Коннект до базы данных
$link = mysql_connect('localhost', 'root', 'root');
if (!$link) die('Не могу соединиться с базой данных');
// Выбираем базу данных
mysql_select_db('test8', $link);

//Устанавливаем кодировку UTF8  
        mysql_query ("SET NAMES utf8");
        mysql_query ("set character_set_client='utf8'");
        mysql_query ("set character_set_results='utf8'");
        mysql_query ("set collation_connection='utf8_general_ci'");
        
 $country = $_REQUEST['country'];
 
function mymenu($page, $count, $pages_count, $show_link) 
{ 
// $show_link - это количество отображаемых ссылок; 
// нагляднее будет, когда это число будет парное 
// Если страница всего одна, то вообще ничего не выводим 


 $country = $_REQUEST['country'];

if ($pages_count == 1) return false; 
$sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками 
// Для придания ссылкам стиля 
$style = 'style="color: #808000; text-decoration: none;"'; 
$begin = $page - intval($show_link / 2); 

unset($show_dots); // На всякий случай :) 
// Сам постраничный вывод 
// Если количество отображ. ссылок больше кол. страниц 
if ($pages_count <= $show_link + 1) $show_dots = 'no'; 
// Вывод ссылки на первую страницу 
if (($begin > 2) && ($pages_count - $show_link > 2)) { 
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page=1&'. $country .'> |< </a> '; 
} 
for ($j = 0; $j < $show_link; $j++) // Основный цикл вывода ссылок 
{ 

$i = $begin + $j; // Номер ссылки 
// Если страница рядом с началом, то увеличить цикл для того, 
// чтобы количество ссылок было постоянным 
if ($i < 1) continue; 
// Подобное находится в верхнем цикле 
if (!isset($show_dots) && $begin > 1) { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page ='. $country .''.($i-1).'><b>...</b></a> '; 
$show_dots = "no"; 
} 
// Номер ссылки перевалил за возможное количество страниц 
if ($i > $pages_count) break; 
if ($i == $page) { 
echo ' <a '.$style.' ><b>'.$i.'</b></a> '; 
} else { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='. $country .''.$i.'>'.$i.'</a> '; 
} 
// Если номер ссылки не равен кол. страниц и это не последняя ссылка 
if (($i != $pages_count) && ($j != $show_link)) echo $sperator; 
// Вывод "..." в конце 
if (($j == $show_link) && ($i < $pages_count)) { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='. $country .''.($i+1).'><b>...</b></a> '; 
} 
}
// Вывод ссылки на последнюю страницу 
if ($begin + $show_link + 1 < $pages_count) { 
echo ' <a '.$style.' href='.$_SERVER['PHP_SELF'].'?page='. $country .''.$pages_count.'> >| </a>'; 
} 
return true; 
} // Конец функции


// Подготовка к постраничному выводу
$num = 1; // Количество отображаемых данных из БД

if (!empty($_GET['page']) || ($_GET['page'] <= 0)) {

$page = 1;

} else {
$page =(int) $_GET['page']; // Считывание текущей страницы

}
// Общее количество информации

if(!empty($_REQUEST['country'])) {
 $country = $_REQUEST['country'];

 print "Вы выбрали <b>$country</b>.

<br />";
} 
 
$q = "select event_subject, event_body from `phpbb_calendar_events` 
WHERE event_subject='".$country."' OR event_subject=event_body";

 $count = mysql_num_rows(mysql_query($q)) or die('error! Записей не найденоoooo!');
$pages_count = ceil($count / $num); // Количество страниц

// Если номер страницы оказался больше количества страниц
if ($page > $pages_count) $page = $pages_count;
$start_pos = ($page - 1) * $num; // Начальная позиция, для запроса к БД
 
$numchar = 300;
// Извлекаем из URL текущую страницу

$page = $_GET['page'];
 
// Определяем общее число сообщений в базе данных
$res = mysql_query("SELECT COUNT(*) FROM `phpbb_calendar_events`
 WHERE event_subject='". $country ."' OR event_subject=event_body",$link); 
  
$rgPosts = mysql_fetch_row($res);
$posts=$rgPosts[0];
$total = intval(($posts - 1) / $num) + 1;
$page = intval($page);
if(empty($page) or $page < 0) $page = 1;

if($page > $total) $page = $total;
$start = $page * $num - $num;
$res = mysql_query("SELECT * FROM `phpbb_calendar_events` 
WHERE event_subject='". $country ."' OR event_subject=event_body  LIMIT $start, $num",$link) or die (mysql_error());
    
$table = "<table border=3 width=30% align=center>\n"; 
while ( $i = mysql_fetch_assoc($res)) 
{ 
$table .= "<tr>\n"; 
$table .= "<td>".$i['event_subject']."</td>\n"; 
$table .= "<td>".$i['event_body']."</td>\n"; 
$table .= "</tr>\n"; 
}
$table .= "</table>\n";

echo $table; 

mymenu($page, $count, $pages_count, 10);
?>

В файле формы сессии закоментированы.

10

Re: Сессии и постраничный вывод

Обратите внимание на формирование ссылок перелистывания в функции mymenu().
Эта строка:
echo '<a '.$style.' href='.$_SERVER['PHP_SELF'].'?page=1&'. $country .'> |< </a> ';
Должна выглядеть так:
echo '<a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page=1&country='. urlencode($country) .'"> |< </a> ';

Ниже есть еще 3 строки, где формируются ссылки перелистывания, и там тоже надо поправить параметр country.

11

Re: Сессии и постраничный вывод

Странно??? Не помогло, в броузере выводит:
http://localhost:8888/zapros/f41.php?page%20=%20&$country=Франция2
А в окне - записей из базы не найдено. В мануале читал что переменные из форм должны присутствавать в листалке и отображаться в строке броузера, вроде переменная отображается, но сама постраничка не работает.
SQL запрос при переходе по ссылке теряет значение ???
Ссылки переделал так:

function mymenu($page, $count, $pages_count, $show_link) 
{ 
// $show_link - это количество отображаемых ссылок; 
// нагляднее будет, когда это число будет парное 
// Если страница всего одна, то вообще ничего не выводим 


 $country = $_REQUEST['country'];

if ($pages_count == 1) return false; 
$sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками 
// Для придания ссылкам стиля 
$style = 'style="color: #808000; text-decoration: none;"'; 
$begin = $page - intval($show_link / 2); 

unset($show_dots); // На всякий случай :) 
// Сам постраничный вывод 
// Если количество отображ. ссылок больше кол. страниц 
if ($pages_count <= $show_link + 1) $show_dots = 'no'; 
// Вывод ссылки на первую страницу 
if (($begin > 2) && ($pages_count - $show_link > 2)) { 
echo '<a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page=1&country='. urlencode($country) .'"> |< </a> '; 
} 
for ($j = 0; $j < $show_link; $j++) // Основный цикл вывода ссылок 
{ 

$i = $begin + $j; // Номер ссылки 
// Если страница рядом с началом, то увеличить цикл для того, 
// чтобы количество ссылок было постоянным 
if ($i < 1) continue; 
// Подобное находится в верхнем цикле 
if (!isset($show_dots) && $begin > 1) { 
echo ' <a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page = &$country=' . urlencode($country) .'' .($i-1).'"><b>...</b></a> '; 
$show_dots = "no"; 
} 
// Номер ссылки перевалил за возможное количество страниц 
if ($i > $pages_count) break; 
if ($i == $page) { 
echo ' <a '.$style.' ><b>'.$i.'</b></a> '; 
} else { 
echo ' <a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page = &$country=' . urlencode($country) .''.$i.'">'.$i.'</a> '; 
} 
// Если номер ссылки не равен кол. страниц и это не последняя ссылка 
if (($i != $pages_count) && ($j != $show_link)) echo $sperator; 
// Вывод "..." в конце 
if (($j == $show_link) && ($i < $pages_count)) { 
echo ' <a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page = &$country=' . urlencode($country) .''.($i+1).'"><b>...</b></a> '; 
} 
}
// Вывод ссылки на последнюю страницу 
if ($begin + $show_link + 1 < $pages_count) { 
echo ' <a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page = &$country=' . urlencode($country) .''.$pages_count.'"> >| </a>'; 
} 
return true; 
} // Конец функции


Спасибо!

12

Re: Сессии и постраничный вывод

http://localhost:8888/zapros/f41.php?page%20=%20&$country=Франция2 - Эта ссылка работать не будет, потому что при ее формировании есть ошибки: не передается параметр page и неверно формируется параметр country. Поправьте остальные ссылки в соответствии с этими изменениями:
echo ' <a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page = &$country=' . urlencode($country) .'' .($i-1).'"><b>...</b></a> ';
Правильно будет:
echo ' <a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page=' .($i-1).'&country=' . urlencode($country) .'"><b>...</b></a> ';

13

Re: Сессии и постраничный вывод

Все исправил! Ссылки выводятся, появилась табличка на всех страничках, НО данные в табличке не меняются, выводится первая информация из базы на всех страничках.
Подскажите если не сложно. Огромное СПАСИБО.

14

Re: Сессии и постраничный вывод

Выборка из БД осуществляется этой строкой:
$res = mysql_query("SELECT * FROM `phpbb_calendar_events`
WHERE event_subject='". $country ."' OR event_subject=event_body  LIMIT $start, $num",$link) or die (mysql_error());
Обратите внимание на переменные $start и $num. Если в переменной $page лежит правильное значение, то выборка должна работать. Проверьте значения всех этих переменных прерыванием выполнения скрипта перед запросом к БД, например:

exit($start);

15

Re: Сессии и постраничный вывод

Спасибо! Но не совсем понял? При прирывании запроса вывод пропадает. Поставил в цикле вывода данных echo $page в выводе получил 1 при переходе по страницам везде сохраняется 1. На сколько понемаю значение $page должно меняться. Но незнаю как, Спасибо!

16

Re: Сессии и постраничный вывод

tstas сказал:

Поставил в цикле вывода данных echo $page в выводе получил 1 при переходе по страницам везде сохраняется 1.

Значит ошибка в формировании ссылок перелистывания. Смотрите URL листалки, если там page=1, то ясно откуда эта цифра.

17

Re: Сессии и постраничный вывод

В листалке page = 1, единицу удалил, но без результатно. Есть строка перед запросом if(empty($page) or $page < 0) $page = 1; едница от туда, при смене на 2 или 3 выводит 3 или 2 строку из базы на всех страницах. При смене на переменную $country выводит ошибку запроса. Спасибо.

18

Re: Сессии и постраничный вывод

tstas сказал:

Есть строка перед запросом if(empty($page) or $page < 0) $page = 1; едница от туда, при смене на 2 или 3 выводит 3 или 2 строку из базы на всех страницах.

Смотрите выше по коду формирование переменной $page.
$page = $_GET['page'];
Если проблема в $_GET['page'] - значит URL формируется  неверно. Просто посмотрите что лежит в $_GET['page'].

19

Re: Сессии и постраничный вывод

Подскажите пожалуйста как посмотреть значение переменной $_GET['page']; echo в цикле не чего не дает. При подстановки в запрос значения к примеру Франция работает все четко на всех страничках листалки. Большое СПАСИБО.

20

Re: Сессии и постраничный вывод

tstas сказал:

Подскажите пожалуйста как посмотреть значение переменной $_GET['page']; echo в цикле не чего не дает.

Если ничего не дает, значит переменная пустая. Только вы должны понять, что $_GET['page'] в скрипте - это то же самое, что параметр page в URL ?page=1&country=Russia - Таким образом, если $_GET['page'] пуст, то и в URL будет пусто, либо ошибка. Обратите внимание на формирование URL.

21

Re: Сессии и постраничный вывод

Огромное Вам человеческое СПАСИБО. Ни на одном форуме толком не помогли кроме Вас и Вашего форума. Ошибка действительно в URL между ?page и знаком = оказался пробел. Еще раз Огромное спасибо. Все работает.