|
|
|
| Проектирую интернет-магазин. Создана таблица с каталогом продукции.
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=" ";
}
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.
Почему это происходит? Почему в первом файле код работает, а во втором нет? | |
|
|
|
|
|
|
|
для: 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. Код ваш плохо написан, много ошибок. В том числе ошибки в плане безопасности скрипта. Я бы такой код в Интернет-магазине, где выполняются денежные операции,использовать не стала. | |
|
|
|
|
|
|
|
для: Лена
(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=" ";
}
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");
}
?>
|
При выводе файла, ошибка не выдается, но и таблица БД не выводится. | |
|
|
|
|
|
|
|
для: sevidi
(03.09.2010 в 11:26)
| | Пункт 2 из моего поста вы сделали? Что получили? Или вы не поняли вообще, что я вас просила сделать?
И после:
while($position = mysql_fetch_array($pos))
{
пропишите var_dump($position);
В броузере что-то появилось? | |
|
|
|
|
|
|
|
для: Лена
(03.09.2010 в 13:34)
| | Браузер вывел NULL | |
|
|
|
|
|
|
|
для: sevidi
(03.09.2010 в 15:09)
| | Значит запрос не работает.
Может, у вас вообще подключение к базе данных не происходит... Трудно сказать, когда подключается много файлов...
Я бы для начала вывела все до одной ошибки, даже нотайсы, в начале скрипта:
error_reporting(E_ALL); - и посмотрела, что будет.
А после бы проверила, все ли файлы подключились. | |
|
|
|
|