Войти

Показать полную графическую версию : постраничная навигация mysql, php


Страниц : [1] 2

dima1981
04-11-2008, 10:16
<?
$db = mysql_connect("localhost","root","***");
mysql_select_db("rp", $db);
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
if ($_POST[m_o] && $_POST[m_d]){
$num = 2;
// Текущая страница
$page=$_GET['page'];
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$_POST[m_o].'" AND m_d="'.$_POST[m_d].'"');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$_POST[m_o].'" AND m_d="'.$_POST[m_d].'" LIMIT $start, $num');
}
else if ($_POST[m_o] && !$_POST[m_d]) {
$num = 2;
// Текущая страница
$page=$_GET['page'];
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$_POST[m_o].'"');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$_POST[m_o].'" LIMIT $start, $num');
}
else if ( $_POST[m_d] && !$_POST[m_o] ){
$num = 2;
// Текущая страница
$page=$_GET['page'];
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt WHERE m_d="'.$_POST[m_d].'"');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query('SELECT * FROM rt WHERE m_d="'.$_POST[m_d].'" LIMIT $start, $num');
}
else {
$num = 2;
// Текущая страница
$page=$_GET['page'];
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query("SELECT * FROM rt LIMIT $start, $num");
}
while ( $abc = mysql_fetch_row($result))
{
echo ("$abc[0] | $abc[1]");
}
if ($page != 1) $pervpage = '<a href= zt.php?page=1><<</a>
<a href= zt.php?page='. ($page - 1) .'><</a> ';
// Нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= zt.php?page='. ($page + 1) .'>></a>
<a href= zt.php?page=' .$total. '>>></a>';

// Стр. с обоих краев
if($page - 2 > 0) $page2left = ' <a href= zt.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= zt.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= zt.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= zt.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';

// Вывод
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
mysql_close($db);
?>


Скажите пожалуйста, почему у меня тут всю таблицу постранично хорошо показывает, но когда задан поиск по базе mysql то не показывает, понимаю, что вот в этом php запросе или строке, что то не так $result = mysql_query('SELECT * FROM rt WHERE m_d="'.$_POST[m_d].'" LIMIT $start, $num');
но, что кавычки нужны но где или как тут сделать двойные кавычки читаемые браузером нормально, как тут $result = mysql_query("SELECT * FROM rt LIMIT $start, $num"); ?
Заранее спасибо.

Sham
04-11-2008, 10:42
$result = mysql_query('SELECT * FROM rt WHERE m_d="'.$_POST['m_d'].'" LIMIT '.$start.', '.$num);
$result = mysql_query("SELECT * FROM rt WHERE m_d='$_POST[m_d]' LIMIT $start, $num");
есть еще варианты...

dmitryst
04-11-2008, 13:47
$result = mysql_query("SELECT * FROM `rt` WHERE `m_d`='$_POST['m_d']' LIMIT `$start`, `$num`");
Так правильно - закавычиваем всё, что можно, а названия таблиц и полей - в обратные апострофы.

PS. Чтобы не путаться, лично я делаю вывод так:
определяю все нужные переменные
вывожу их с HTML в одном потоке:

print <<<END
<a href="#">$link_value</a>
...
ну и так далее
END
;;

dima1981
05-11-2008, 00:24
dmitryst, Так правильно » на перле? )
при всем уважении у меня не получился этот код.
определяю все нужные переменные
вывожу их с HTML в одном потоке:
print <<<END
<a href="#">$link_value</a>
...
ну и так далее
END
;; »
не могу понять, как это задействовать на практике трудновато, что то при всем желании dmitryst,

Sham, не мог бы в кратце пояснить про запятые, почему то, что ты написал получилось в отличии от того, что написал я т.е. понабрал оттуда да отсюда помаленьку?

dima1981
05-11-2008, 00:53
dmitryst, про это

$m_d=$_POST[m_d];
$result = mysql_query("SELECT * FROM rt WHERE m_d='$m_d' LIMIT $start, $num");

определяю все нужные переменные
вывожу их с HTML в одном потоке:
print <<<END
<a href="#">$link_value</a>
...
ну и так далее
END
;; », да?

и у меня почему то условие поиска не воспринимается т.е. например прописываю букву l и показывает те слова в, которых она есть, если прописываю букву, которой нет ни в одном слове, то да он показывает, что страницу в, которой данных нет, что такое

Sham
05-11-2008, 01:49
dima1981, все, что касается строк в PHP узнаете здесь http://ru2.php.net/language.types.string
$m_d=$_POST[m_d]; »
если m_d не константа, то там кавычки нужны везде... $_POST['m_d'] (если не внутри строки)...

* правильный синтаксис heredoc (который у вас немного неправильный) увидите по ссылке выше...

* не понятно, что и как вы ищите...

dima1981
05-11-2008, 02:24
* не понятно, что и как вы ищите... » есть html файл в, котором две формы для размещения данных в таблице, из этих форм данные передаются в виде переменных методом post обработчику, от него при соблюдении всех условий размещения заносятся в базу mysql. Потом есть второй html в, которм две формы для запроса данные из, которых приходят приведенному вначале темы обработчику и теперь, когда осуществляю поиск по базе то у меня первая страница отображается нормально, когда перехожу на вторую из панели навигации, то у меня оказывается автоматически происходит запрос не тот, который есть изначально, но вот этот else {
$num = 2;
// Текущая страница
$page=$_GET['page'];
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query("SELECT * FROM rt LIMIT $start, $num");
}
и не могу понять что не так.
за ссылку благодарю, щас читать отправляюсь, только не доходит до меня этот php и все тут )

Sham
05-11-2008, 03:15
dima1981, вы пытаетесь изобрести велосипед... поищите готовые решения (http://www.google.com/search?hl=ru&rls=ru&q=%2BPHP+%2B%D0%BA%D0%BB%D0%B0%D1%81%D1%81+%2BMySQL+%2B%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0 %B8%D1%87%D0%BD%D1%8B%D0%B9+%2B%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4&lr=lang_ru) и там все будет понятно...

dima1981
05-11-2008, 03:41
Благодарю Sham, но так я поступаю за отсутствием мозгов и все равно не получается ничего, не передаются у меня переменные в pageвые страницы
вот код понимаю, что немного не отформатирован, но все таки может посмотрите?
<?
$db = mysql_connect("localhost","root","***");
mysql_select_db("rp", $db);
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
$m_o=$_POST[m_o];
$m_d=$_POST[m_d];
if ($_POST[m_o] && $_POST[m_d])
{
$num = 5;
$page=$_GET['page'];
$result = mysql_query("SELECT * FROM rt WHERE m_o='$m_o' AND m_d='$m_d'");
$posts = mysql_num_rows($result);
$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;
$result = mysql_query("SELECT * FROM rt WHERE m_o='$m_o' AND m_d='$m_d' LIMIT $start, $num");
}
else if ($_POST[m_o] && !$_POST[m_d]) {
$num = 5;
$page=$_GET['page'];
$result = mysql_query("SELECT * FROM rt WHERE m_o='$m_o'");
$posts = mysql_num_rows($result);
$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;
$result = mysql_query("SELECT * FROM rt WHERE m_d='$m_o' LIMIT $start, $num");
}
else if ( $_POST[m_d] && !$_POST[m_o] ){
$num = 5;
$page=$_GET['page'];
$result = mysql_query("SELECT * FROM rt WHERE m_d='$m_d'"); // к примеру при этом запросе, первую страницу показывает правильно и определяется количество записей правильно и навигация есть, но когда по ней перехожу срабатывает вот этот запрос поставил плюс рядом с ним
$posts = mysql_num_rows($result);
$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;
$result = mysql_query("SELECT * FROM rt WHERE m_d='$m_d' LIMIT $start, $num");
else {
$num = 5;
$page=$_GET['page'];
$result = mysql_query('SELECT * FROM rt'); //+
$posts = mysql_num_rows($result);
$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;
$result = mysql_query("SELECT * FROM rt LIMIT $start, $num");
echo ( "<center><h2>по данному запросу $_POST[m_o] $_POST[m_d] информации в базе не размещено, вы можете посмотреть информацию, которая в базе есть, но база пополняется постоянно</h2></center>");
}
while ( $abc = mysql_fetch_row($result))
{
echo ("$abc[0] | $abc[1]");
}
if ($page != 1) $pervpage = '<a href= zt.php?page=1><<</a>
<a href= zt.php?page='. ($page - 1) .'><</a> ';
if ($page != $total) $nextpage = ' <a href= zt.php?page='. ($page + 1) .'>></a>
<a href= zt.php?page=' .$total. '>>></a>';
echo ("<br><div align='center'>$pervpage $page2left $page1left $page $page1right $page2right $nextpage</div>");
echo ("<br><br><div align='center'>Всего страниц по запросу $total</div>");
mysql_close($db);
?>

Sham
05-11-2008, 04:34
dima1981, вы должны все параметры передавать методом get (и хтмл-форма должна быть get - т.е. через URL).

в ссылках навигации я не вижу никаких параметров кроме страницы, а должны быть все данные, включая строку запроса, и остальные данные формы (т.е. GET)

соответственно все $_POSTы после этого замените на $_GETы (переход по ссылкам означает, что вы посылаете параметры методом get)...

не забывайте все данные перед вставкой в строку запроса обрабатывать функцией mysql_real_escape_string() - это защита от изменения строки запроса извне...

в принципе можно совместить post и get (первоначально слать post, а ссылки уже будут get слать), и тогда нужно проверять уже $_REQUEST (это все данные подряд, присланные юзером)...

dima1981
05-11-2008, 08:10
Да только не понятно как это все вы должны все параметры передавать методом get (и хтмл-форма должна быть get - т.е. через URL).
в ссылках навигации я не вижу никаких параметров кроме страницы, а должны быть все данные, включая строку запроса, и остальные данные формы (т.е. GET)
соответственно все $_POSTы после этого замените на $_GETы (переход по ссылкам означает, что вы посылаете параметры методом get)...
не забывайте все данные перед вставкой в строку запроса обрабатывать функцией mysql_real_escape_string() - это защита от изменения строки запроса извне...
в принципе можно совместить post и get (первоначально слать post, а ссылки уже будут get слать), и тогда нужно проверять уже $_REQUEST (это все данные подряд, присланные юзером)... » выглядит, но сообщение определенно полезное

dmitryst
05-11-2008, 11:23
на перле? )
при всем уважении у меня не получился этот код. »
Нет, я потихоньку учу PHP :). А метод, который я описал, работает и там, и тут.

GET-запрос выглядит так: "http://site.com/script.php?parametr1=10&parametr2=test&page=3" и так далее, то есть все нужные параметры передаются в ссылке. Соответственно, в скрипте, который эти параметры принимает, пишем $var = $_GET['parametr1'], например. Вы уж определитесь - или все GET или все POST, а то запутаетесь. Кстати, все эскейп-функции можно не применять, если у вас все параметры гарантировано числа или на английском (во всяком случае, на первом этапе). Кроме того, в сложных случаях я дублирую запросы к базе данных на экран - мало ли, может, какая-то переменная принимает не то значение, какое хотелось бы.

Igor_I
05-11-2008, 13:44
dima1981,
Кроме того, в сложных случаях я дублирую запросы к базе данных на экран - мало ли, может, какая-то переменная принимает не то значение, какое хотелось бы. »
Вот с этого и надо начинать.

##Не писать
$result = mysql_query("SELECT * FROM rt WHERE m_o='$m_o' AND m_d='$m_d'");
##а писать так:
$query = "SELECT * FROM rt WHERE m_o='$m_o' AND m_d='$m_d'";
$result = mysql_query($query);
##а в конце страницы
echo $query;

Правда я особо в код не вглядывался и не знаю сколько там у тебя запросов. Если ты сделаешь так для всех запросов, то выведется только последний.

dmitryst
05-11-2008, 14:41
Igor_I, не согласен.


///вот так писать (ибо некоторые поля могут совпасть с зарезервированными словами, да и значение в обратных апострофах гарантированно считается названием таблицы или поля)

$query = "SELECT * FROM `rt` WHERE `m_o`='$m_o' AND `m_d`='$m_d'";
///и тут же проверять.
echo $query;
$result = mysql_query($query);

dima1981
05-11-2008, 15:11
этот запрос не срабатывает

$query("SELECT * FROM rt LIMIT $start, $num");
$result= mysql_query($query);
пишет Fatal error: Function name must be a string

dmitryst
05-11-2008, 15:39
dima1981, потому что так надо:
$query = ("SELECT * FROM `rt` LIMIT $start, $num"); »

dima1981
05-11-2008, 16:13
не то dmitryst, вернулся к предыдущему способу $result = mysql_query хотя полностью не осознаю последствий, которые могут возникнуть с этим переходом, но он хоть функцианирует и первую страницу показывает нормально, и число строк считается правильно, и навигация на ней отображается, только вот на вторую переходит без переменных, но это поправимо, только вот узнать бы как их передать думаю с переменной $posts, только где ее прописывать...

Igor_I
05-11-2008, 19:49
dmitryst, для меня это не критично, можно в конце страницы, можно в середине.
Вот твой первый файл в более наглядном виде. Из которого видно что у тебя проверяются переменные $_POST, но которые не передаются на вторую страницу.

вернулся к предыдущему способу $result = mysql_query хотя полностью не осознаю последствий
Извини, но вспоминаются слова профессора в ответ студенту где ошибка - в генах молодой человек.
Используй функцию echo везде, где что-то не получается. Придумай каждому условию переменную и выводи её.
--------------
Исправил код. Правда я не знаю насколько он работоспособен.

<?
<?
$db = mysql_connect("localhost","root","***");
mysql_select_db("rp", $db);
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");

// Текущая страница
$page = $_GET['page'];

$pmd = $_POST[m_d];
$pmo = $_POST[m_o];

if (empty ($_POST[m_d]) $pmd = $_GET[pmd];
if (empty ($_POST[m_o]) $pmd = $_GET[pmo];

if ($pmo && $pmd){
$num = 2;

// Общее число сообщений
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$pmo.'" AND m_d="'.$pmd.'"');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$pmo.'" AND m_d="'.$pmd.'" LIMIT $start, $num');
}
else if ($pmo && !$pmd) {
$num = 2;
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$pmo.'"');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query('SELECT * FROM rt WHERE m_o="'.$pmo.'" LIMIT $start, $num');
}
else if ($pmd && !$pmo ){
$num = 2;
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt WHERE m_d="'.$pmd.'"');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query('SELECT * FROM rt WHERE m_d="'.$pmd.'" LIMIT $start, $num');
}
else {
$num = 2;
// Общее число сообщений
$result = mysql_query('SELECT * FROM rt');
$posts = mysql_num_rows($result);
// Общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Начальная позиция отсчета
$page = intval($page);
// Если $page отрицательно то, переходим на первую страницу
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// С какого номера начать выводить сообщения
$start = $page * $num - $num;
// Вывод с $start
$result = mysql_query("SELECT * FROM rt LIMIT $start, $num");
}

while ( $abc = mysql_fetch_row($result))
{
echo ("$abc[0] | $abc[1]");
}

if ($page != 1) $pervpage = '<a href= zt.php?page=1><<</a>
<a href= zt.php?page='. ($page - 1) .'&pmd='.$pmd.'&pmo='.$pmo.'><</a> ';
// Нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= zt.php?page='. ($page + 1) .'&pmd='.$pmd.'&pmo='.$pmo.'>></a>
<a href= zt.php?page=' .$total. '>>></a>';

// Стр. с обоих краев
if($page - 2 > 0) $page2left = ' <a href= zt.php?page='. ($page - 2) .'&pmd='.$pmd.'&pmo='.$pmo.'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= zt.php?page='. ($page - 1) .'&pmd='.$pmd.'&pmo='.$pmo.'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= zt.php?page='. ($page + 2) .'&pmd='.$pmd.'&pmo='.$pmo.'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= zt.php?page='. ($page + 1) .'&pmd='.$pmd.'&pmo='.$pmo.'>'. ($page + 1) .'</a>';

// Вывод
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
mysql_close($db);
?>
?>

dima1981
06-11-2008, 00:00
Извини » забыли, короче и обсуждение того кто да чего и как ну ее у каждого на совершение определенного поступка существуют определенные основания и то кто чем движем на самом деле это трудный вопрос но вот методы они конечно могут варьироваться в зависимости от ситуации тут дело вкуса, понимаю, что общение на програмерские темы у меня храмает очень и очень, да и понимание этих тем как таковы отсутствует напроч, да и надо ли это мне, вообщем обращаюсь на форум в процессе создания этого сайта, кода из, которых прошу подкоректировать тут на форуме и кто хочет и может тот смотрит вникает и содействует определенным образом мне, я этим людям очень благодарен и могу их понять есть и конструкты, есть и деструкты отличия одних от других очевидны, кому то хоть чего но он как есть по природе созидатель так и есть это гены вообщем ты правильно заметил, но это ладно, заделаю этот сайт полюбому хоть на это потребуется пара жизней и соответственно интересует только те темы, которые требуются для его создания и только вникать во, что то дальше в кодинге или программенге как тут получше выразить понятие это, это для меня лишне хочу этот сайт и все и считаю, что компьютер нужен для развлечения и доделов сайт только исключительно для этого его и собераюсь задействовывать, ну щас вот как сказал sham "зачем придумывать велосипед существует огромное количество готовых решений" и так далее создаю этот сайт, и кому охото и есть желание мне помагают и здорово что такие люди есть.
Сори за поэму и новелу кто этот текст так назовет

Igor_I Исправил только работоспособность велосипед говорит починил, только он так и едит только напрво но хоть сигнал появился, понял спасибо )
скопировал его и вперед с передачей параметров эксперементировать дошел только до этого
<a href= zt.php?page='. ("'.$page - 1.'" . pmd="'.$pmd.'" . pmo="'.$pmo.'"') .'><</a>
продолжу с этим спасибо продолжу

Igor_I
06-11-2008, 00:10
Ну вот, генератор текста включил :)
Ну так по теме что есть сказать? Код смотрел?




© OSzone.net 2001-2012