[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ошибка в запросе\коде?
aveBen
Ситуация следующая, есть 2 файла из паттерна MVC.

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']);
$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.

Спасибо за ответ! Буду думать дальше...

Спустя 3 часа, 15 минут, 24 секунды (22.01.2012 - 21:05) aveBen написал(а):
Цитата (asokol @ 22.01.2012 - 08:55)
$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.

Если не сложно, подскажите как в данной ситуации исправить код? Или просто подскажите что исправить нужно, я совсем запутался что-то...

Спустя 10 минут, 4 секунды (22.01.2012 - 21:15) asokol написал(а):
Если Вы хотите исправить код, то попробуйте сымитировать ситуацию по шагам. Что за чем идет, какие данные на входе, какие на выходе. Что происходит дальше. И все сами поймете.

Спустя 2 часа, 2 минуты, 16 секунд (22.01.2012 - 23:17) aveBen написал(а):
Цитата (asokol @ 22.01.2012 - 18:15)
Если Вы хотите исправить код, то попробуйте сымитировать ситуацию по шагам. Что за чем идет, какие данные на входе, какие на выходе. Что происходит дальше. И все сами поймете.

Не выходит, переписал код по новому, все равно выводит значки России по всем клубам русским, так же и с другими странами... Уже голову сломал sad.gif

Помогите пожалуйста, за старания отплачу монетой и сам буду знать в чем мои ошибки заключаются!

Спустя 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"), а ведь когда передан параметр, очевидно, необходимо выбирать только одну соответствующую запись, то есть:
$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 написал(а):
Есть какие нибудь идеи?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.