За последние 24 часа нас посетили 17548 программистов и 1624 робота. Сейчас ищут 1662 программиста ...

Запрос WHERE kto='$k' при $k='all'

Тема в разделе "MySQL", создана пользователем dslychko, 18 мар 2008.

  1. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    В скрипт передаётся переменная $k. Она используется для запроса

    Код (Text):
    1. SELECT * FROM $table1 WHERE kto='$k' and date between '$t1' and '$t1' ORDER BY ID
    Как в этом случае сделать чтобы kto мог быть - ВСЕ (или просто не учитывать это условие kto='$k')?
     
  2. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    PHP:
    1. $where="date between '$t1' and '$t1'";
    2. if ($k!='all') $where.=" AND kto='$k' ";
    3. $sql="SELECT * FROM $table1 WHERE $where ORDER By ID";
     
  3. Anonymous

    Anonymous Guest

     
  4. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Спасибо
     
  5. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Метод Олега не осилил.
    Делал как подсказал armadillo.
    А если таких параметров как $k='all' десяток ?
    То есть например есть переменные $k , $k2, $k3, $k4, ..., $k9 каждая из которых может быть равна all.
     
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    PHP:
    1. $where0=" date between '$t1' and '$t1' ";
    2. $where =array();
    3. $where[]=$where0;
    4. foreach ($kto as $k) {
    5. if ($k!='all') $where[]=" kto= ".$k." ";
    6. }
    7. $sql="SELECT * FROM $table1 WHERE ".implode(' AND ',$where)." ORDER BY ID";
    в методе Олега вместо $kto!="all" применяется isset($kto)
     
  7. Anonymous

    Anonymous Guest

    Тут надо динамически запросы строить. Опираясь на массив, желательно. (но не обязательно)
     
  8. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Пример с двумя переменными можно изобразить ? Пожалуйста.
     
  9. Anonymous

    Anonymous Guest

    PHP:
    1. <?php
    2. function sql_protect($var)
    3. {
    4.     return "'".mysql_escape_string(get_magic_quotes_gpc()?stripslashes($var):$var)."'" ;
    5. }
    6.  
    7. function sql_and_where($array)
    8. {
    9.     foreach($array as $key => $val)
    10.         {
    11.             $val = sql_protect($val);
    12.             $cond[] = " `$key` = $val ";
    13.         }
    14.     return implode('and',$cond);
    15. }
    16.  
    17. $data = array(
    18. 'date' => '12/11/2002',
    19. 'id' => '44',
    20. 'tag' => 'flipper',
    21. );
    22.  
    23. $sql = 'select * from table where '.sql_and_where($data);
    24.  
    25. echo $sql;
    26. ?>
     
  10. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Это высший пилотаж.
    Как всегда выручаете Олег. Спасибо.
     
  11. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0


    После доработки под мои нужды получился следующий рабочий код :


    PHP:
    1. <?php
    2. function sql_protect($var)
    3. {
    4.     return "'".mysql_escape_string(get_magic_quotes_gpc()?stripslashes($var):$var)."'" ;
    5. }
    6.  
    7. function sql_and_where($array)
    8. {
    9.     foreach($array as $key => $val)
    10.         {
    11.             $val = sql_protect($val);
    12.             $cond[] = " `$key` = $val ";
    13.         }
    14.     return implode('and',$cond);
    15. }
    16.  
    17.  $t3='2008-02-01';
    18.  $t4='2008-03-20';
    19.  $k='all';                          
    20.  $k2='222';
    21.  //$k3='333';
    22.  $k4='444';                        
    23.  $k5='all';                        
    24.  //$k6='666';                    
    25.  $k7='all';        
    26.  $k8='all';          
    27.  $k9='999';      
    28.                    
    29.  $data = array();
    30.  
    31.  if(!$k or $k=='all') {} else {$data['kto']= $k;}
    32.  if(!$k2 or $k2=='all') {} else {$data['kto2']= $k2;}
    33.  if(!$k3 or $k3=='all') {} else {$data['kto3']= $k3;}
    34.  if(!$k4 or $k4=='all') {} else {$data['kto4']= $k4;}
    35.  if(!$k5 or $k5=='all') {} else {$data['kto5']= $k5;}
    36.  if(!$k6 or $k6=='all') {} else {$data['kto6']= $k6;}
    37.  if(!$k7 or $k7=='all') {} else {$data['kto7']= $k7;}
    38.  if(!$k8 or $k8=='all') {} else {$data['kto8']= $k8;}
    39.  if(!$k9 or $k9=='all') {} else {$data['kto9']= $k9;}
    40.  
    41.  $sql = 'select * from table where '.sql_and_where($data).' and date between \'$t3\' and \'$t4\' ORDER BY date ';
    42.  
    43.  echo $sql;
    44. ?>
    У переменных k-k9 может быть 3 состояния - 1 переменная не определена, 2 переменная = all, 3 переменная имеет некое значение.
    Сделал как смог. Не бейте :)
     
  12. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Чем больше вникаю , тем больше вопросов.
    Обьясните пожалуйтса для чего нужна функция function sql_protect ?
    И как сделать при if((!$k2 or $k2=='all') and (!$k3 or $k3=='all')) запрос выглядел следующим образом
    select * from table where (`kto` = '$k' or 'komu'='$k') and date between '2008-02-01' and '2008-03-20' ORDER BY date ?
    Пробовал передавать в массив
    PHP:
    1. $data['kto']= 'izm' ;
    и в массиве
    PHP:
    1.      foreach($array as $key => $val)
    2.          {
    3.              if($val=='izm'){$cond[] = " `$key` = '$k' ";}else{
    4.              //$val = sql_protect($val);
    5.              $cond[] = " `$key` = '$val' "; }
    6.          }
    проверять переменную и формировать другое значение , но не получается. Что-то я коряво делаю. $k в массиве не видно.
     
  13. Anonymous

    Anonymous Guest

    Защищает от SQL-иньекций )
     
  14. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Помучался и всё осилил сам.
    Всё получилось.
    Большое спасибо !