|
|
|
| Надо сделать опережающую проверку.
Узнаем, если в позиции перед каким-то словом стоит WHERE, то $condition = "";
У меня условие запроса строится из кусочков. Вот я и хочу, чтобы перед первым куском не выводилось OR.
Делаю так:
if(preg_match("/(?=WHERE\s+)\w/u",$sql))
$condition = "";
else
$condition = " OR ";
|
У меня $condition пустой приходит. Везде. | |
|
|
|
|
|
|
|
для: Лена
(23.06.2010 в 00:28)
| | А где < | |
|
|
|
|
|
|
|
для: Лена
(23.06.2010 в 00:28)
| | У вас записана опережающая. А для проверки позиции "перед" нужна ретроспективная.
А вообще, судя по коду, там происходит что то страшное. Может просто собирать условия в массив, а потом объединять через implode(' OR ', $conditions)? | |
|
|
|
|
|
|
|
для: Лена
(23.06.2010 в 00:28)
| | если нет счетчика цикла - применяйте флажок.
а регекспы тут совсем уж как микроскоп. | |
|
|
|
|
|
|
|
для: Trianon
(23.06.2010 в 10:18)
| | Мне без этих регэкспов тут никак.
Обнаружили баг в коде. Чтобы понять, в чем дело, надо сюда посмотреть - http://zubadan.inexbuild.com/prop.php
Проблема в том, что при выборе двух подкатегорий из одной категории(напр. LESSAR и LG из "Производитель"), выбирает неправильно. Все кусочки условия запроса собираются с помощью AND, но если надо выбрать две подкатегории - надо ставить условие OR.
Вот кусок кода, который относится к сути дела.
<?php
if($_GET['id']){
//пришел $_GET['id'] такого вида: 23-45-19-20(23,45 и т.д.- подкатегории)
if(strpos($_GET['id'],"-")){
$sql = "SELECT p.* FROM product p WHERE ";
$arr = explode('-',$_GET['id']);
//если мы хотим выбрать две подкатегории из одной категории
//напр. LESSAR и LG из "Производитель", тогда условие AND меняется на OR
$choosed = array();
//выбираем родителя для категории
foreach($arr as $k=>$v){
$q2 = "SELECT property_pid
FROM product_properties
WHERE property_id=" . $v;
$res2 = mysql_query($q2);
if(!$res2)exit("Error in " . mysql_error());
$n_prod = mysql_result($res2,0);
$choosed[]= $n_prod;
}
//убираем дубликаты pid
//при выборке меняем условие на OR
$unique = array_unique($choosed);
if(count($unique)< count($choosed)){
if(preg_match("/(?<=WHERE\s+)\w/u",$sql))
$condition = "";
else
$condition = " OR ";
}else{
if(preg_match("/(?<=WHERE\s+)\w/u",$sql))
$condition = "";
else
$condition = " AND ";
}
//идет условие запроса
$block_type = array(8=>'настенный',9=>'канальный',10=>'напольно-потолочный',11=>'кассетный',12=>'колонный');
foreach($block_type as $btKey=>$btVal){
if(in_array($btKey,$arr)){
$sql .= $condition . "p.block_type LIKE '" . $btVal . "' ";
$sql1 .= $condition . "p.block_type LIKE '" . $btVal . "' ";
}
}
|
В массив, как предложил sms-send, я собрать не могу. Потому как у меня тогда везде будет или AND, или OR. | |
|
|
|
|
|
|
|
для: Лена
(23.06.2010 в 11:09)
| | Какой-то ужас-ужас.
запросы в цикле....
вложенные циклы формирования кусков SQL-кода...
регекспы, проверяющие переменные, самим программистом же и задаваемые тремя строками выше...
Если никак, то... | |
|
|
|
|
|
|
|
для: Trianon
(23.06.2010 в 17:25)
| | Спасибо. Перепишу. С нуля. | |
|
|
|
|
|
|
|
для: Лена
(23.06.2010 в 17:45)
| | почему логика фильтров зависит от принадлежности категориям?
Где ортогональность? | |
|
|
|
|
|
|
|
для: Trianon
(23.06.2010 в 18:12)
| | Есть три таблицы - товары, их свойства(фильтры) и таблица связка(id_product,id_property).
Я вытягиваю на страницу из таблицы фильтров их названия.
При нажатии на название фильтра идет запрос к базе - вытянуть из таблицы продуктов те продукты, которые соответствуют условию(фильтру).
При нажатии на второе название фильтра - из тех товаров, которые мы уже выбрали после нажатия на первый фильтр, нужно выбрать те, которые соответствуют условию.
Но. Если первый и второй фильтр принадлежат одной группе, надо выборку делать так: первое условие И второе условие.
Что следует понимать под понятием ортогональности? | |
|
|
|
|
|
|
|
для: Лена
(23.06.2010 в 22:12)
| | >Но. Если первый и второй фильтр принадлежат одной группе, надо выборку делать так: первое условие И второе условие.
Почему?
>Что следует понимать под понятием ортогональности?
Отсутствие искусственно навязанных взаимосвязей.
Напимер - "если одной группе, то И иначе ИЛИ"
Почему нельзя явно указать, как строить логику, по И или по ИЛИ?
Вообще же впечатление такое что по ИЛИ добавляются элементы в набор одного фильтра.
Почему нельзя реализовать это именно так? Элементы - элементами. Фильтры - фильтрами.
Элементы соединяются по ИЛИ, фильтры - по И.
Опять же, почему нужно выбирать данные по набору, вытянутому предыдущим запросом?
А если в нем изрядно строк? | |
|
|
|
|
|
|
|
для: Trianon
(23.06.2010 в 22:21)
| | Сделала. Пришлось много переписать. Спасибо за наводку.
Все запросы идут типа таких:
SELECT * FROM product WHERE mnf=25 AND (b_t=23 OR b_t=2) ORDER BY price
SELECT * FROM product WHERE (mnf=25 OR mnf=56) AND (b_t=23 OR b_t=2) ORDER BY price
|
mnf=25 OR mnf=56 - фильтры одного набора, в запросе объединяются через OR
mnf и b_t - фильтры разного набора, в запросе объединяются через AND | |
|
|
|