Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Есть страница, которая создает ссылки на информацию, находящуюмя в базе данных:
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
// display individual record
if ($id)
{
$result = mysql_query("SELECT * FROM employees WHERE id=$id",$db);
$myrow = mysql_fetch_array($result);
printf("First name: %s\n<br>", $myrow["first"]);
printf("Last name: %s\n<br>", $myrow["last"]);
printf("Address: %s\n<br>", $myrow["address"]);
printf("Position: %s\n<br>", $myrow["position"]);
}
else
{
// show employee list
$result = mysql_query("SELECT * FROM employees",$db);
if ($myrow = mysql_fetch_array($result))
{
// display list if there are records to display
do
{
printf("<a href=\"add3.php%s?id=%s\"><b> %s</b></a> %s<br><br>\n", $PHP_SELF, $myrow["id"],
$myrow["first"], $myrow["last"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
// no records to display
echo "Sorry, no records were found!";
}
}
?>
И есть страницйа, которая отображает данные из таблицы
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees WHERE (id=)", $db);
if ($myrow = mysql_fetch_array($result))
{
do
{
printf("<div class=zagvnov>%s</div><b><center>%s</center></b><br>%s<br><div align=right><b>%s</b></DIV><br>\n", $myrow["first"], $myrow["last"], $myrow["address"], $myrow["position"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
echo "Sorry, no records were found!";
}
?>
Проблема в том, что я хочу, что на второй странице отображалась лишь та инормация, на которую ведет ссылка, а не вся информация из базы данных. Помогите, пожалуйста.
Неактивен
$result = mysql_query("SELECT * FROM employees WHERE (id=" . intval($_GET['id']) . " )", $db);
Неактивен
Спасибо огромное, все получилось. Если можно, у меня еще вопрос. Я знаю, что количество ссылок на странице можно регулировать запросом LIMIT. Но можно л сделать так, что ссылки, оставшиеся за пределами лимита, автоматически переходили на другую страницу, а на предыдущей странице автоматически создавалась ссылка на эту страницу.
Неактивен
Автоматически - нет, но Вы можете написать соответствующий код. Можете воспользоваться,
например, SQL_CALC_FOUND_ROWS.
Неактивен
Я новичок в этом деле. Поэтому, если Вас не затруднит, то не могли бы вы показать мне какой-нибудь пример.
Неактивен
Если по-простому:
1. Считаете сколько всего записей, например 380 (можно отдельным запросом SELECT count(*) AS c FROM tbl или в том же запросе через SQL_CALC_FOUND_ROWS
2. Зная сколько на одной странице (скажем 50), определяете число страниц - 8
3. Смотрите на какой Вы странице ($_GET['page']), например это 4-ая (значит 50 записей с 50*(4-1)=150ой)
4. Формируете запрос с LIMIT 150,50
5. Формируете ссылки на страницы 1,2,3,4,5 в виде href="?page=1", ..
Неактивен
rgbeast написал:
Если по-простому:
1. Считаете сколько всего записей, например 380 (можно отдельным запросом SELECT count(*) AS c FROM tbl или в том же запросе через SQL_CALC_FOUND_ROWS
2. Зная сколько на одной странице (скажем 50), определяете число страниц - 8
3. Смотрите на какой Вы странице ($_GET['page']), например это 4-ая (значит 50 записей с 50*(4-1)=150ой)
4. Формируете запрос с LIMIT 150,50
5. Формируете ссылки на страницы 1,2,3,4,5 в виде href="?page=1", ..
Этот вариант не совсем подходит. Информация в базе будет постоянно увеличиваться
Отредактированно Sarkhan (08.04.2008 23:44:11)
Неактивен
Я привел это как алгоритм для PHP, который надо выполнять при каждом обращении.
Неактивен
Я попробовал так:
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
// display individual record
if ($id)
{
$result = mysql_query("SELECT * FROM WHERE nov_id=$nov_id",$db);
$myrow = mysql_fetch_array($result);
printf("First name: %s\n<br>", $myrow["first"]);
printf("Last name: %s\n<br>", $myrow["last"]);
printf("Address: %s\n<br>", $myrow["address"]);
printf("Position: %s\n<br>", $myrow["position"]);
}
else
{
$page = (isset($_REQUEST["page"]) ? $_REQUEST["page"] : 1); // текущая страница
$N = 2; // количество записей на страницу
$cur_row = ($page-1)*$N +0; // начиная с какой записи выводить
// show employee list
$result = mysql_query("SELECT * FROM employees WHERE (id=" .intval($_GET['id']).") ORDER BY date DESC LIMIT ".$cur_row.", ".$N, $db);
if ($myrow = mysql_fetch_array($result))
{
// display list if there are records to display
do
{
printf("<a href=\"add3.php%s?nov_id=%s&id=%s\"><b><div class=zagvnov1> %s</b></a></div> %s<div align=right><b> %s</b></div><br><br>\n", $PHP_SELF, $myrow["nov_id"], $myrow["id"], $myrow["first"], $myrow["last"], $myrow["date"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
// no records to display
echo "Sorry, no records were found!";
}
}
?>
<a href="add2.php?page=<?=$page-1?>&id=<?=$_GET['id']?>">Назад</a> <a href="add2.php?page=<?=$page+1?>&id=<?=$_GET['id']?>">Вперед</a>
Но как сделать, что если это первая страница, то появлялась лишь ссылка "вперед", а если последняя - "назад"?
Неактивен
это не очень хорошая практика вставлять php внутрь HTML, лучше все внутри PHP
<?php
if($page > 1) {
echo "<a href=\"add2.php?page=" . ($page-1) . "&id=" . $_GET['id'] . "\">Назад</a>";
}
Неактивен
При таком запросе у меня ссылка вообще не появляется. Кроме того, меня больше интересует, как сделать, что если это первая страница, то появлялась лишь ссылка "вперед", а если последняя - "назад"?
Неактивен
Как раз это и приведен ответ, но только для ссылки "Назад". На первой странице она не появляется.
Неактивен
Для ссылки вперед я попробовал
if($page <= $result) {
echo "<a href=\"add2.php?page=" . ($page+1) . "&id=" . $_GET['id'] . "\">Вперед</a>";
}
Но он блокирует последнюю страницу
Неактивен
Что значит блокирует?
Неактивен
Не выдает ссылку "вперед" на последнюю страницу
Неактивен
А почему Вы номер страницы сравниваете с $result? Надо сравнивать с числом страниц. $result - у Вас переменная типа ресурс, содержащая ответ MySQL
Неактивен
Тогда получается, что при увеличении информации, мне каждый раз придется количество страниц?
Неактивен
Возможно мы говорим о разном. Попробуйте просто отладить скрипт. Выводите с помощую echo значения всех переменных, используемых в условиях if(). Тогда станет все понятно.
Неактивен
Добрый день. Знаю, что уже порядком Вам надоел, но уж очень хочется, чтобы все получилось. Я порылся в нете и попробовал такой вариант:
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
// display individual record
if ($id)
$result = mysql_query("SELECT COUNT(*) AS first FROM employees WHERE nov_id=$nov_id",$db);
$myrow = mysql_fetch_array($result);
printf("First name: %s\n<br>", $myrow["first"]);
printf("Last name: %s\n<br>", $myrow["last"]);
printf("Address: %s\n<br>", $myrow["address"]);
printf("Position: %s\n<br>", $myrow["position"]);
else
// show employee list
$result = mysql_query("SELECT COUNT(*) AS first FROM employees WHERE (id=" .intval($_GET['id']).") ORDER BY date", $db);
$cnt_all = mysql_fetch_array($result);
if ($myrow = mysql_fetch_array($result))
// display list if there are records to display
do
printf("<a href=\"add3.php%s?nov_id=%s&id=%s\"><b><div class=zagvnov1> %s</b></a></div> %s<div align=right><b> %s</b></div><br><br>\n", $PHP_SELF, $myrow["nov_id"], $myrow["id"], $myrow["first"], $myrow["last"], $myrow["date"]);
while ($myrow = mysql_fetch_array($result));
else
// no records to display
echo "Sorry, no records were found!";
$cnt_all = $cnt_all['first']; // получили общее число новостей.
$page_size = 5;
$cnt_pages = ceil($cnt_all / $page_size); // количество страниц при $page_size записей на странице
$page = (!isset($_GET['page']) || $_GET['page'] <= 1 || $_GET['page'] > $cnt_pages) ? 1 : $_GET['page'];
$start_from = $page_size['first'] * ($page - 1);
echo "<a href='?page=1'>1</a>";
echo "<b>".$page."</b>";
echo "<a href='?page=".$cnt_pages."'>".$cnt_pages."</a>";
Но все равно, что-то не получается. На странице пишется "Sorry, no records were found!" и создаются ссылки 1 <b>1</b>3.
Помогите пожалуйста!!!
Неактивен
1. В этом сценарии явно не хватает фигурных скобок.
2. Второй запрос визуально изменился и теперь он не получает данные, только их количество.
Попробуйте переписать всё с чистого листа?
Неактивен
rgbeast написал:
это не очень хорошая практика вставлять php внутрь HTML, лучше все внутри PHP
А с чем это связано???Будьте добры ,подскажите.
Неактивен
Если HTML у Вас в файле, то это исключает возможность хранения верстки в базе данных. Получается смешивание верстки и программного кода. ИМХО, удобнее хранить верстку в базе данных и выводить ее пользователю на PHP
Неактивен
Доброго времени суток. Очень хочется надеяться, что я вам еще не надоел.
Обидно, что мне понадобтлось больше трех месяцев, чтобы что-то получилось (правда, я периодически забрасывал это дело, а потом вновь возвращался). Вобщем, в принципе у меня все получилось. Я скрестил код из форума punbb, и то, что нарыл в нете. Получилось так:
<?php
function paginate($cnt_pages, $cur_page, $link_to)
{
/// MOD VIEW ALL PAGES IN ONE BEGIN
global $lang_common;
$active_all = true;
// If $cur_page > $num_pages, we show link to all pages
if ($cur_page > $cnt_pages)
{
$active_all = false;
$link_to_all = true;
$cur_page--;
}
/// MOD VIEW ALL PAGES IN ONE END
$pages = array();
$link_to_all = false;
// If $cur_page == -1, we link to all pages (used in viewforum.php)
if ($cur_page == -1)
{
$cur_page = 1;
$link_to_all = true;
}
if ($cnt_pages <= 1){
$pages = array('<strong>1</strong>');}
else
{
if ($cur_page > 3)
{
$pages[] = '<a href="'.$link_to.'&p=1">1</a>';
if ($cur_page != 4)
$pages[] = '…';
}
// Don't ask me how the following works. It just does, OK? :-)
for ($current = $cur_page - 2, $stop = $cur_page + 3; $current < $stop; ++$current)
{
if ($current < 1 || $current > $cnt_pages)
continue;
else if ($current != $cur_page || $link_to_all)
$pages[] = '<a href="'.$link_to.'&p='.$current.'">'.$current.'</a>';
else
$pages[] = '<strong>'.$current.'</strong>';
}
if ($cur_page <= ($cnt_pages-3))
{
if ($cur_page != ($cnt_pages-3))
$pages[] = '…';
$pages[] = '<a href="'.$link_to.'&p='.$cnt_pages.'">'.$cnt_pages.'</a>';
}
/// MOD VIEW ALL PAGES IN ONE BEGIN
if (!$active_all) $pages[] = $lang_common['All'];
else $pages[] = '<a href="'.$link_to.'&action=all">'.$lang_common['All'].'</a>';
/// MOD VIEW ALL PAGES IN ONE END
}
return implode(' ', $pages);
}
// show employee list
$sql = mysql_query("SELECT COUNT(*) AS first FROM employees WHERE (id=" .intval($_GET['id']).")", $db);
$cnt_all = mysql_fetch_array($sql);
$cnt_all = $cnt_all['first']; // получили общее число новостей.
$page_size = 5; // количество страниц при $page_size записей на странице
$cnt_pages = ceil($cnt_all / $page_size); // количество страниц при $page_size записей на странице
$page = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $cnt_pages) ? 1 : $_GET['p'];
$cur_row = ($page-1)* $page_size + 0; // начиная с какой записи выводить
$result = mysql_query("SELECT * FROM employees WHERE (id=" .intval($_GET['id']).") ORDER BY date DESC LIMIT ".$cur_row.",".$page_size, $db);
if ($myrow = mysql_fetch_array($result))
{
// display list if there are records to display
do
{
printf("<a href=\"add3.php%s?nov_id=%s&id=%s\"><b><div class=zagvnov1> %s</b></a></div> %s<div align=right><b> %s</b></div><br><br>\n", $PHP_SELF, $myrow["nov_id"], $myrow["id"], $myrow["first"], $myrow["last"], $myrow["date"]);
}
while ($myrow = mysql_fetch_array($result));
}
else
{
// no records to display
echo "Sorry, no records were found!";
}
// Generate paging links
if ( isset($_GET['action'] ) && $_GET['action'] == 'all')
{
$page = ($cnt_pages + 1);
$cnt_all = $page_size;
}
$paging_links = $lang_common['Pages'].' '.paginate($cnt_pages, $page, 'add3.php?id='. $_GET['id'] .'');
print "<center>";
echo "<a href=\"?p=1&id=" . $_GET['id'] . "\"><<</a> ";
if($page > 1):
echo "<a href=\"?p=" . ($page-1) . "&id=" . $_GET['id'] . "\"><</a> ";
endif;
echo $paging_links;
if($page < $cnt_pages):
echo " <a href='?p=".($page+1)."&id=" . $_GET['id'] . "'>></a> ";
endif;
echo "<a href='?p=".$cnt_pages."&id=" . $_GET['id'] . "'>>></a>";
print "</center>";
?>
Все работает.
У меня осталось лишь два вопроса по этой теме. Насколько приведенный мной код надежен и как сделать так, чтобы увеличить ограничения для ссылок до десяти. Это код отбражает страницы так: 1 2 3 ... 7, а я хочу, чтобы до 10-й страницы обрывов не было. Заранее благодарю!!!
Неактивен
Во многих местах используется intval($_GET['id']), однако не везде
$paging_links = $lang_common['Pages'].' '.paginate($cnt_pages, $page, 'add3.php?id='. $_GET['id'] .'');
Это потенциально может привести к вставке на страницу кода, заданного в GET-параметрах, так называемого XSS
Неактивен