Дайте совет по CMS строению

seosniks
На сайте с 13.08.2007
Offline
389
1015

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

А на главной выводились все добавленые новости.

пробовал так

$_GET['id'] это пагинатор

$cat это категория вида catid=1 2 3 и так далее
if($_GET['id']=='') {
$cat =$_GET['catid'];
if($cat!=''){
if(isset ($_GET['catid'])) {
$Q1 = mysql_query("SELECT * FROM news,category WHERE id and news.catid=category.catid and category.catid='".$cat."' LIMIT $start,$per_page");
}else{
$Q1 = mysql_query("SELECT * FROM news WHERE id LIMIT $start,$per_page");
}

все работает, хотя это код не очень как мне кажеться.

если значени if($cat!=''){ 0 то выводяться все новости

если в if($cat!=''){ попадает catid=1 2 3 4 и тд

то срабатывает

$Q1 = mysql_query("SELECT * FROM  news,category WHERE  id  and news.catid=category.catid and category.catid='".$cat."' LIMIT $start,$per_page");

мне надо сделать такой запрос чтоб при указании урла вида

сайт.ru/catid=1

выдавало новости из нужной категории.

Но сделать все это одним запрососом

вида

$Q1 = mysql_query("SELECT * FROM  news,category WHERE  id  and news.catid=category.catid and category.catid='".$cat."' LIMIT $start,$per_page");

Но вся проблемма в том что этот запрос отдает повторы новостей из за

того что беруться 2 таблицы

FROM news,category.

В общем надо сделать так чтоб при запросе сайт.ru/catid=1 выдавало только новости из категории 1

а при запросе адреса сайта сайт.ru/ выдавало все новости .

Я понимаю что можно сделать блоки

каждый блок одна категория. Но мне нужно все сразу.

Если кто подскажет как составить запрос буду оченнь благодарен.

J
На сайте с 02.02.2009
Offline
53
#1

"WHERE id"

это вот что такое?

D
На сайте с 29.01.2009
Offline
42
#2

Не понял эту запись

$Q1 = mysql_query("SELECT * FROM news,category WHERE id and news.catid=category.catid and category.catid='".$cat."' LIMIT $start,$per_page");

Почему не так

$Q1 = mysql_query("SELECT * FROM news,category WHERE news.catid='".$cat."' and category.catid='".$cat."' LIMIT $start,$per_page");

if(!$_GET['id']) {
$cat =$_GET['catid'];
if($cat){

У вас же $_GET['catid'] не может быть ноль. Или isset или !isset. Зачем лишние проверки делаете?

Devider добавил 16.03.2009 в 14:05

Но вся проблемма в том что этот запрос отдает повторы новостей из за

Повторы новостей, если новостей больше чем категорий, и наоборот )

Плохо представляю как это грамотно сделать в один запрос. Наверное из меня некудышный mysql-оптимизатор)) В принципе можно сделать одним запросом, если присваивать ключ массиву catid, дублироваться ничего не будет, но это неудобно на будущее. Лучше лишний раз с кэшем поработать )

Там где нужно считать все категории и товары, считываем все категории, по id

$Q=mysql_query("SELECT * FROM TABLE");

while ($R=mysql_fetch_assoc($Q)) { $A[$R['catid']]=$R; }

Потом новости

$Q=mysql_query("SELECT * FROM TABLE2");

while ($R=mysql_fetch_assoc($Q)) { $A[$R['catid']]['SUB'][]=$R['id']; $B[$R['id']]=$R; }

Шаблонизатор вы видимо не используете...

foreach ($A as $i=>$CAT_NEWS)

{

echo 'Категория '.$CAT_NEWS['name'];

if (isset($CAT_NEWS['SUB'])) foreach ($CAT_NEWS['SUB'] as $j=>$id_news) { echo $B[$id_news]['name'].'<br>'; }

}

Если немножко подумать, можно конечно сделать и грамотнее, а можно и так ;)

сегодня стал еще беднее
J
На сайте с 02.02.2009
Offline
53
#3

Добавлю еще что в целом сама цель неясна. Зачем выбирать ещё и категории, когда выбираете из конкретной категории новости?

И если представите структуру таблиц - будет пояснее, конечно=)

D
На сайте с 29.01.2009
Offline
42
#4
Зачем выбирать ещё и категории, когда выбираете из конкретной категории новости?

Категория там выбирается она, просто дублируется к новостям ) Желание сэкономить на запросах видимо завело ТС не туда...

J
На сайте с 02.02.2009
Offline
53
#5

ну если так, тогда

if($cat_id){

$dop_query = "WHERE n.cat_id=$cat_id";

}

SELECT * FROM news n INNER JOIN cats c ON c.id=n.cat_id $dop_query GROUP BY n.id

чёнить такого плана

seosniks
На сайте с 13.08.2007
Offline
389
#6
jumash:
"WHERE id"

это вот что такое?

выборка по ID.

seosniks добавил 16.03.2009 в 16:22

jumash:
Добавлю еще что в целом сама цель неясна. Зачем выбирать ещё и категории, когда выбираете из конкретной категории новости?

И если представите структуру таблиц - будет пояснее, конечно=)

Выбирать из конретной категории,это кода мне надо все новости из категории интренет. Я жму на ссылку которая имеет например ID номер 3

и все носоти этой категории видны.

А так мне надо чтоб на морде сайцта выводились категории без сортировки, тоест новость кинул в раздел деньги и она видна.

таблица

category    


catid title_cat cpu_cat
1 политика politika
2 новости news
3 интернет internet
0 Сегодня segodnya

таблица news

id title author dates text url_istok views status cpu md5 catid

где catid имеет номер новости из таблицы категорий

например catid 1= категории политика

Категории я хотел сделать чтоб новост идобавлять в разны екатегории.

Прочел книгу но видать структура кода не очень правильная. :(

Я не волшебник я только учусь :D

seosniks добавил 16.03.2009 в 16:24

Devider:
Категория там выбирается она, просто дублируется к новостям ) Желание сэкономить на запросах видимо завело ТС не туда...

Да именно дублируеться каждая категория.

Просто как составить верный запрос не вкурю.

Если у меня урл без дополнительных параметров,тогда надо все носоти

если урл имеет парамерты после ? тогда выводим то что идет после ?.

JE
На сайте с 29.04.2007
Offline
17
#7

Мне кажется так не стоит делать:

category.catid='".$cat."'

ибо:

$cat = "10'(закрыли кавычку) UNION SELECT (что нужно) WHERE '1'='1(для закрывающей)"

нужно хотя бы так:

category.catid='" . (int)$cat . "'

а лучше по нормальному:

$cat = mysql_real_escape_string($cat)

PS: давно на php не кодил могу ошибиться, но не принципиально

Design For Masters (http://designformasters.info)
[Удален]
#8
все работает, хотя это код не очень как мне кажеться.

это не код вообще в принципе, это кусок говна

J
На сайте с 02.02.2009
Offline
53
#9

Ну я тогда написал же как сделать лучше всего будет в вашем случае=)

/ru/forum/comment/4517474

исправляя под вашу структуру


$dop_query = '';
if(is_numeric($cat_id)){
$dop_query = "WHERE n.cat_id=$cat_id";
}
SELECT * FROM news n INNER JOIN category c ON c.catid=n.catid $dop_query GROUP BY n.id

В этом случае выберутся все данные, сгруппированные по id из news - хотя в целом при такой структуре дублей быть не может)

то есть усложняем -


$dop_query = '';
if(is_numeric($_GET['cat_id'])){
$dop_query = "WHERE n.cat_id=".$_GET['cat_id'];
}
$query = "SELECT c.title_cat, c.catid, n.title FROM news n INNER JOIN category c ON c.catid=n.catid ".$dop_query." GROUP BY n.id";
$res = mysql_query($query);
if($res && mysql_num_rows($res)!=0){
while($row = mysql_fetch_assoc($res)){
echo "Категория: <a href='/?catid=".$row['catid']."'>".$row['title_cat']."</a><br>Заголовок новости - ".$row['title']."<hr>";
}
}
seosniks
На сайте с 13.08.2007
Offline
389
#10
bearman:
это не код вообще в принципе, это кусок говна

Это понятно что это не код. Но ваш пост к чему?

Я Просил помощи, совета, Ваш ответ не очень похож на него.

Хотя судя по вашему блогу, у Вас все пишут гавном ;):D

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий