За последние 24 часа нас посетили 20327 программистов и 1563 робота. Сейчас ищут 1935 программистов ...

Помогите найти решение для динамического SQL запроса

Тема в разделе "PHP и базы данных", создана пользователем S1nes, 30 авг 2010.

  1. S1nes

    S1nes Активный пользователь

    С нами с:
    30 авг 2010
    Сообщения:
    2
    Симпатии:
    0
    Суть проблемы, есть php код формирования динамического sql запроса...
    Вот рез-т работы скрипта при нажатии на кнопку поиска по выбранным элементам select :

    SELECT * FROM `data` WHERE `country` = Italy AND `type` = Comercial AND `pricemin` = 300000 AND `pricemax` = 2000000

    Нужно, чтобы пункты выборки по цене pricemin, pricemax выглядели след образом:

    SELECT * FROM `data` WHERE `country` = Italy AND `type` = Comercial AND `pricemin` >= 100 AND `pricemax` <= 200




    Сам php-скрипт :

    PHP:
    1. <?php
    2.  
    3.  if(isset($_GET['submitButton']))
    4.  {
    5.      // Пришедшие данные из SELECT
    6.      $country = isset($_GET['country']) ? $_GET['country'] : 0;
    7.      $type = isset($_GET['type']) ? $_GET['type'] : 0;
    8.      $pricemin = isset($_GET['pricemin']) ? $_GET['pricemin'] : 0;
    9.      $pricemax = isset($_GET['pricemax']) ? $_GET['pricemax'] : 0;
    10.  
    11.  
    12.  // создаем ассоциативный массив
    13.  $array = array(
    14.                  "`country`" => $country,
    15.                  "`type`" => $type,
    16.                  "`pricemin`" => $pricemin,
    17.                  "`pricemax`" => $pricemax,
    18.                );
    19.  
    20.  // Начальная строчка запроса
    21.  $sql = "SELECT * FROM `data`";
    22.  
    23.  //Создаем пустой масив для условия WHERE
    24.  $sql_where = array();
    25.  
    26.  //Перебираем массив
    27. foreach($array as $key => $value)
    28.   {
    29.      // Если есть 0 в запросе отсеиваем его
    30.      if(!empty($value))
    31.      $sql_where[] = $key." = ".($value);
    32.   }
    33.  
    34.  
    35.  
    36.  
    37.  
    38.  //Проверяем нужно ли подставлять условие WHERE в запрос
    39.  if(count($sql_where) > 0)
    40.  $sql .=" WHERE ";
    41.  
    42.  //Формируем окончательную строку запроса
    43.  $sql.=" ".implode(" AND ", $sql_where);
    44.  
    45.  //Собственно вот что получилось в запросе
    46.  echo $sql;
    47.  }
    48.  ?>[quote][/quote]
    PHP:
    1.  
    PHP:
    1.  
     
  2. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    В самом начале скрипта добавьте:
    PHP:
    1. <?php
    2. $_GET['pricemin'] = 100;
    3. $_GET['pricemax'] = 200;
    4. ?>
    А так же измените этот блок:
    PHP:
    1.   //Перебираем массив
    2.  foreach($array as $key => $value)
    3.    {
    4.      // Если есть 0 в запросе отсеиваем его
    5.      if(!empty($value))
    6.      $sql_where[] = $key." = ".($value);
    7.    }
    На этот:

    PHP:
    1. //Перебираем массив
    2. foreach( $array as $key => $value)
    3. {
    4.     // Если есть 0 в запросе отсеиваем его
    5.     if(!empty($value))
    6.     {
    7.         if( $key == 'pricemin')
    8.             $sign = '>=';
    9.         elseif( $key == 'pricemax')
    10.             $sign = '<=';
    11.         else
    12.             $sign = '=';
    13.         $sql_where[] = "$key $sign $value";
    14.     }
    15. }
     
  3. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    как вариант проверять если в названии ключа есть слово min - использовать знак больше или равно
    если есть слово макс - использовать знак меньше или равно.
    в остальных случаях - равно.
     
  4. S1nes

    S1nes Активный пользователь

    С нами с:
    30 авг 2010
    Сообщения:
    2
    Симпатии:
    0
    2 neverlose , Спасиб, сработало,а цифры 100 и 200,это так для примера,они из селекта приходят,поэтому добавил только это...


    PHP:
    1. //Перебираем массив
    2. foreach($array as $key => $value)
    3.   {
    4.      // Если есть 0 в запросе отсеиваем его
    5.      if(!empty($value))
    6.      {
    7.      if($key == "`pricemin`")
    8.         $sign = '>=';
    9.      elseif($key == "`pricemax`")
    10.         $sign = '<=';
    11.      else
    12.         $sign = '=';
    13.      $sql_where[] = "$key $sign $value";           
    14.      }
    15.   }