Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Синтаксис оператора SELECT
 
 автор: inkrize   (09.06.2011 в 22:40)   письмо автору
 
 

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

Вот этот запрос не работает:
SELECT * FROM news WHERE category=$cat ORDER BY id DESC LIMIT $count, 20


_____________
$cat - Название категории, передается через GET
$count - стартовая новость страницы (по формуле $page-1*5, где $page - номер страницы, GET, начинается с единицы)

Помогите пожалуйста

  Ответить  
 
 автор: Valick   (09.06.2011 в 22:50)   письмо автору
 
   для: inkrize   (09.06.2011 в 22:40)
 

$cat - это число?

  Ответить  
 
 автор: inkrize   (09.06.2011 в 22:56)   письмо автору
 
   для: Valick   (09.06.2011 в 22:50)
 

Нет, это название категории латинскими буквами

  Ответить  
 
 автор: Valick   (09.06.2011 в 22:59)   письмо автору
 
   для: inkrize   (09.06.2011 в 22:56)
 

это плохо, в принципе лучше вынести названия категорий в отдельную таблицу и делать связь по id категории да и безопасней это в гет передавать цифру, а не строку
если строка то нужны апострофы
SELECT * FROM news WHERE category='$cat' ORDER BY id DESC LIMIT $count, 20

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:10)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:15)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:10)
 

дайте кусок кода (запрос и обработку запроса)

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:13)   письмо автору
 
   для: 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>");
?>

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:17)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:13)
 

поля таблицы news покажите
___
запрос обычно обрабатывается циклом while откуда у Вас for?

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:19)   письмо автору
 
   для: Valick   (09.06.2011 в 23:17)
 

id int(10)
title text
cat text
short_text text
full_text mediumtext
date date

Первая колонка - название, вторая - тип

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:21)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:19)
 

у Вас cat - это текстовое поле, нужно определиться :)

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:23)   письмо автору
 
   для: Valick   (09.06.2011 в 23:21)
 

Ой =( сейчас попробую! Но даже если ставлю скобки в запросе, вылазит ошибка: некорректный запрос!

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:26)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:23)
 

Не помогло: mysql_num_rows - некорректный идетификатор запроса! Возможно, запрос некорректен

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:29)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:26)
 

с запросом норм, откуда Вы такую обработку взяли чес слово интересно)

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:29)   письмо автору
 
   для: Valick   (09.06.2011 в 23:17)
 

Мне как-то for удобнее - в таблице не может быть ровно 5 записей (то-есть кратных 5)

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:33)   письмо автору
 
   для: 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:34)   письмо автору
 
   для: Valick   (09.06.2011 в 23:33)
 

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

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:36)   письмо автору
 
   для: Valick   (09.06.2011 в 23:34)
 

так я просто не совсем с массивами данных умею работать =(

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:37)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:36)
 

немного опечатался $s[id]
___
было бы желание, остальное фигня :)

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:38)   письмо автору
 
   для: Valick   (09.06.2011 в 23:37)
 

Ага я понял спасибо большое! Буду осваивать массивы)

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:38)   письмо автору
 
   для: Valick   (09.06.2011 в 23:33)
 

echo $[id];


Может быть вы имели ввиду:
echo $s[id];

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:38)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:38)
 

угу, не пропечаталась букавка

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:57)   письмо автору
 
   для: Valick   (09.06.2011 в 23:33)
 

Ошибочка! Мне нужно постраничный вывод, то-есть по 5 новостей на странице!! А тут все выводится на одной странице одним циклом!

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:39)   письмо автору
 
   для: inkrize   (09.06.2011 в 22:40)
 

Тут темы модератор закрывает?

Еще раз большое человеческое спасибо Вам!!!

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:43)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:39)
 

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

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:43)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:39)
 

Подождите! А как же массив? он одномерный! А это страница вывода 5 новостей! Где взять данные остальных 4?

  Ответить  
 
 автор: Valick   (09.06.2011 в 23:47)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:43)
 

while будет работать до тех пор пока не переберет все строчки сколько бы их там ни было (5, 25, 73 или 345673)
по аналогии с id и title выводиться
добавьте echo $s[id]; echo $s[title]; и увидите

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:54)   письмо автору
 
   для: Valick   (09.06.2011 в 23:47)
 

10 минуточек! Попробую-отпишусь)) Спасибо в любом случае! а можно еще так сделать:


    if(mysql_num_rows($res)>0)
    { 
        while($s=mysql_fetch_assoc($res)){ 
            echo $[id]; и т.д. 
    }
   else
   {
       echo("Новостей пока нет... Но это скоро исправится!");
   }


Как-то так

  Ответить  
 
 автор: Valick   (10.06.2011 в 00:02)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:54)
 

естественно можно, только одну закрывающую скобку забыл
и еще я бы результат работы цикла и строку "Новостей пока нет... Но это скоро исправится!"
присвоил бы например переменной $echonews и затем уже выводил в нужном месте сайта

  Ответить  
 
 автор: inkrize   (09.06.2011 в 23:58)   письмо автору
 
   для: Valick   (09.06.2011 в 23:47)
 

Ошибочка! Мне нужно постраничный вывод, то-есть по 5 новостей на странице!! А тут все выводится на одной странице одним циклом!

  Ответить  
 
 автор: Valick   (10.06.2011 в 00:03)   письмо автору
 
   для: inkrize   (09.06.2011 в 23:58)
 

ну ведь выводиться и то уже хорошо)))
показывайте код опять)

  Ответить  
 
 автор: inkrize   (10.06.2011 в 00:13)   письмо автору
 
   для: 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>");
?>

  Ответить  
 
 автор: Valick   (10.06.2011 в 00:20)   письмо автору
 
   для: inkrize   (10.06.2011 в 00:13)
 

если изменяете код нужно быть внимательнее :)
while($s=mysql_fetch_assoc($res)) -> while($s=mysql_fetch_assoc($query))

но это не есть гуд, так Вы будете путаться в переменных
$query - это запрос как бы, а
$res - это ресурс
___
послушайте совет, привыкайте к грамотному написанию кода.. это сэкономит потом и время и нервы)

  Ответить  
 
 автор: inkrize   (10.06.2011 в 00:23)   письмо автору
 
   для: Valick   (10.06.2011 в 00:20)
 

while($s=mysql_fetch_assoc($query))

В оригинале все правильно, это я в сообщении опечатался(

  Ответить  
 
 автор: inkrize   (10.06.2011 в 00:24)   письмо автору
 
   для: Valick   (10.06.2011 в 00:20)
 

а что там с постраничным выводом и категориями?

  Ответить  
 
 автор: Valick   (10.06.2011 в 00:35)   письмо автору
 
   для: inkrize   (10.06.2011 в 00:24)
 

завтра на работе запульну сервер и будем посмотреть, на пальцах сложно докопаться до истины :)

  Ответить  
 
 автор: inkrize   (10.06.2011 в 00:36)   письмо автору
 
   для: Valick   (10.06.2011 в 00:35)
 

>завтра на работе запульну сервер


Непонял? =)

  Ответить  
 
 автор: Valick   (10.06.2011 в 00:38)   письмо автору
 
   для: inkrize   (10.06.2011 в 00:36)
 

ну Апачь с МайЭСКЮЭЛЕМ запущу как положено и проверю код :)

  Ответить  
 
 автор: Valick   (10.06.2011 в 11:12)   письмо автору
 
   для: inkrize   (10.06.2011 в 00:36)
 

ну вот что и требовалось доказать....
как только я сделал эхо запроса, сразу стало видно что при отсутствующем значении страницы оффсет в лимите равен -5
переменные всегда нужно контролировать
теперь что у Вас там выводиться одним циклом? у меня ровно 5 значений на страницу

  Ответить  
 
 автор: Valick   (10.06.2011 в 12:41)   письмо автору
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>"); 
?> 

пробуйте + в аттаче база и конфиг

  Ответить  
 
 автор: Valick   (10.06.2011 в 14:14)   письмо автору
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>"); 
?> 

как видно из кода изменен только лишь запрос к базе и добавлена таблица, а функциональность сильно повысилась.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования