|
|
|
| Пишу сайт с модулем новостей. Хочу чтобы можно было выбрать категорию на отдельной странице, затем нажать "Отсеять", и показывались только новости этой категории.
Вот этот запрос не работает:
SELECT * FROM news WHERE category=$cat ORDER BY id DESC LIMIT $count, 20
|
_____________
$cat - Название категории, передается через GET
$count - стартовая новость страницы (по формуле $page-1*5, где $page - номер страницы, GET, начинается с единицы)
Помогите пожалуйста | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 22:40)
| | $cat - это число? | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 22:50)
| | Нет, это название категории латинскими буквами | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 22:56)
| | это плохо, в принципе лучше вынести названия категорий в отдельную таблицу и делать связь по id категории да и безопасней это в гет передавать цифру, а не строку
если строка то нужны апострофы
SELECT * FROM news WHERE category='$cat' ORDER BY id DESC LIMIT $count, 20 | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 22:59)
| | Взял номер категории вместо названия, через переменную $cat. Ошибка:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/i/inkrize.h19.ru/WWW/modules/blog_body.php on line 10 | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:10)
| | дайте кусок кода (запрос и обработку запроса) | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 22:59)
| | Вот весь код страницы:
<?php
include("db.php");
$page=$_GET["page"];
$offset=($page-1)*5;
$cat=1;
$query=mysql_query("SELECT * FROM news WHERE cat=$cat ORDER BY id DESC LIMIT $offset,5");
$rows=mysql_num_rows($query);
for ($num=0; $num<$rows; $num++)
{
$title=mysql_result($query, $num, "title");
$short_text=mysql_result($query, $num, "short_text");
$date=mysql_result($query, $num, "date");
$id=mysql_result($query, $num, "id");
$cat=mysql_result($query, $num, "cat");
echo("<font size=2 color=grey><strong>$date</strong><br>$cat</font><br>
<a href='./show_full.php?id=$id'><font size=6>$title</font></a><br>
<div style='padding-left:40px; padding-top:10px; padding-bottom:10px;'>$short_text</div>
<div style='background-color:white; width:1000px; padding-left:5px; padding-bottom:2px; padding-top:2px;'><a href='./show_full.php?id=$id'>Читать далее...</a></div><br><br>
");
}
echo("<center>");
$q2=mysql_query("SELECT * FROM news");
$all_stats=mysql_num_rows($q2);
$page_num=ceil($all_stats/5);
for($ps=0; $ps<$page_num; $ps++)
{
$ps2=$ps+1;
echo("<a href='blog.php?page=$ps2'>$ps2</a> ");
}
echo("</center>");
?>
|
| |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:13)
| | поля таблицы news покажите
___
запрос обычно обрабатывается циклом while откуда у Вас for? | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:17)
| | id int(10)
title text
cat text
short_text text
full_text mediumtext
date date
Первая колонка - название, вторая - тип | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:19)
| | у Вас cat - это текстовое поле, нужно определиться :) | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:21)
| | Ой =( сейчас попробую! Но даже если ставлю скобки в запросе, вылазит ошибка: некорректный запрос! | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:23)
| | Не помогло: mysql_num_rows - некорректный идетификатор запроса! Возможно, запрос некорректен | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:26)
| | с запросом норм, откуда Вы такую обработку взяли чес слово интересно) | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:17)
| | Мне как-то for удобнее - в таблице не может быть ровно 5 записей (то-есть кратных 5) | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:29)
| | честно не понимаю о чем речь :)
$query="SELECT * FROM news WHERE cat=$cat ORDER BY id DESC LIMIT $offset,5";
$res=mysql_query($query);
if(mysql_num_rows($res)>0){
while($s=mysql_fetch_assoc($res)){
echo $[id]; и т.д.
}
}
|
| |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:33)
| | запрос выносим в отдельную переменную для того что бы потом легко было отобразить его на экране в целях отладки | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:34)
| | так я просто не совсем с массивами данных умею работать =( | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:36)
| | немного опечатался $s[id]
___
было бы желание, остальное фигня :) | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:37)
| | Ага я понял спасибо большое! Буду осваивать массивы) | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:33)
| |
Может быть вы имели ввиду:
| |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:38)
| | угу, не пропечаталась букавка | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:33)
| | Ошибочка! Мне нужно постраничный вывод, то-есть по 5 новостей на странице!! А тут все выводится на одной странице одним циклом! | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 22:40)
| | Тут темы модератор закрывает?
Еще раз большое человеческое спасибо Вам!!! | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:39)
| | нет темы тут закрываются, по другим причинам и довольно редко
тот кусок кода что я Вам начеркал пробовали? работает? | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:39)
| | Подождите! А как же массив? он одномерный! А это страница вывода 5 новостей! Где взять данные остальных 4? | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:43)
| | while будет работать до тех пор пока не переберет все строчки сколько бы их там ни было (5, 25, 73 или 345673)
по аналогии с id и title выводиться
добавьте echo $s[id]; echo $s[title]; и увидите | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:47)
| | 10 минуточек! Попробую-отпишусь)) Спасибо в любом случае! а можно еще так сделать:
if(mysql_num_rows($res)>0)
{
while($s=mysql_fetch_assoc($res)){
echo $[id]; и т.д.
}
else
{
echo("Новостей пока нет... Но это скоро исправится!");
}
|
Как-то так | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:54)
| | естественно можно, только одну закрывающую скобку забыл
и еще я бы результат работы цикла и строку "Новостей пока нет... Но это скоро исправится!"
присвоил бы например переменной $echonews и затем уже выводил в нужном месте сайта | |
|
|
|
|
|
|
|
для: Valick
(09.06.2011 в 23:47)
| | Ошибочка! Мне нужно постраничный вывод, то-есть по 5 новостей на странице!! А тут все выводится на одной странице одним циклом! | |
|
|
|
|
|
|
|
для: inkrize
(09.06.2011 в 23:58)
| | ну ведь выводиться и то уже хорошо)))
показывайте код опять) | |
|
|
|
|
|
|
|
для: Valick
(10.06.2011 в 00:03)
| |
<?php
include("db.php");
$page=$_GET["page"];
$offset=($page-1)*5;
$cat=1;
$query=mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT $offset,5");
if(mysql_num_rows($query)>0){
while($s=mysql_fetch_assoc($res)){
echo $[id];
// Дальше идет вывод всех полей с оформлением и две пустые строки для разделения новостей
}
}
else
{
echo("Новостей нет...");
}
// Вывод панели перехода со страницы на страницу
echo("<center>");
$q2=mysql_query("SELECT * FROM news");
$all_stats=mysql_num_rows($q2);
$page_num=ceil($all_stats/5);
for($ps=0; $ps<$page_num; $ps++)
{
$ps2=$ps+1;
echo("<a href='blog.php?page=$ps2'>$ps2</a> ");
}
echo("</center>");
?>
|
| |
|
|
|
|
|
|
|
для: inkrize
(10.06.2011 в 00:13)
| | если изменяете код нужно быть внимательнее :)
while($s=mysql_fetch_assoc($res)) -> while($s=mysql_fetch_assoc($query))
но это не есть гуд, так Вы будете путаться в переменных
$query - это запрос как бы, а
$res - это ресурс
___
послушайте совет, привыкайте к грамотному написанию кода.. это сэкономит потом и время и нервы) | |
|
|
|
|
|
|
|
для: Valick
(10.06.2011 в 00:20)
| | while($s=mysql_fetch_assoc($query))
В оригинале все правильно, это я в сообщении опечатался( | |
|
|
|
|
|
|
|
для: Valick
(10.06.2011 в 00:20)
| | а что там с постраничным выводом и категориями? | |
|
|
|
|
|
|
|
для: inkrize
(10.06.2011 в 00:24)
| | завтра на работе запульну сервер и будем посмотреть, на пальцах сложно докопаться до истины :) | |
|
|
|
|
|
|
|
для: Valick
(10.06.2011 в 00:35)
| | >завтра на работе запульну сервер
Непонял? =) | |
|
|
|
|
|
|
|
для: inkrize
(10.06.2011 в 00:36)
| | ну Апачь с МайЭСКЮЭЛЕМ запущу как положено и проверю код :) | |
|
|
|
|
|
|
|
для: inkrize
(10.06.2011 в 00:36)
| | ну вот что и требовалось доказать....
как только я сделал эхо запроса, сразу стало видно что при отсутствующем значении страницы оффсет в лимите равен -5
переменные всегда нужно контролировать
теперь что у Вас там выводиться одним циклом? у меня ровно 5 значений на страницу | |
|
|
|
|
 5.5 Кб |
|
|
для: inkrize
(10.06.2011 в 00:36)
| |
<?php
include('conect.php');
// проверка переменных (упрощенно)
if(isset($_GET['page'])) $page=intval($_GET['page']); else $page=1;
if(isset($_GET['cat'])){
$cat=intval($_GET['cat']);
$where="WHERE id_cat=$cat";
}else{
$where="";
}
$offset=($page-1)*5;
// вывод категорий
echo " <a href='news_bloc.php'>новости без категорий</a> ";
$query="SELECT * FROM cat";
$res=mysql_query($query);
if(mysql_num_rows($res)>0){
while($s=mysql_fetch_assoc($res)){
echo "| <a href='news_bloc.php?cat=".$s[id]."'>$s[name]</a> ";
}
}else {
echo("Отсутствуют категории...");
}
echo "<hr />";
// вывод новостей
$query="SELECT
SQL_CALC_FOUND_ROWS *
FROM news $where
ORDER BY id DESC
LIMIT $offset,5";
$res=mysql_query($query);
if(mysql_num_rows($res)>0){
while($s=mysql_fetch_assoc($res)){
echo $s[date]." <b>$s[title]</b><br />";
echo $s[s_text]."<br /> <a href=''>читать далее</a>...<br />";
echo "<hr />";
}
}else {
echo("Новостей нет...");
}
// Вывод панели перехода со страницы на страницу
echo("<center>");
$query="SELECT FOUND_ROWS()";
$res=mysql_query($query);
$num=mysql_result($res,0);
$page_num=ceil($num/5);
for($ps=0; $ps<$page_num; $ps++){
$ps2=$ps+1;
if($cat) echo("<a href='news_bloc.php?page=$ps2&cat=$cat'>$ps2</a> ");
else
echo("<a href='news_bloc.php?page=$ps2'>$ps2</a> ");
}
echo("</center>");
?>
|
пробуйте + в аттаче база и конфиг | |
|
|
|
|
 5.7 Кб |
|
|
для: inkrize
(10.06.2011 в 00:36)
| | а вот вариант, когда одна новость может принадлежать разным категориям
не забудьте обновить базу, там некоторые изменения добавлена связующая таблица и убрано поле id_cat из таблицы news
<?php
include('conect.php');
// проверка переменных (упрощенно)
if(isset($_GET['page'])) $page=intval($_GET['page']); else $page=1;
if(isset($_GET['cat'])){
$cat=intval($_GET['cat']);
$where="WHERE catnews.id_cat=$cat";
}else{
$where="";
}
$offset=($page-1)*5;
// вывод категорий
echo " <b>новости</b> <a href='news_bloc.php'>без категорий</a> ";
$query="SELECT * FROM cat";
$res=mysql_query($query);
if(mysql_num_rows($res)>0){
while($s=mysql_fetch_assoc($res)){
echo "| <a href='news_bloc.php?cat=".$s[id]."'>$s[name]</a> ";
}
}else {
echo("Отсутствуют категории...");
}
echo "<hr />";
// вывод новостей
$query="SELECT
DISTINCT
SQL_CALC_FOUND_ROWS news.*
FROM news
LEFT JOIN catnews
ON catnews.id_news=news.id
$where
ORDER BY id DESC
LIMIT $offset,5";
$res=mysql_query($query);
if(mysql_num_rows($res)>0){
while($s=mysql_fetch_assoc($res)){
echo $s[date]." <b>$s[title]</b><br />";
echo $s[s_text]."<br /> <a href=''>читать далее</a>...<br />";
echo "<hr />";
}
}else {
echo("Новостей нет...");
}
// Вывод панели перехода со страницы на страницу
echo("<center>");
$query="SELECT FOUND_ROWS()";
$res=mysql_query($query);
$num=mysql_result($res,0);
$page_num=ceil($num/5);
for($ps=0; $ps<$page_num; $ps++){
$ps2=$ps+1;
if($cat) echo("<a href='news_bloc.php?page=$ps2&cat=$cat'>$ps2</a> ");
else
echo("<a href='news_bloc.php?page=$ps2'>$ps2</a> ");
}
echo("</center>");
?>
|
как видно из кода изменен только лишь запрос к базе и добавлена таблица, а функциональность сильно повысилась. | |
|
|
|