Сравнение товаров

Don Arana

Новичок
Сравнение товаров

Привет всем!

Не могу найти оптимальный вариант вывода сравнения товаров.

У меня пока так:
на странице со списком товаров напротив каждого стоит checkbox, есть кнопочка - "сравнить выбранные товары" и методом POST другому скрипту (другой странице) присылаются коды выбранных товаров.

А на странице обработчике (которая и выводит сравнение характеристик) происходит обработка POST данных, запросы к базе и вывод таблицы характеристик.

Выглядит таблица так:

Характеристика | Товар 1 | Товар 2 | Товар 3 |
---------------------+------------+----------+-----------+
Цена ................. | .... | .... | .... |
---------------------+------------+----------+-----------+
Вес ................... | .... | .... | .... |
---------------------+------------+----------+-----------+

и т.п.

Как выглядит код:

Страница с чекбоксами:

напротив каждого товара -

<input type="hidden" value="<?=$artik?>"><input type="checkbox" name="selected[]" value="<?=$artik?>">

<input type="submit" name="compare" value="сравнить выбранные товары">


Страница - обработчик:
PHP:
if(isset($_POST['compare'])) {
	$items_total = count($_POST['selected']);
	$articul = $_POST['selected'];
}
?>
<table width="100%">
<tr>
<td><b>Характеристика</b></td>
PHP:
<?
for($i = 0; $i < $items_total; $i++) {
	echo "<td>Товар №.$k++."</td>";


$query = ... SELECT ... FROM ... WHERE ... AND articul = '$articul[$i]

$sql = mysql_fetch_array($query);

$art[] = $sql['articul'];
$weight[] = $sql[weight'];
$price[] = $sql['price'];
?>
</tr>
PHP:
## И вот тут пошли опять эти циклы :(
<tr>
<td><b>Цена</b></td>
PHP:
<? for($i = 0; $i < $items_total; $i++) { ?>
<td>
PHP:
<?=$price[$i]?>
</td>
PHP:
<? } ?>
</tr>
<tr>
<td><b>Вес</b></td>
PHP:
<? for($i = 0; $i < $items_total; $i++) { ?>
<td>
PHP:
<?=$weight[$i]?>
</td>
PHP:
<? } ?>
</tr>


А если характеристик около 20 - 30ти?
Скрипт очень сильно замедляется как мне показалось....

Подскажите, я наверное совсем глупо сделал и есть более элегантное решение?
 

zahhar

двинутый новичок
Как я понимаю, достаточно двух циклов, если все характеристики статичны и заранее известны.

1) Проверяем входные данные на валидность (а то мало ли что там в $_POST пришло) и каждый правильный артикул (тут определите критерии правильности) через запятую помещаем в конец строки $valid_articuls видом "art1,art2,art3". (1-ый цикл)

2) Выполняем запрос SELECT [все характеристики] FROM ... WHERE ... AND articul IN ($valid_articuls). Получаем всю информацию о выбранных пользователем продуктах.

3) Проходимся циклом по результирующему набору, полученному в предыдущем шаге и выводим информацию.

Если характеристики товара заранее неизвестны, то могут добавиться циклы для формирования списка полей с характеистиками в SELECTe и для вывода характеристик в заголовок таблицы.
 

Don Arana

Новичок
спасибо, сейчас попробую!

-~{}~ 20.07.04 16:21:

zahhar
тут как раз дело в выводе информации... для формирования именно такой таблицы не могу избавить от циклов

<td><b>Вес</b></td>
<? for($i = 0; $i < $items_total; $i++) { ?>

и т.п.

:(

-~{}~ 20.07.04 16:27:

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

WHERE ... AND articul IN (Array)

mySQL error: Unknown column 'Array' in 'where clause'
 

zahhar

двинутый новичок
Тогда вложенный цикл. Список характеристик ты можешь получить в массив и упорядочить нужным тебе образом, то же самое со списком товаров. И далее:

[цикл по характеристикам - i]
выводишь название характеристики
[цикл по товарам - j]
выводишь значение хар-ки i для товара j
[/конец]
[/конец]

Если у товара 30 характеристик и пользователь выбрал для сравнения 10 товаров, то в скрипте будет:
* на проверку валидности пепеданных артикулов - 10 итераций;
* на вывод заголовка таблицы - 10 итераций;
* на вывод содержимого 300 итераций;
+ sql-запрос и прочая шелуха = должно летать.

-~{}~ 20.07.04 15:39:

Don Arana
А зачем ты массив подставляешь? Сложи все артикулы через запятую в одну строку и подставь её.
 

Don Arana

Новичок
ок, спасибо огромное, вроде разобрался...!

только один какой то левый глюк всплывает, вроде из за настроек php.ini?

у меня на локальном <br> преобразует в перенос строки (если этот тег встречается в характеристике), а на веб сервере - так и пишет - <br>... мндаа....
 

zahhar

двинутый новичок
php.ini тут не при чём.
Если ты обрабатываешь входные данные при помощи ф-ций htmlspecialchars(), htmlentities(), то уловые скобки (которые <>) преобразуются в их html-эквиваленты (&lt; &gt), которые при выводе в браузере снова отобразятся угловыми скобками и ты увидешь <br> вместо перевода строки.

Лучше использовать не html-разметку при описании товара, а nl2br при выводе. Или если таки хочешь разрешить использование HTML, то придется использовать strip_tags() всего, кроме <BR> и других разрешенных тегов.
 

Don Arana

Новичок
zahhar
спасибо!

-~{}~ 20.07.04 18:39:

просто дело в том, что при записи в БД я не обрабатываю таким образом данные. а при выводе угловые скобочки выводятся как будто я их обработал. бред? согласен...

плюс при описании все же приходится иногда использовать некторые html-теги, и плюс - я не вижу ничего плохого в использовании <br>, это вроде даже лучше.

-~{}~ 20.07.04 18:40:

ай вру, простите меня грешного :)
конечно же да.. так и знал,.. тьфу :)
 

zahhar

двинутый новичок
Расскажи хоть, в чём конкретно твой косяк был?

Если редактирование находится в админке и админить будет чел, который знает HTML, то можно и оставить поддержку тегов. Только по-любому, не всех подряд, а, на всякий случай, только тех, которые реально могут использоваться и которые не представляют большой опасности и служат только для оформления (table, tr, td, br, hr, a, b, i, u и т.д.)
 

Don Arana

Новичок
zahhar ну при заливке в БД данные действительно прогонялись через htmlspecialchars :)


которые не представляют большой опасности и служат только для оформления (table, tr, td, br, hr, a, b, i, u и т.д.)
хорошо, а какие представляют особую опасность???
 

zahhar

двинутый новичок
Надеюсь, ты не отказался от htmlspecialchars() вообще в угоду <br>?

А насчет тегов смотри соответствующие русурсы. Навскидку - всякие там <script>, <object>, <embed>, <form>, <input> и др.
 
Сверху