ФорумПрограммированиеPHP для идиотов → Как реализовать "похожие товары"?

Как реализовать "похожие товары"?

  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 27 мая 2012 г. 0:09

    На странице конкретного товара мне нужно сделать блок "похожие товары". В админке можно выбрать способ:

    1) отображаются 5 штук из категории близкие по цене +-10%
    2) выбираются вручную

    У меня вопросы по этим пунктам:

    1) что если в нужном диапазоне цен не набралось 5 штук? делать следующий запрос и расширять диапазон? или мб искать уже не в конкретной категории а по всем товарам?

    2) что если какой-то из уже выбранных товаров удалён? внешние ключи юзать не получится, т.к. таблицы MyIsam нужны для полнотекстового поиска
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 27 мая 2012 г. 1:15, спустя 1 час 5 минут 58 секунд

    Написал функцию для первого пункта, посмотрите, не полное ли это говно? Может подскажите как лучше сделать?

    	private function getRelatedByPrice($iId, $iRange = 0.1)
    {
    $sQuery = "SELECT `price`,`category_id` FROM " . $this->sTable . " WHERE id = " . $iId;

    try
    {
    $aProduct = $this->oDb->fetchRow($sQuery);
    }
    catch (Exception $e)
    {
    echo $e->getMessage();
    }

    while($iRange < 0.5)
    {
    $iDif = $aProduct['price'] * $iRange;
    $iMin = $aProduct['price'] - $iDif;
    $iMax = $aProduct['price'] + $iDif;

    if(!$bWithoutCategory)
    {
    $sQuery = "SELECT * FROM " . $this->sTable . " WHERE `price` > " . $iMin . " AND `price` < " . $iMax . " AND `category_id` = " . $aProduct['category_id'] . " LIMIT 5";
    }
    else
    {
    $sQuery = "SELECT * FROM " . $this->sTable . " WHERE `price` > " . $iMin . " AND `price` < " . $iMax . " LIMIT 5";
    }

    try
    {
    $aData = $this->oDb->fetchAll($sQuery);
    }
    catch (Exception $e)
    {
    echo $e->getMessage();
    }

    if(count($aData) == 5)
    {
    return $aData;
    }
    else
    {
    if($iRange != 0.4)
    {
    $iRange += 0.1;
    }
    else
    {
    $bWithoutCategory = true;
    $iRange = 0.1;
    }
    }
    }
    }
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 27 мая 2012 г. 1:59, спустя 44 минуты 16 секунд

    в маже не заморачивались. Админ сам забивает похожие товары руцями к каждому товару
    Спустя 11 сек.
    такой вариант тебе не подойдет?
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 27 мая 2012 г. 2:07, спустя 7 минут 27 секунд

    Абырвалг, у меня стоит задача реализовать возможность выбирать вручную и как альтернатива (если вручную не выбрано) - выводить близкие по цене..вот
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 27 мая 2012 г. 2:39, спустя 32 минуты 23 секунды

    Дак если задача показывать только похожие товары, показывай только их, почему именно пять товаров то. Представь ситуацию: в магазине сплошной ширпотреб за 10-50 баксов и пара товаров в единственном экземпляре за $1000, в итоге у тебя в списке похожих товаров для дорогого товара будет показываться 1000-50-49-49-48 к примеру, но он же нифига не похожий.
    С отсутствующим/удалённым товаром проблема не понятна: SELECT … WHERE … AND is_removed=FALSE
    Work, buy, consume, die
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 27 мая 2012 г. 3:03, спустя 24 минуты 23 секунды

    Nyaah, спасибо, всё правильно

    С отсутствующим/удалённым товаром проблема не понятна: SELECT … WHERE … AND is_removed=FALSE


    я имел ввиду полное удаление товара из бд…получается он просто не будет отображаться..
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 27 мая 2012 г. 4:45, спустя 1 час 41 минуту 46 секунд

    Дык, если его из бд удалили, то как ты его покажешь? =)
    А вообще, я так понимаю, у тебя нарушение целостности данных на лицо. Такого не должно быть в принципе, если невозможно контролировать целостность данных на уровне базы (отсутствие внешних ключей), то необходимо контролировать тогда её из приложения, к примеру запрещать удаление товара, если есть запись о нём в таблице продаж, либо просто завести флаг удаления, и показывать пользователю только те товары, у которых этот флаг равен false.
    Work, buy, consume, die
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 27 мая 2012 г. 8:12, спустя 3 часа 26 минут 42 секунды

    Nyaah, спасибо за помощь, это как раз то, что мне нужно!

Пожалуйста, авторизуйтесь, чтобы написать комментарий!