X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> не слишком ли тупо?
kalpak44
kalpak44
Topic Starter сообщение 1.9.2011, 2:08; Ответить: kalpak44
Сообщение #1


в базе 3 таблицы
1-content
(таблицы id title metka)
2-rubrics
(таблицы id title)
3-rubric_content
(таблицы rubric_id content_id)

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

[PHP]

<?php
//соединение с базой

$db = mysql_connect('localhost','root','');
mysql_select_db('test',$db);

if (isset($_GET['cat'])) {$cat = $_GET['cat'];}
if (!isset($cat)) {$cat = '1';}

//запрос к базе

$result = mysql_query("SELECT * FROM rubric_content Where rubric_id = $cat",$db);
if (!$result) //если не существует переменной result
{
exit("<p>1Запрос на выборку данных не выполнен! Если вы видите данное сообщение пожалуйста сообщите администратору</p>"); //остановка скрипта с сообщением об ошибки
}
if (mysql_num_rows($result) > 0) //если есть что нибудь в переменной $result
{
$myrow = mysql_fetch_array ($result);
}
else
{
echo "<p>Информация не может быть извлечена, поскольку в таблице нет записей</p>";
};
do
{
$content = $myrow['content_id']; //лень писать $myrow['content_id']

$result1 = mysql_query("SELECT * FROM content WHERE id = $content",$db);
if (!$result1) //если не существует переменной result
{
exit("<p>2Запрос на выборку данных не выполнен! Если вы видите данное сообщение пожалуйста сообщите администратору</p>"); //остановка скрипта с сообщением об ошибки
}
if (mysql_num_rows($result) > 0) //если есть что нибудь в переменной $result
{
$myrow1 = mysql_fetch_array ($result1);

$m = $myrow1['title'];
$a = mysql_query("UPDATE content SET metka = '1' WHERE title ='$m'");
}
else
{
echo "<p>Информация не может быть извлечена, поскольку в таблице нет записей</p>";
};

}
while ($myrow = mysql_fetch_array ($result));

?>
<?php
// Переменная хранит число сообщений выводимых на станице
$num = 2;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT COUNT(*) FROM content WHERE metka = '1'");
$posts = mysql_result($result, 0);
// Находим общее число страниц
$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;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM content WHERE metka = '1' LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))


echo "<table>";
for($i = 0; $i < $num; $i++)
{
echo "<tr>
<td>".$postrow[$i]['title']/*."</td>
<td>".$postrow[$i]['time']."</td></tr>
<tr><td colspan=\"2\">".$postrow[$i]['text']*/."</td></tr>";
}
echo "</table>";
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./view_cat.php?page=1><<</a>
<a href= ./view_cat.php?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./view_cat.php?page='. ($page + 1) .'>></a>
<a href= ./view_cat.php?page=' .$total. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./view_cat.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./view_cat.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./view_cat.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./view_cat.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>
<?php
//сброс меток
$a = mysql_query("UPDATE content SET metka = '0'");
?>
[/PHP]
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 1.9.2011, 4:01; Ответить: alexdrob
Сообщение #2


строки 4,5 - устаревшие функции, возможно в новых версиях пхп вообще не будет работать, и они медленные, используйте mysqli или PDO

строки 7,8 можно заменить так
[PHP]$cat = isset($_GET['cat']) ? (int) $_GET['cat'] : 1;[/PHP]

строка 12, если не менять строки 7,8 то тут будет sql injection

строки с 17 по 47, это по урокам Попова? зачем использовать do ... while? проще while ...
эти же строки - у вас в цикле запрос, это не очень хорошо, объедините первый запрос ос вторым - так будет 1 запрос. или в первом используйте group_concat с группировкой для того что бы получить строку id через запятую - так будет два запроса. У вас же их будет столько сколько раз выполнится цикл + 1.
хм... сразу не досмотрел, там ещё один запрос в цикле ) так как 4 утра, в логике разбиратся не хочу, но это плохо) сделайте одни или 2мя запросами вывод, но точно не запросы в цикле.

строка 54 - нет гарантии что переменная есть, используйте проверку как и с cat.

56 - так как у вас выборка по условию, то лучше используйте count(`id`) или count(1)

intval() - медленнее чем (int)

если поправите 56 строку то 61 не нужна

65 строка - странная логика, если 0 или < 0 не проще заменить одной проверкой if ($page < 1) или if ($page <= 0) ?

65, 66 строки можно заменить вот так, хотя по сути быстрей работать думаю не станет тут, а может даже медленней.
[PHP]$page = $page < 1 ? 1 : ($page > $total) ? $total : $page;[/PHP]

какой смысл в коде с 73 по 83 строку не понял, зачем сначала создавать массив а потом в цикле for пробегать по нему ещё раз?

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

для чего нужны строки 39 и 101 не понял :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 1.9.2011, 4:02; Ответить: alexdrob
Сообщение #3


(kalpak44 @ 1.9.2011, 05:08) *
<a href= ./view_cat.php?page=1><<</a>

кстати, так < значёк не выводят в html замените спец символами, и > тоже
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
kalpak44
kalpak44
Topic Starter сообщение 1.9.2011, 15:07; Ответить: kalpak44
Сообщение #4


через них я хотел вывести из таблицы content строки title(в начале ставил метки в таблицу затем вытаскивал по этим меткам потом обнулял метки - в голову другое не пришло), но только у которых id = content_id из таблицы rubric content и так чтобы эти строки (title) выводильсь постранично по х на страницу
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 1.9.2011, 15:25; Ответить: alexdrob
Сообщение #5


омг, сейчас не 4 утра :D но я ещё больше запутался :) ну поставили вы метки, а в этот же момент ещё какой то человек открывает сайт, другой раздел, и там метки стали, и что выведется?) или наоборот уберутся местки, если два человека открыли сайт, один раздел, то первый скрипт сбросит метки а второй не найдёт меток. такой подход не верен.

советую прочитать про left, right join. у вас тут вообще всё одним запросом по идеи можно вытащить, максимум 2мя что бы один не нагромождать вложенными запросами.
уберите колонку metka вообще.

вы что хотите? выбрать категорию для каждой статьи? тогда выбираете всё из таблицы rubric_content с условием rubric_id = $cat и объединяете таблицу с двумя другими с помощью join'ов.
или же, объединяете только два таблицы, рубрики и rubric_content выбираете всё из неё, потом делаете запрос для выборки всех статей.
с другой стороны, у вас же будет одно имя рубрики, так как фильт по ид рубрики, значит можно отдельно выбрать заголовок рубрики, и отдельно объединить таблицы rubric_content и content.

1 способ будет 1 запрос
2 и 3 способы - 2 запроса
и не каких меток.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
kalpak44
kalpak44
Topic Starter сообщение 1.9.2011, 21:08; Ответить: kalpak44
Сообщение #6


если бы знал как эт сделать ((( я пхп начал изучать ток пару недель назад, извиняюсь за тупость, но есмогли ли бы чуть по подробнее про join'ы?

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


 



RSS Текстовая версия Сейчас: 26.4.2024, 7:29
Дизайн