SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.04.2008 16:57:25

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Проблема с ссылками

Здравствуйте. Есть страница, которая создает ссылки на информацию, находящуюмя в базе данных:

<?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!";
}
?>

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

Неактивен

 

#2 04.04.2008 17:12:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с ссылками

$result = mysql_query("SELECT * FROM employees WHERE (id=" . intval($_GET['id']) . " )", $db);

Неактивен

 

#3 04.04.2008 17:28:41

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Спасибо огромное, все получилось. Если можно, у меня еще вопрос. Я знаю, что количество ссылок на странице можно регулировать запросом LIMIT. Но можно л сделать так, что ссылки, оставшиеся за пределами лимита, автоматически переходили на другую страницу, а на предыдущей странице автоматически создавалась ссылка на эту страницу.

Неактивен

 

#4 04.04.2008 19:23:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с ссылками

Автоматически - нет, но Вы можете написать соответствующий код. Можете воспользоваться,
например, SQL_CALC_FOUND_ROWS.

Неактивен

 

#5 04.04.2008 23:05:38

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Я новичок в этом деле. Поэтому, если Вас не затруднит, то не могли бы вы показать мне какой-нибудь пример.

Неактивен

 

#6 05.04.2008 02:37:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с ссылками

Посмотрите код любого форума, например, PunBB.

Неактивен

 

#7 05.04.2008 10:15:51

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

Если по-простому:
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", ..

Неактивен

 

#8 08.04.2008 23:43:29

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

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)

Неактивен

 

#9 09.04.2008 01:06:45

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

Я привел это как алгоритм для PHP, который надо выполнять при каждом обращении.

Неактивен

 

#10 21.04.2008 00:02:29

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Я попробовал так:

<?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>

Но как сделать, что если это первая страница, то появлялась лишь ссылка "вперед", а если последняя - "назад"?

Неактивен

 

#11 21.04.2008 00:32:46

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

это не очень хорошая практика вставлять php внутрь HTML, лучше все внутри PHP

<?php

if($page > 1) {
echo "<a href=\"add2.php?page=" . ($page-1) . "&amp;id=" . $_GET['id'] . "\">Назад</a>";
}

Неактивен

 

#12 21.04.2008 15:41:16

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

При таком запросе у меня ссылка вообще не появляется. Кроме того, меня больше интересует, как сделать, что если это первая страница, то появлялась лишь ссылка "вперед", а если последняя - "назад"?

Неактивен

 

#13 21.04.2008 15:57:21

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

Как раз это и приведен ответ, но только для ссылки "Назад". На первой странице она не появляется.

Неактивен

 

#14 21.04.2008 18:21:29

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Для ссылки вперед я попробовал

if($page <= $result) {
echo "<a href=\"add2.php?page=" . ($page+1) . "&amp;id=" . $_GET['id'] . "\">Вперед</a>";
}

Но он блокирует последнюю страницу

Неактивен

 

#15 21.04.2008 20:07:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

Что значит блокирует?

Неактивен

 

#16 21.04.2008 21:39:21

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Не выдает ссылку "вперед" на последнюю страницу

Неактивен

 

#17 21.04.2008 21:59:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

А почему Вы номер страницы сравниваете с $result? Надо сравнивать с числом страниц. $result - у Вас переменная типа ресурс, содержащая ответ MySQL

Неактивен

 

#18 09.05.2008 01:52:43

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Тогда получается, что при увеличении информации, мне каждый раз придется количество страниц?

Неактивен

 

#19 09.05.2008 02:19:09

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

Возможно мы говорим о разном. Попробуйте просто отладить скрипт. Выводите с помощую echo значения всех переменных, используемых в условиях if(). Тогда станет все понятно.

Неактивен

 

#20 10.06.2008 17:41:34

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Добрый день. Знаю, что уже порядком Вам надоел, но уж очень хочется, чтобы все получилось. Я порылся в нете и попробовал такой вариант:


$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.
Помогите пожалуйста!!!

Неактивен

 

#21 10.06.2008 18:02:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с ссылками

1. В этом сценарии явно не хватает фигурных скобок.
2. Второй запрос визуально изменился и теперь он не получает данные, только их количество.

Попробуйте переписать всё с чистого листа?

Неактивен

 

#22 10.07.2008 01:10:29

serjinio
Завсегдатай
Зарегистрирован: 10.07.2008
Сообщений: 30

Re: Проблема с ссылками

rgbeast написал:

это не очень хорошая практика вставлять php внутрь HTML, лучше все внутри PHP


А с чем это связано???Будьте добры ,подскажите.

Неактивен

 

#23 10.07.2008 05:24:09

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

Если HTML у Вас в файле, то это исключает возможность хранения верстки в базе данных. Получается смешивание верстки и программного кода. ИМХО, удобнее хранить верстку в базе данных и выводить ее пользователю на PHP

Неактивен

 

#24 23.07.2008 15:26:26

Sarkhan
Участник
Зарегистрирован: 04.04.2008
Сообщений: 20

Re: Проблема с ссылками

Доброго времени суток. Очень хочется надеяться, что я вам еще не надоел. smile
Обидно, что мне понадобтлось больше трех месяцев, чтобы что-то получилось (правда, я периодически забрасывал это дело, а потом вновь возвращался). Вобщем, в принципе у меня все получилось. Я скрестил код из форума 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.'&amp;p=1">1</a>';

            if ($cur_page != 4)
                $pages[] = '&hellip;';
        }

        // 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.'&amp;p='.$current.'">'.$current.'</a>';
            else
                $pages[] = '<strong>'.$current.'</strong>';
        }

        if ($cur_page <= ($cnt_pages-3))
        {
            if ($cur_page != ($cnt_pages-3))
                $pages[] = '&hellip;';

            $pages[] = '<a href="'.$link_to.'&amp;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.'&amp;action=all">'.$lang_common['All'].'</a>';
/// MOD VIEW ALL PAGES IN ONE END
    }

    return implode('&nbsp;', $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&amp;id=" . $_GET['id'] . "\"><<</a>&nbsp;&nbsp;";
if($page > 1):
echo "<a href=\"?p=" . ($page-1) . "&amp;id=" . $_GET['id'] . "\"><</a>&nbsp;&nbsp;";
endif;

echo $paging_links;
if($page < $cnt_pages):
echo "&nbsp;&nbsp;<a href='?p=".($page+1)."&amp;id=" . $_GET['id'] . "'>></a>&nbsp;&nbsp;";
endif;
echo "<a href='?p=".$cnt_pages."&amp;id=" . $_GET['id'] . "'>>></a>";
print "</center>";
?>

Все работает.

У меня осталось лишь два вопроса по этой теме. Насколько приведенный мной код надежен и как сделать так, чтобы увеличить ограничения для ссылок до десяти. Это код отбражает страницы так:  1 2 3 ... 7, а я хочу, чтобы до 10-й страницы обрывов не было. Заранее благодарю!!!

Неактивен

 

#25 27.07.2008 19:56:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Проблема с ссылками

Во многих местах используется intval($_GET['id']), однако не везде
    $paging_links = $lang_common['Pages'].' '.paginate($cnt_pages, $page, 'add3.php?id='. $_GET['id'] .'');
Это потенциально может привести к вставке на страницу кода, заданного в GET-параметрах, так называемого XSS

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson