За последние 24 часа нас посетили 20110 программистов и 1577 роботов. Сейчас ищут 2105 программистов ...

Как создать динамический запрос?

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

  1. allowance

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

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Как реализовать динамический запрос на выбор определённых данных?

    К примеру есть таблица members
    Получаем переменные с формы Get/Post методом.

    $look - число(пусть будет 1 либо 2) 1 = man, 2 = woman
    $city - число (пусть будет до 50 городов)
    $photo_only - true либо false (checkbox)

    Вобщем имеем 3 переменных, $look = 2, $city = 5, $photo_only = true.
    Делаем запрос - выбираем всех пользователей где поле city = 5, look = 2, photo = true.

    А если скажем переменных не 3 а 20 и половина из них пустых, как тогда при таких условиях составить динамический запрос?
     
  2. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    PHP:
    1. <?php
    2. $query = array();
    3. $str = null;
    4.  
    5. $look  = isset($_POST['look'])?(int)$_POST['look']:0;
    6. $city = isset($_POST['city'])?(int)$_POST['city']:0;
    7. $photo_only = isset($_POST['photo_only'])?1:0;
    8.  
    9. //далее расширяемый блок на нужное кол-во условий
    10. if($look > 0) $query[] = "`look` = ".$look;
    11. if($city > 0) $query[] = "`city` = ".$city;
    12. if($photo_only) $query[] = "`photo_only` = 1";//хранить в базе 1 - для тру, 0 - для фалсе.
    13. //Тут если 0 - то в запрос ниче не добавляем
    14.  
    15. $num = count($query);
    16. for($i = 0; $i < $num; $i++)//вот тут надо поиграться и сделать чтоб в конце не добавляло лишний AND
    17. {
    18. $str .= $query[$i];
    19. if($i < $num - 1) $str .= " AND ";
    20. }
    21.  
    22. if($num > 0)//тут можно по-разному проверять
    23. {
    24. $str = "WHERE ".$str;
    25. }
    26. $temp = mysql_query("SELECT * FROM `table1`".$str);
    вобщем, суть должна быть ясна. Написал без редактора, так что гдето может синтаксическая быть.
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    PHP:
    1. <?php
    2.         function getSelect($arr, $tab=null, $where=null, $numUnion=0){
    3.             if (is_array($arr)){
    4.                 if (empty($tab)  || !is_string($tab)) throw new FormatException("Не задана таблица для выбора","Неверный тип данных");
    5.                
    6.                 $fields="";
    7.                 foreach($arr as $val){
    8.                     $fields .=escapeKeys($val).",";
    9.                 }
    10.                 $fields=trim($fields,",");
    11.                
    12.                 $expr=getWhere($where);
    13.                
    14.                 $sql="select $fields from $tab ".$expr; //Создаем запрос
    15.             }
    16.             else{
    17.                 $sql=trim($arr."");
    18.             }
    19.             checkQuery($sql, $numUnion);
    20.             return $sql;
    21.         }
    22.  
    23.         function getWhere($where){
    24.             if (is_array($where)) return " where ".getAssignmentString($where, " and");
    25.             if (is_int($where)) return " where id=".$where;
    26.             if (!empty($where)) return " where ".$where;
    27.             return'';
    28.         }
    29.  
    30.         function getAssignmentString($arr, $delim){
    31.             $rez="";
    32.             foreach($arr as $key=>$val){
    33.                 $rez .= $this->escapeKeys($key)."=".$this->escapeString($val).$delim;
    34.             }
    35.             $rez=substr($rez,0,-strlen($delim));
    36.             return $rez;
    37.         }
    38.  
    39.         function escapeString($str){
    40.             if (is_array($str)){
    41.                 foreach($str as $key=>$val){
    42.                     $str[$key]=escapeString($val);
    43.                 }
    44.                 return $str;
    45.             }
    46.             if ($str==null) return "NULL";
    47.             if (is_string($str)) return "'".escape($str)."'";
    48.             return $str;
    49.         }
    50.  
    51.        
    52.         function escapeKeys($key){
    53.             if ($key==="*") return "*";
    54.             return LKS.$key.RKS;
    55.         }
    56. /*где LKS - left key string
    57. RKS - right key string
    58. В случае MySQL они равны "`"
    59. */
    60.  
    Апельсин
    implode вместо цикла, не?
     
  4. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Volt(220)
    Ты все усложнил))
    неужто тебе твой код кажется более простым чем мой ?))
     
  5. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Мой код универсальнее, потому сложнее:
    1) Твой код надо ручками дописывать на нужное количество полей.
    Моему коду можно скормить запрос, части запроса, массивы и т.д.

    2)Твой код заточен на цифры. Мой код может работать и со строками и с null значениями.
     
  6. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Volt(220)
    не ну епти, что просят то и делаем :)
    но по-моему 5 функций для этого много. Нерационально так сказать. Разве что такой вот поиск будет в нескольких страницах юзаться
     
  7. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ну у меня это вообще все в объекте для работы с БД. Т.е. используется практически везде.
     
  8. allowance

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

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Volt(220)

    PHP:
    1.  
    2.  function getAssignmentString($arr, $delim){
    3.               $rez="";
    4.               foreach($arr as $key=>$val){
    5.                   $rez .= $this->escapeKeys($key)."=".$this->escapeString($val).$delim;
    6.               }
    7.               $rez=substr($rez,0,-strlen($delim));
    8.               return $rez;
    9.           }
    Что за переменная $delim ?
     
  9. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    delimiter - разделитель. Какой строкой разделять $key=$val.
    Для блока where это "and", а для блока update это ", ".