collection_controller.php
$collect = new collection_model('collection');
if($GET['mod'] === 'cat')
{
$collect -> createCategory($GET['parent']);
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$back_link = '<a href="'. href('mod=all') .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/rows', 'country', true);
}
elseif($GET['mod'] === 'country')
{
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$collect -> createCountryCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$back_link = '<a href="'. href('mod=cat', 'parent='. $GET['parent']) .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/rows', 'badge', true);
}
else
{
$collect -> createCategory();
$cat_name = $back_link = '';
$collection = $collect -> createRows('collection/rows', 'cat');
}
include IRB_ROOT .'/skins/tpl/collection/show.tpl';
collection_model.php
class collection_model
{
public $table, $cat_name;
private $res;
/**
* Конструктор
* @param string $table
*/
public function __construct($table)
{
$this->table = $table;
}
/**
* Метод генерации списка категорий
* @param int $id
* @return void
*/
public function createCategory($id = '')
{
$res = mysqlQuery("SELECT *
FROM `". IRB_DBPREFIX . $this->table ."_cat`
ORDER BY `id` ASC "
);
if(empty($id))
$this->res = $res;
else
$this->cat_name = mysql_result($res, 0, 'name');
}
/**
* Метод генерации списка товаров выбранной категории
* @param int $id
* @param int $num_words
* @return void
*/
public function createListCollect($id)
{
$this->res = mysqlQuery("SELECT `id`, `name`, `photo`, `description`, `id_parent`
FROM `". IRB_DBPREFIX . $this->table ."`
WHERE `id_parent` = ".(int)$id . "
ORDER BY `sort` ASC "
);
}
/**
* Метод генерации видов выбранного товара
* @param int $id
* @return void
*/
public function createCountryCollect($id, $id_parent)
{
$this->res = mysqlQuery("SELECT `id`, `name`, `image`, `description`, `id_parent`
FROM `". IRB_DBPREFIX . $this->table ."_country`
WHERE `id_parent` = ".(int)$id_parent . "
ORDER BY `sort` ASC
");
}
/**
* Метод представления.
* @param string $template
* @param string $mod
* @param string $flag
* @return string
*/
public function createRows($template, $mod, $flag = false)
{
$rows = '';
$tpl = getTpl($template);
while($row = mysql_fetch_assoc($this->res))
{
$row['name'] = htmlspecialchars($row['name']);
$row['description'] = nl2br(htmlspecialchars($row['description']));
$row['src'] = !empty($row['photo']) ? IRB_HOST . 'upload/' . $row['photo'] : '';
if(!$flag)
$row['url'] = href('mod='. $mod, 'parent='. $row['id']);
else
$row['url'] = href('mod='. $mod, 'id='. $row['id']);
$rows .= parseTpl($tpl, $row);
}
return $rows;
}
}
Ситуация следующая, первым запросом выводится категории по странам. Далее, второй запрос вытаскивает из базы "Футбольные Клубы" и сортирует их по странам, т.е. в России будут русские клубы, в Англии - Английские. Дальше мне нужно было, что бы когда посетитель нажимает на страну Россия, клуб допустим Торпедо Москва, ему выводились все Значки этого футбольного клуба и так с каждым клубом.
В 3-ем запросе, идет вывод значков из БД по клубам, но у меня например в Россию, выводятся ВСЕ значки в каждый клуб. Т.е. в Торпедо Москва значки Локомотива, Спартак, цска и т.д. Такая же ситуация с другими странам, значки русских клубов не попадают в Английский каталог, тольков в Русский.
В чем моя ошибка?
Вот структура трех таблиц в БД (
footballbadges_collection (тут клубы разные)
footballbadges_collection_cat (тут страны)
footballbadges_collection_country (тут значки клубов)
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Database: `myfbsite`
--
-- --------------------------------------------------------
--
-- Table structure for table `footballbadges_collection`
--
CREATE TABLE IF NOT EXISTS `footballbadges_collection` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`id_parent` int(5) NOT NULL,
`club_checker` int(5) NOT NULL,
`name` varchar(250) NOT NULL,
`description` text NOT NULL,
`photo` varchar(250) NOT NULL,
`sort` int(5) NOT NULL,
PRIMARY KEY (`id`),
KEY `id_parent` (`id_parent`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
--
-- Dumping data for table `footballbadges_collection`
--
INSERT INTO `footballbadges_collection` (`id`, `id_parent`, `club_checker`, `name`, `description`, `photo`, `sort`) VALUES
(1, 1, 1, 'ФК Спартак Москва', 'Значки футбольного клуба Спартак Москва.', 'clubs/russia/FC_Spartak_Moscow_Emblem.jpg', 1),
(2, 1, 2, 'ФК Локомотив Москва', 'Значки футбольного клуба Спартак Москва.', 'clubs/russia/FC_Lokomotiv_Moscow_Emblem.png', 2),
(9, 2, 3, 'ФК Ноттингем Форест', 'Значки футбольного клуба Ноттингем Форест.', 'clubs/russia/FC_Spartak_Moscow_Emblem.jpg', 0);
-- --------------------------------------------------------
--
-- Table structure for table `footballbadges_collection_cat`
--
CREATE TABLE IF NOT EXISTS `footballbadges_collection_cat` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`name` varchar(250) NOT NULL,
`description` text NOT NULL,
`photo` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
--
-- Dumping data for table `footballbadges_collection_cat`
--
INSERT INTO `footballbadges_collection_cat` (`id`, `name`, `description`, `photo`) VALUES
(1, 'Россия', 'Значки российских футбольных клубов.', 'category/Flag_of_Russia.png'),
(8, 'Польша', 'Значки украинских футбольных клубов', 'category/Flag_of_Poland.png'),
(2, 'Англия', 'Значки английских футбольных клубов', 'category/Flag_of_England.png'),
(7, 'Украина', 'Значки украинских футбольных клубов', 'category/Flag_of_Ukraine.png'),
(6, 'Испания', 'Значки испанских футбольных клубов.', 'category/Flag_of_Spain.png'),
(5, 'Италия', 'Значки итальянских футбольных клубов.', 'category/Flag_of_Italy.png'),
(9, 'Бразилия', 'Значки украинских футбольных клубов', 'category/Flag_of_Brazil.png');
-- --------------------------------------------------------
--
-- Table structure for table `footballbadges_collection_country`
--
CREATE TABLE IF NOT EXISTS `footballbadges_collection_country` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`id_parent` int(5) NOT NULL,
`name` varchar(250) NOT NULL,
`description` text NOT NULL,
`image` varchar(50) NOT NULL,
`sort` int(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
--
-- Dumping data for table `footballbadges_collection_country`
--
INSERT INTO `footballbadges_collection_country` (`id`, `id_parent`, `name`, `description`, `image`, `sort`) VALUES
(1, 1, 'Первый знак ФК Спартак Москва', 'Первый знак ФК Спартак Москва\r\nПервый знак ФК Спартак Москва', 'clubs/russia/FC_Spartak_Moscow_Emblem.jpg', 1),
(2, 1, 'Второй знак ФК Спартак Москва', 'Второй знак ФК Спартак Москва\r\nВторой знак ФК Спартак Москва\r\n', 'clubs/russia/FC_Spartak_Moscow_Emblem.jpg', 2);
Если есть желание помочь и знаете в чем ошибка, буду очень рад! За помощь - отблагодарю монеткой, ибо у меня нету пока что нету объяснений почему код так работает :(
Спустя 9 часов, 11 минут, 28 секунд (22.01.2012 - 11:55) asokol написал(а):
$collect -> createCategory($GET['parent']);
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
В createCategory в запросе не используется передаваемый параметр $GET['parent'], поэтому ветка else будет всегда получать name первой записи.
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$collect -> createCountryCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
- здесь Вы в первом методе результат выполнения mysqlQuery сохраняете в res, а потом перезаписываете res во втором методе. Поэтому в методе createRows обрабатывается результат только одного запроса.
Если все значки выводятся в России, значит у них один и тот же id_parent.
Спустя 5 часов, 54 минуты, 55 секунд (22.01.2012 - 17:50) aveBen написал(а):
Цитата (asokol @ 22.01.2012 - 08:55) |
$collect -> createCategory($GET['parent']); В createCategory в запросе не используется передаваемый параметр $GET['parent'], поэтому ветка else будет всегда получать name первой записи. $collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS); - здесь Вы в первом методе результат выполнения mysqlQuery сохраняете в res, а потом перезаписываете res во втором методе. Поэтому в методе createRows обрабатывается результат только одного запроса. Если все значки выводятся в России, значит у них один и тот же id_parent. |
Спасибо за ответ! Буду думать дальше...
Спустя 3 часа, 15 минут, 24 секунды (22.01.2012 - 21:05) aveBen написал(а):
Цитата (asokol @ 22.01.2012 - 08:55) |
$collect -> createCategory($GET['parent']); В createCategory в запросе не используется передаваемый параметр $GET['parent'], поэтому ветка else будет всегда получать name первой записи. $collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS); - здесь Вы в первом методе результат выполнения mysqlQuery сохраняете в res, а потом перезаписываете res во втором методе. Поэтому в методе createRows обрабатывается результат только одного запроса. Если все значки выводятся в России, значит у них один и тот же id_parent. |
Если не сложно, подскажите как в данной ситуации исправить код? Или просто подскажите что исправить нужно, я совсем запутался что-то...
Спустя 10 минут, 4 секунды (22.01.2012 - 21:15) asokol написал(а):
Если Вы хотите исправить код, то попробуйте сымитировать ситуацию по шагам. Что за чем идет, какие данные на входе, какие на выходе. Что происходит дальше. И все сами поймете.
Спустя 2 часа, 2 минуты, 16 секунд (22.01.2012 - 23:17) aveBen написал(а):
Цитата (asokol @ 22.01.2012 - 18:15) |
Если Вы хотите исправить код, то попробуйте сымитировать ситуацию по шагам. Что за чем идет, какие данные на входе, какие на выходе. Что происходит дальше. И все сами поймете. |
Не выходит, переписал код по новому, все равно выводит значки России по всем клубам русским, так же и с другими странами... Уже голову сломал

Помогите пожалуйста, за старания отплачу монетой и сам буду знать в чем мои ошибки заключаются!
Спустя 58 секунд (22.01.2012 - 23:18) asokol написал(а):
Как сейчас выглядит код?
Спустя 5 минут, 56 секунд (22.01.2012 - 23:24) aveBen написал(а):
Цитата (asokol @ 22.01.2012 - 20:18) |
Как сейчас выглядит код? |
контроллер.
$collect = new collection_model('collection');
if($GET['mod'] === 'collection')
{
$collect -> createCategory($GET['parent']);
$collect -> createCollect($GET['id']);
$back_link = '<a href="'. href('mod=cat', 'parent='. $GET['parent']) .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/collection', 'collection');
}
elseif($GET['mod'] === 'cat')
{
$collect -> createCategory($GET['parent']);
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$back_link = '<a href="'. href('mod=all') .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/rows', 'country', true);
}
elseif($GET['mod'] === 'country')
{
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$collect -> createCountryCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$back_link = '<a href="'. href('mod=cat', 'parent='. $GET['parent']) .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/rows', 'badge', true);
}
else
{
$collect -> createCategory();
$cat_name = $back_link = '';
$collection = $collect -> createRows('collection/rows', 'cat');
}
include IRB_ROOT .'/skins/tpl/collection/show.tpl';
Запрос не трогал, там же вроде должно быть все верно.
Спустя 15 минут, 23 секунды (22.01.2012 - 23:40) asokol написал(а):
То, о чем я говорил раньше.
Если $GET['mod'] === 'cat', то вызывается $collect->createCategory($GET['parent']), где в запросе выбираются все записи: $res = mysqlQuery("SELECT * FROM `". IRB_DBPREFIX . $this->table ."_cat` ORDER BY `id` ASC"), а ведь когда передан параметр, очевидно, необходимо выбирать только одну соответствующую запись, то есть:
- дальше все вроде верно.
Теперь, если $GET['mod'] === 'country'. В этом случае вызывается $collect->createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS), где $this->res становится чему-то равно. После этого вызывается $collect->createCountryCollect($GET['parent'], IRB_CONFIG_NUM_WORDS).
Здесь остановимся по-подробнее. Во-первых, здесь успешно перезаписывается $this->res, в котором было сохранено значение в предыдущем абзаце (а зачем тогда вызывать createListCollect вообще?). А во-вторых, следует обратить внимание на передаваемые параметры: $id, $id_parent. Что будет в $id? Верно - $GET['parent']. А в $id_parent? А тут будет IRB_CONFIG_NUM_WORDS. А в запросе ниже почему-то используется $id_parent вместо $id:
"... WHERE `id_parent` = ".(int)$id_parent . "..."
- то есть:
"... WHERE `id_parent`=" . IRB_CONFIG_NUM_WORDS . "..."
Правильным решением будет исправить названия параметров примерно таким образом:
Если $GET['mod'] === 'cat', то вызывается $collect->createCategory($GET['parent']), где в запросе выбираются все записи: $res = mysqlQuery("SELECT * FROM `". IRB_DBPREFIX . $this->table ."_cat` ORDER BY `id` ASC"), а ведь когда передан параметр, очевидно, необходимо выбирать только одну соответствующую запись, то есть:
$res = mysqlQuery("SELECT * FROM `". IRB_DBPREFIX . $this->table ."_cat` " . (empty($id)?"ORDER BY `id` ASC":"WHERE `id`={$id}"))
- дальше все вроде верно.
Теперь, если $GET['mod'] === 'country'. В этом случае вызывается $collect->createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS), где $this->res становится чему-то равно. После этого вызывается $collect->createCountryCollect($GET['parent'], IRB_CONFIG_NUM_WORDS).
Здесь остановимся по-подробнее. Во-первых, здесь успешно перезаписывается $this->res, в котором было сохранено значение в предыдущем абзаце (а зачем тогда вызывать createListCollect вообще?). А во-вторых, следует обратить внимание на передаваемые параметры: $id, $id_parent. Что будет в $id? Верно - $GET['parent']. А в $id_parent? А тут будет IRB_CONFIG_NUM_WORDS. А в запросе ниже почему-то используется $id_parent вместо $id:
"... WHERE `id_parent` = ".(int)$id_parent . "..."
- то есть:
"... WHERE `id_parent`=" . IRB_CONFIG_NUM_WORDS . "..."
Правильным решением будет исправить названия параметров примерно таким образом:
createCountryCollect($id_parent, $num_words)
Спустя 36 минут, 55 секунд (23.01.2012 - 00:17) aveBen написал(а):
Спасибо за помощь, но в этом случае, у меня при выборе какого-либо клуба не выводятся значки вообще... Вот как щас выглядит код:
контроллер
модель
контроллер
$collect = new collection_model('collection');
if($GET['mod'] === 'collection')
{
$collect -> createCategory($GET['parent']);
$collect -> createCollect($GET['id']);
$back_link = '<a href="'. href('mod=cat', 'parent='. $GET['parent']) .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/collection', 'collection');
}
elseif($GET['mod'] === 'cat')
{
$collect -> createCategory($GET['parent']);
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$back_link = '<a href="'. href('mod=all') .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/rows', 'country', true);
}
elseif($GET['mod'] === 'country')
{
$collect -> createListCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$collect -> createCountryCollect($GET['parent'], IRB_CONFIG_NUM_WORDS);
$back_link = '<a href="'. href('mod=cat', 'parent='. $GET['parent']) .'">'. IRB_LANG_BACK .'</a>';
$cat_name = $collect -> cat_name;
$collection = $collect -> createRows('collection/rows', 'badge', true);
}
else
{
$collect -> createCategory();
$cat_name = $back_link = '';
$collection = $collect -> createRows('collection/rows', 'cat');
}
include IRB_ROOT .'/skins/tpl/collection/show.tpl';
модель
class collection_model
{
public $table, $cat_name;
private $res;
/**
* Конструктор
* @param string $table
*/
public function __construct($table)
{
$this->table = $table;
}
/**
* Метод генерации списка категорий
* @param int $id
* @return void
*/
public function createCategory($id = '')
{
$res = mysqlQuery("SELECT *
FROM `". IRB_DBPREFIX . $this->table ."_cat` " .
(empty($id)?"ORDER BY `id` ASC":"WHERE `id`={$id}")
);
if(empty($id))
$this->res = $res;
else
$this->cat_name = mysql_result($res, 0, 'name');
}
/**
* Метод генерации списка товаров выбранной категории
* @param int $id
* @param int $num_words
* @return void
*/
public function createListCollect($id)
{
$this->res = mysqlQuery("SELECT `id`, `name`, `photo`, `description`, `id_parent`
FROM `". IRB_DBPREFIX . $this->table ."`
WHERE `id_parent` = ".(int)$id . "
ORDER BY `sort` ASC "
);
}
/**
* Метод генерации видов выбранного товара
* @param int $id
* @return void
*/
public function createCountryCollect($id, $id_parent)
{
$this->res = mysqlQuery("SELECT `id`, `name`, `image`, `description`, `id_parent`
FROM `". IRB_DBPREFIX . $this->table ."_country`
WHERE `id_parent` = ".(int)$id . "
ORDER BY `sort` ASC
");
}
/**
* Метод представления.
* @param string $template
* @param string $mod
* @param string $flag
* @return string
*/
public function createRows($template, $mod, $flag = false)
{
$rows = '';
$tpl = getTpl($template);
while($row = mysql_fetch_assoc($this->res))
{
$row['name'] = htmlspecialchars($row['name']);
$row['description'] = nl2br(htmlspecialchars($row['description']));
$row['src'] = !empty($row['photo']) ? IRB_HOST . 'upload/' . $row['photo'] : '';
if(!$flag)
$row['url'] = href('mod='. $mod, 'parent='. $row['id']);
else
$row['url'] = href('mod='. $mod, 'id='. $row['id']);
$rows .= parseTpl($tpl, $row);
}
return $rows;
}
}
Спустя 7 часов, 52 минуты, 2 секунды (23.01.2012 - 08:09) asokol написал(а):
Цитата |
А в запросе ниже почему-то используется $id_parent вместо $id: "... WHERE `id_parent` = ".(int)$id_parent . "..." - то есть: "... WHERE `id_parent`=" . IRB_CONFIG_NUM_WORDS . "..." |
Я имел в виду, что после подстановки значения $id_parent, получается IRB_CONFIG_NUM_WORDS, а ведь не это требуется. Поэтому тут не надо было ничего менять.
Спустя 13 часов, 27 минут, 29 секунд (23.01.2012 - 21:36) aveBen написал(а):
Все равно не выводит значки вообще :\
Спустя 2 часа, 21 минута, 31 секунда (23.01.2012 - 23:58) aveBen написал(а):
asokol
Помогите пожалуйста настроить код. За работу заплачу денежку, этот момент последний что мне нужен в сайте, он сам по себе маленький...
Помогите пожалуйста настроить код. За работу заплачу денежку, этот момент последний что мне нужен в сайте, он сам по себе маленький...
Спустя 12 часов, 17 минут, 42 секунды (24.01.2012 - 12:15) asokol написал(а):
Отредактируйте предыдущее сообщение с кодом. Вставьте код, который сейчас.
Спустя 8 часов, 36 минут, 53 секунды (24.01.2012 - 20:52) aveBen написал(а):
Цитата (asokol @ 24.01.2012 - 09:15) |
Отредактируйте предыдущее сообщение с кодом. Вставьте код, который сейчас. |
Отредактировал!
Спасибо заранее за помощь большое!
Спустя 21 час, 42 минуты, 26 секунд (25.01.2012 - 18:35) aveBen написал(а):
Есть какие нибудь идеи?