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

Форум MySQL

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

 

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

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

тема: Как правильно произвести выборку с БД
 
 автор: sevidi   (03.09.2010 в 10:08)   письмо автору
 
 

Проектирую интернет-магазин. Создана таблица с каталогом продукции.
CREATE TABLE IF NOT EXISTS `system_position` (
  `id_position` int(11) NOT NULL auto_increment,
  `author` tinytext NOT NULL,
  `title` tinytext NOT NULL,
  `catid` enum('site','diz') NOT NULL default 'site',
  `price` tinytext NOT NULL,
  `currency` enum('RUR','USD','EUR') NOT NULL default 'RUR',
  `description` tinytext NOT NULL,
  `pos` int(11) NOT NULL default '0',
  `hide` enum('show','hide') NOT NULL default 'show',
  `putdate` datetime NOT NULL,
  `id_catalog` int(8) NOT NULL default '0',
  PRIMARY KEY  (`id_position`)
)

Выборка из талицы осуществляется сначала в файл, где размещается категория продукции.
<?php  
  
// Формируем ассоциативный массив, где в качестве ключей выступают,
  // параметры, передаваемые в строке запроса, а в качестве значений,
  // имена полей в таблице product
  
$order = array();
  
$order['title'] = "title";
   
  
// Формируем временную переменную $strtmp, которая далее
  // используется для сортировки результатов SQL-запроса при извлечении
  // товарных позиций из таблицы product
  // По умолчанию сортируем товарные позиции по полю pos
  
$strtmp "pos";
  
// Если через параметр строки запроса задана прямая или обратная
  // сортировка по одному из полей таблицы order изменяем значение
  // временной переменной $strtmp
  
foreach($order as $parametr => $field)
  {
    if(isset(
$_GET[$parametr]))
    {
      if(
$_GET[$parametr] == "up")
      {
        
$_GET[$parametr] = "down";
        
$strtmp $field;
      } 
      else 
      {
        
$_GET[$parametr] = "up";
        
$strtmp "$field DESC";
      }
    }
    else 
$_GET[$parametr] = "up";
  }
  
// Выбираем из таблицы product
  
$query "SELECT * FROM $tbl_cat_position 
            WHERE id_catalog=
$_GET[id_catalog] 
            ORDER BY 
$strtmp";
  
$pos mysql_query($query);
  if(!
$pos)
  {
    throw new 
ExceptionMySQL(mysql_error(), 
                             
$query,
                            
"Ошибка при извлечении 
                             параметров текущего раздела"
);
  }
  
// количество рядов в наборе должно быть больше нуля
  
if (mysql_num_rows($pos)>0)
  {
     
// формируем ссылку с помощью которой можно сортировать товарные
     // позиции по выводимым полям таблицы
     
$href "index.php?id_catalog=$_GET[id_catalog]";
     
    
$i 0;
    while(
$position mysql_fetch_array($pos))
    {
       
      if(
$i++ % 2$class "stable_tr_clr2";
      else 
$class "stable_tr_clr1";
      
// Выводим строку таблицы
     
echo "<div class=\"$class\">";          
               
      echo 
"<div align=\"left\" class=\"div_v\"><ul>";
      
      echo     
"<li><a href=\"show_book.php".htmlspecialchars($position['url'])."\" 
                       class=\"menu_div_lnk\">
                     "
.htmlspecialchars($position['title'])."</a><br></ul>";
                       
      echo
"</div></div>"
  }

выводится поле 'catid'.
Далее происходит переход в файл show_book.php, где происходи выборка по всем другим полям таблицы
<?php   
  
// Выводим таблицу с товарными позициями
  // Формируем ассоциативный массив, где в качестве ключей выступают,
  // параметры, передаваемые в строке запроса, а в качестве значений,
  // имена полей в таблице product
  
$order = array();
  
$order['author']       = "author";
  
$order['title']        = "title";
  
$order['catid']        = "catid";
  
$order['price']        = "price";
  
$order['currency']     = "currency";
  
$order['description']  = "description";
  
   
  
// Формируем временную переменную $strtmp, которая далее
  // используется для сортировки результатов SQL-запроса при извлечении
  // товарных позиций из таблицы product
  // По умолчанию сортируем товарные позиции по полю pos
  
$strtmp "pos";
  
// Если через параметр строки запроса задана прямая или обратная
  // сортировка по одному из полей таблицы order изменяем значение
  // временной переменной $strtmp
  
foreach($order as $parametr => $field)
  {
    if(isset(
$_GET[$parametr]))
    {
      if(
$_GET[$parametr] == "up")
      {
        
$_GET[$parametr] = "down";
        
$strtmp $field;
      } 
      else 
      {
        
$_GET[$parametr] = "up";
        
$strtmp "$field DESC";
      }
    }
    else 
$_GET[$parametr] = "up";
  }
  
// Выбираем из таблицы product
  
$query "SELECT * FROM $tbl_cat_position 
            WHERE id_catalog=
$_GET[id_catalog] 
            ORDER BY 
$strtmp";
  
$pos mysql_query($query);
  if(!
$pos)
  {
    throw new 
ExceptionMySQL(mysql_error(), 
                             
$query,
                            
"Ошибка при извлечении 
                             параметров текущего раздела"
);
  }
  
// количество рядов в наборе должно быть больше нуля
  
if (mysql_num_rows($pos)>0)
  {
     
// формируем ссылку с помощью которой можно сортировать товарные
     // позиции по выводимым полям таблицы
     
$href "catalog.php?id_catalog=$_GET[id_catalog]";
     echo 
"<table width=96% 
                  border=0 
                  cellspacing=1 
                  cellpadding=1>
            <tr class=stable_tr_ttl_clr>
             <td align=center class=stable_txt>
                <b><span class=main_txt>Категория</span></b>
             </td>
             <td align=center class=stable_txt>
                <b><span class=main_txt>Наименование</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Автор</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Цена</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Валюта</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Описание</span></b> 
             </td>                     
          </tr>"
;
    
$i 0;
    while(
$position mysql_fetch_array($pos))
    {
      
//Определяем категорию
      
switch ($position['catid'])
      {
          case 
'site':
          
$distr "Разработка веб-сайтов";
          break;
          case 
'diz':
          
$distr "Веб-дизайн и графика";
          break;
          default:
$distr="&nbsp";
      }
      if(
$i++ % 2$class "stable_tr_clr2";
      else 
$class "stable_tr_clr1";
      
// Выводим строку таблицы
      
echo "<tr class=\"$class\">
            <td align=left class=stable_txt style='padding-left:20px'>
              
$distr
            </td>
            <td class=stable_txt>
              
$position[title]
            </td>
            <td class=stable_txt>
              
$position[author]
            </td>
            <td class=stable_txt>
              
$position[price]
            </td>
            <td align=center class=stable_txt>
              
$position[currency]
            </td>
            <td align=center class=stable_txt>
              
$position[description]
            </td>           
           </tr>"
;    }
    echo 
"</table><br>";
  }
?>

В этом случае браузер выдает ошибку

Произошла исключительная ситуация (ExceptionObject) - попытка использования в качестве элемента управления объекта, класс которого не является производным от базового класса field. Ошибка при извлечении параметров текущего раздела.

Ошибка в файле D:\svd\shop\show_book.php в строке 78.

Если менять формат SELET запроса
$query = "SELECT * FROM $tbl_cat_position 
            WHERE id_catalog";

выводится вся информация, а не по конкретному полю id_catalog.

Почему это происходит? Почему в первом файле код работает, а во втором нет?

  Ответить  
 
 автор: Лена   (03.09.2010 в 10:47)   письмо автору
 
   для: sevidi   (03.09.2010 в 10:08)
 

>Произошла исключительная ситуация (ExceptionObject) - попытка использования в качестве элемента управления объекта, класс которого не является производным от базового класса field.

1.Код и второго, и первого файла по идее должен быть внутри класса, родителем которого выступает класс field, т.е. должно быть что-то типа такого:
Class myField extends field{
...............
}
Исключительная ситуация вызвана тем, что вы не определили класс как потомок родительского класса.

2. Выводите запрос на экран, т.е. после определения $query делайте print $query и смотрите, что приходит в запрос, от этого и отталкивайтесь.

3. Вы определяете переменную $href = "catalog.php?id_catalog=$_GET[id_catalog]"; , которую дальше в том куске, который привели, нигде не используете.

4. Код ваш плохо написан, много ошибок. В том числе ошибки в плане безопасности скрипта. Я бы такой код в Интернет-магазине, где выполняются денежные операции,использовать не стала.

  Ответить  
 
 автор: sevidi   (03.09.2010 в 11:26)   письмо автору
 
   для: Лена   (03.09.2010 в 10:47)
 

Привожу код файла в целом:

<?php
  
// Выставляем уровень обработки ошибок 
   
error_reporting(E_ALL & ~E_NOTICE);
 
// Инициируем сессию
  
session_start();
  
// Устанавливаем соединение с базой данных
  
require_once("../config/config.php");
  
// Подключаем SoftTime FrameWork
  
require_once("../config/class.config.servise.php");
  
// Заголовок
  
require_once("../utils.title.php");
  
//Подключаем библиотеку функций
  
require_once ('book_sc_fns1.php');
  try
  { 
  
//Подключаем верхний шаблон
      
$pagename $name['pagename'];
      
$pagename "Категория";
      
$description $catalog['description'];
      
$description "";
      
$keywords $catalog['keywords'];
      
$keywords "";     
      require_once (
"utils/topmenu.php");       
      echo 
"<div id =\"blok\">";
      echo 
title($pagename);
      echo 
"<div class=\"text_blok\">";
      echo 
"<div class = \"cat_g\">";
      
do_html_header($name);
  
// Извлечь из базы данных информацию о книге
    
if($_GET['id_catalog'] != 0
    {
      
// Подключаем список товарных позиций
    
  // Выводим таблицу с товарными позициями
  // Формируем ассоциативный массив, где в качестве ключей выступают,
  // параметры, передаваемые в строке запроса, а в качестве значений,
  // имена полей в таблице product
  
$order = array();
  
$order['author']       = "author";
  
$order['title']        = "title";
  
$order['catid']        = "catid";
  
$order['price']        = "price";
  
$order['currency']     = "currency";
  
$order['description']  = "description";
  
   
  
// Формируем временную переменную $strtmp, которая далее
  // используется для сортировки результатов SQL-запроса при извлечении
  // товарных позиций из таблицы product
  // По умолчанию сортируем товарные позиции по полю pos
  
$strtmp "pos";
  
// Если через параметр строки запроса задана прямая или обратная
  // сортировка по одному из полей таблицы order изменяем значение
  // временной переменной $strtmp
  
foreach($order as $parametr => $field)
  {
    if(isset(
$_GET[$parametr]))
    {
      if(
$_GET[$parametr] == "up")
      {
        
$_GET[$parametr] = "down";
        
$strtmp $field;
      } 
      else 
      {
        
$_GET[$parametr] = "up";
        
$strtmp "$field DESC";
      }
    }
    else 
$_GET[$parametr] = "up";
  }
  
// Выбираем из таблицы product
  
$query "SELECT * FROM $tbl_cat_position 
            WHERE id_catalog=
$_GET[id_catalog] 
            ORDER BY 
$strtmp";
  
$pos mysql_query($query);
  if(!
$pos)
  {
    throw new 
ExceptionMySQL(mysql_error(), 
                             
$query,
                            
"Ошибка при извлечении 
                             параметров текущего раздела"
);
  }
  
// количество рядов в наборе должно быть больше нуля
  
if (mysql_num_rows($pos)>0)
  {
     
// формируем ссылку с помощью которой можно сортировать товарные
     // позиции по выводимым полям таблицы
     
$href "catalog.php?id_catalog=$_GET[id_catalog]";
     echo 
"<table width=96% 
                  border=0 
                  cellspacing=1 
                  cellpadding=1>
            <tr class=stable_tr_ttl_clr>
             <td align=center class=stable_txt>
                <b><span class=main_txt>Категория</span></b>
             </td>
             <td align=center class=stable_txt>
                <b><span class=main_txt>Наименование</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Автор</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Цена</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Валюта</span></b>
             </td>
             <td align=center class=stable_txt>
               <b><span class=main_txt>Описание</span></b> 
             </td>                     
          </tr>"
;
    
$i 0;
    while(
$position mysql_fetch_array($pos))
    {
      
//Определяем категорию
      
switch ($position['catid'])
      {
          case 
'site':
          
$distr "Разработка веб-сайтов";
          break;
          case 
'diz':
          
$distr "Веб-дизайн и графика";
          break;
          default:
$distr="&nbsp";
      }
      if(
$i++ % 2$class "stable_tr_clr2";
      else 
$class "stable_tr_clr1";
      
// Выводим строку таблицы
      
echo "<tr class=\"$class\">
            <td align=left class=stable_txt style='padding-left:20px'>
              
$distr
            </td>
            <td class=stable_txt>
              
$position[title]
            </td>
            <td class=stable_txt>
              
$position[author]
            </td>
            <td class=stable_txt>
              
$position[price]
            </td>
            <td align=center class=stable_txt>
              
$position[currency]
            </td>
            <td align=center class=stable_txt>
              
$position[description]
            </td>           
           </tr>"
;    }
    echo 
"</table><br>";
  }
 }
    echo 
"<hr>";
 
  
display_button('index.php''continue-shopping''Продолжить покупки');
  
    echo 
"</div></div></div>"
       
   
//Подключаем нижний шаблон
   
require_once ("../templates/bottom.php");
    }
    catch(
ExceptionMySQL $exc)
  {
    require_once(
"../exception_object_debug.php");
  }
  catch(
ExceptionMySQL $exc)
  {
    require_once(
"../exception_mysql_debug.php"); 
  }
  catch(
ExceptionMember $exc)
  {
    require_once(
"../exception_member_debug.php"); 
  }
?>


При выводе файла, ошибка не выдается, но и таблица БД не выводится.

  Ответить  
 
 автор: Лена   (03.09.2010 в 13:34)   письмо автору
 
   для: sevidi   (03.09.2010 в 11:26)
 

Пункт 2 из моего поста вы сделали? Что получили? Или вы не поняли вообще, что я вас просила сделать?
И после:
while($position = mysql_fetch_array($pos))
{
пропишите var_dump($position);

В броузере что-то появилось?

  Ответить  
 
 автор: sevidi   (03.09.2010 в 15:09)   письмо автору
 
   для: Лена   (03.09.2010 в 13:34)
 

Браузер вывел NULL

  Ответить  
 
 автор: Лена   (03.09.2010 в 22:20)   письмо автору
 
   для: sevidi   (03.09.2010 в 15:09)
 

Значит запрос не работает.
Может, у вас вообще подключение к базе данных не происходит... Трудно сказать, когда подключается много файлов...
Я бы для начала вывела все до одной ошибки, даже нотайсы, в начале скрипта:
error_reporting(E_ALL); - и посмотрела, что будет.
А после бы проверила, все ли файлы подключились.

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

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