За последние 24 часа нас посетили 22963 программиста и 1722 робота. Сейчас ищут 1528 программистов ...

Составление грамотного запроса

Тема в разделе "PHP и базы данных", создана пользователем quazare, 15 июн 2008.

  1. quazare

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

    С нами с:
    3 июн 2008
    Сообщения:
    88
    Симпатии:
    0
    Адрес:
    Nsk
    Народ привет!
    Подскажите такую вещь:

    1.Есть таблица mytab с данными.

    2.Есть форма запроса с 2-мя параметрами, значение каждого из которых может не существовать.

    3.Как сделать грамотный запрос, который бы учитывал отсутствие того или иного параметра...

    Паример

    SELECT * FROM mytab WHERE [param1 LIKE param_num1] OR [param2 LIKE param_num2];

    скобочками [] - я указал, что может отсутствовать параметры param1 или param2.

    Большое спасибо!
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А чем текущий не подходит?
    Можно так:
    PHP:
    1. <?php
    2. if (!empty($_POST["param_num1"]) and !empty($_POST["param_num2"])) {
    3.    $like = 'param1 LIKE "%'.
    4. mysql_real_escape_string(strtr($_POST["param_num1"], Array("_" => " ", "%" => " "))).'%" AND param2 LIKE "%'.mysql_real_escape_string(strtr($_POST["param_num2"], Array("_" => " ", "%" => " "))).'%"';
    5. }
    6. if (!empty($_POST["param_num1"]) and empty($_POST["param_num2"])) {
    7.     $like = 'param1 LIKE "%'.
    8. mysql_real_escape_string(strtr($_POST["param_num1"], Array("_" => " ", "%" => " "))).'%"';
    9. }
    10. if (empty($_POST["param_num1"]) and !empty($_POST["param_num2"])) {
    11.    $like = 'param2 LIKE "%'.mysql_real_escape_string(strtr($_POST["param_num2"], Array("_" => " ", "%" => " "))).'%"';
    12. }
    13. $sql = 'SELECT * FROM mytab WHERE .'$like;
    14. ?>
     
  3. quazare

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

    С нами с:
    3 июн 2008
    Сообщения:
    88
    Симпатии:
    0
    Адрес:
    Nsk

    Ага понятно, а почему нет все-таки универсального запроса, если param1 и param2 не существуют, то выражение в цитате не проканает...
     
  4. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    PHP:
    1. <?php
    2. //объявляем переменную для хранения условий запроса
    3. $like = '';
    4. //проверяем, переданы ли параметры
    5. if($param1){
    6.     //первый параметр передан, проверяем, заполнена ли переменная условий еще какими-то значениями
    7.     if(!$like){
    8.         //не заполнена, заполняем
    9.         $like = "%{$param1}%";
    10.     } else {
    11.         //заполнена, объединяем с прежним значением
    12.         $like .= " AND %{$param1}%";
    13.     }
    14. }
    15. //итого: $like либо корректное условие, либо null
    16. ?>
    хотя, вложенный IF у меня написан короче=)
     
  5. quazare

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

    С нами с:
    3 июн 2008
    Сообщения:
    88
    Симпатии:
    0
    Адрес:
    Nsk
    Не... вообще на первый взгляд подход должен быть такой:

    PHP:
    1. <?php
    2.  
    3. $s_query="SELECT * FROM mytab ";
    4.  
    5. if ( $_POST['param01]'] || $_POST['param02']){
    6.   $s_query=$s_query." WHERE ";
    7. }
    8.  
    9. if ($_POST['param01']){
    10.  
    11.   $s_query=$s_query." param01 LIKE '".$_POST['param01']." '
    12. }
    13.  
    14. if ($_POST['param02']){
    15.  
    16.  if ($_POST['param02']){
    17.  
    18.    $s_query=$s_query." AND ";
    19.   }
    20.  
    21.  
    22.  $s_query=$s_query." param02 LIKE '".$_POST['param02']." '
    23.  
    24. }
    25.  
    26.  
    27. ну и т.д...
    28. ?>
    Кто-нить, предложите что-нибудь пооптимизированней, а то все равно гемморойнойное количество условий появляется...
     
  6. eduha

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

    С нами с:
    8 ноя 2006
    Сообщения:
    278
    Симпатии:
    0
    Адрес:
    Караганда
    Пихать условия в массив, потом implode()
     
  7. quazare

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

    С нами с:
    3 июн 2008
    Сообщения:
    88
    Симпатии:
    0
    Адрес:
    Nsk
    А можно примерчик... Насколько я понимаю - логично сделать некий простой класс, скажем позволяющий "распозновать" до 10 элементов и скажем работать на одно условие AND.

    Соответствено - на выходе будет строка запроса...
     
  8. eduha

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

    С нами с:
    8 ноя 2006
    Сообщения:
    278
    Симпатии:
    0
    Адрес:
    Караганда
  9. quazare

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

    С нами с:
    3 июн 2008
    Сообщения:
    88
    Симпатии:
    0
    Адрес:
    Nsk
    кстати, да... только подработать надо...
     
  10. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1. <?
    2. $where = '';
    3. foreach (array('param1', 'param2', 'param3') as $var) {
    4.     if (!empty ($$var)) {
    5.         $where .= $where ? ' AND ' : ' WHERE ';
    6.         $where .= $var.' = '.$db->quote($$var);
    7.     }
    8. }
    9. $sql = 'SELECT * FROM table'.$where;
    P.S.: юзать ORM (например, doctrine) гораздо приятней чем писать конструкторы запросов
     
  11. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    eduha

    конкретно в твоем коде - а если массив пустой останется?=)
     
  12. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Тащить всё доктрину ради критерии... Сомнительное удовольствие. :)
     
  13. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Sergey89
    факт
     
  14. eduha

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

    С нами с:
    8 ноя 2006
    Сообщения:
    278
    Симпатии:
    0
    Адрес:
    Караганда
    DarkElf
    Так эта..
     
  15. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    eduha

    ок, а если реально просят полную таблицу? query was empty ... нехорошо)
     
  16. eduha

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

    С нами с:
    8 ноя 2006
    Сообщения:
    278
    Симпатии:
    0
    Адрес:
    Караганда
    DarkElf
    PHP:
    1. <?php
    2. $sql = 'SELECT * FROM table WHERE '. ($q ? implode( $q, ' AND ' ) : 1);
    Блин, это ж не готовый рабочий скрипт. Просто пример. Думаю, автор топика способен разобраться с if
     
  17. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Как раз для твоего случая, у Д. Котерова есть такое решение. DbSimple называется. www.dklab.ru
     
  18. quazare

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

    С нами с:
    3 июн 2008
    Сообщения:
    88
    Симпатии:
    0
    Адрес:
    Nsk
    кстати, с implode() - мне решение понравилось...