Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Опережающая проверка
 
 автор: Лена   (23.06.2010 в 00:28)   письмо автору
 
 

Надо сделать опережающую проверку.
Узнаем, если в позиции перед каким-то словом стоит WHERE, то $condition = "";
У меня условие запроса строится из кусочков. Вот я и хочу, чтобы перед первым куском не выводилось OR.
Делаю так:

if(preg_match("/(?=WHERE\s+)\w/u",$sql))
    $condition = "";
else
         $condition = " OR ";


У меня $condition пустой приходит. Везде.

  Ответить  
 
 автор: Gubichev   (23.06.2010 в 00:34)   письмо автору
 
   для: Лена   (23.06.2010 в 00:28)
 

А где <

  Ответить  
 
 автор: sms-send   (23.06.2010 в 00:46)   письмо автору
 
   для: Лена   (23.06.2010 в 00:28)
 

У вас записана опережающая. А для проверки позиции "перед" нужна ретроспективная.

(?<=...)


А вообще, судя по коду, там происходит что то страшное. Может просто собирать условия в массив, а потом объединять через implode(' OR ', $conditions)?

  Ответить  
 
 автор: Trianon   (23.06.2010 в 10:18)   письмо автору
 
   для: Лена   (23.06.2010 в 00:28)
 

если нет счетчика цикла - применяйте флажок.
а регекспы тут совсем уж как микроскоп.

  Ответить  
 
 автор: Лена   (23.06.2010 в 11:09)   письмо автору
 
   для: 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.

  Ответить  
 
 автор: Trianon   (23.06.2010 в 17:25)   письмо автору
 
   для: Лена   (23.06.2010 в 11:09)
 

Какой-то ужас-ужас.
запросы в цикле....
вложенные циклы формирования кусков SQL-кода...
регекспы, проверяющие переменные, самим программистом же и задаваемые тремя строками выше...

Если никак, то...

  Ответить  
 
 автор: Лена   (23.06.2010 в 17:45)   письмо автору
 
   для: Trianon   (23.06.2010 в 17:25)
 

Спасибо. Перепишу. С нуля.

  Ответить  
 
 автор: Trianon   (23.06.2010 в 18:12)   письмо автору
 
   для: Лена   (23.06.2010 в 17:45)
 

почему логика фильтров зависит от принадлежности категориям?
Где ортогональность?

  Ответить  
 
 автор: Лена   (23.06.2010 в 22:12)   письмо автору
 
   для: Trianon   (23.06.2010 в 18:12)
 

Есть три таблицы - товары, их свойства(фильтры) и таблица связка(id_product,id_property).
Я вытягиваю на страницу из таблицы фильтров их названия.
При нажатии на название фильтра идет запрос к базе - вытянуть из таблицы продуктов те продукты, которые соответствуют условию(фильтру).
При нажатии на второе название фильтра - из тех товаров, которые мы уже выбрали после нажатия на первый фильтр, нужно выбрать те, которые соответствуют условию.
Но. Если первый и второй фильтр принадлежат одной группе, надо выборку делать так: первое условие И второе условие.

Что следует понимать под понятием ортогональности?

  Ответить  
 
 автор: Trianon   (23.06.2010 в 22:21)   письмо автору
 
   для: Лена   (23.06.2010 в 22:12)
 

>Но. Если первый и второй фильтр принадлежат одной группе, надо выборку делать так: первое условие И второе условие.

Почему?

>Что следует понимать под понятием ортогональности?

Отсутствие искусственно навязанных взаимосвязей.
Напимер - "если одной группе, то И иначе ИЛИ"

Почему нельзя явно указать, как строить логику, по И или по ИЛИ?

Вообще же впечатление такое что по ИЛИ добавляются элементы в набор одного фильтра.
Почему нельзя реализовать это именно так? Элементы - элементами. Фильтры - фильтрами.
Элементы соединяются по ИЛИ, фильтры - по И.

Опять же, почему нужно выбирать данные по набору, вытянутому предыдущим запросом?
А если в нем изрядно строк?

  Ответить  
 
 автор: Лена   (23.06.2010 в 22:33)   письмо автору
 
   для: 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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования