Поиск по имени фамилии

Тема в разделе "Как сделать...", создана пользователем karen12, 19 окт 2014.

  1. karen12

    karen12 Постоялец Нарушитель

    Регистр.:
    26 фев 2012
    Сообщения:
    80
    Симпатии:
    1
    Вот делаю поиск пользователей в системе имею такой запрос:

    PHP:
    $query 'select name_user, lastname from social_users where name_user like "%'.$word.'%"  or lastname like "%'.$word.'%" ORDER BY id ';
    оно ищет, НО только отдельно имя или фамилия, как добавить сюда поиск одновременно по имени и фамилия.
    Главное что бы поиск отдельно тоже остался???

    дополнительно: данные вводятся через ОДИН input, с него post запрос на php
    прошу написать весь код
     
  2. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    196
    Вместо OR применить AND
     
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    996
    Симпатии:
    268
    Сделайте лучше 2 отдельных поиска. Первый по фамилии, второй по имени. Затем объедините результаты.
    Либо
    PHP:
     $query =
    'SELECT
    name_user, lastname from social_users
    WHERE
    (name_user like "%'
    .$word.'%"  AND lastname like "%'.$word.'%" )
    OR
    name_user like "%'
    .$word.'%"
    OR
    lastname like "%'
    .$word.'%"
    ORDER BY id '
    ;
    Ищет значение $word по фамилии и имени, либо по фамилии, либо по имени.

    Неплохо бы еще добавить количество выбираемых строк - LIMIT 0, 10 - будут выбираться первые 10 строк. Если у вас будет миллион записей, то запрос будет давать приличную нагрузку на сервер. При поиске в виде LIKE запросы не кешируются.


    В вашем случае еще хорошо бы хранить ФИО либо заглавными буквами, либо строчными. Во всех поисковых запросах так же преобразовывать все либо к заглавным, либо к строчным.

    http://habrahabr.ru/post/147387/
    конечно, это не ваш случай, но все же.
     
    Последнее редактирование: 19 окт 2014
  4. karen12

    karen12 Постоялец Нарушитель

    Регистр.:
    26 фев 2012
    Сообщения:
    80
    Симпатии:
    1
    Я тут немножко именил свои условия поиска и поля поиска, вот привожу мой вариант поиска с возможностью выбора по какому полю искать, но хочу все это объеденить, как описал выше, если у Вас есть время и терпение прошу помочь реализовать мою просьбу

    PHP:
    <form  action="search_view/view_search.php" method="post" name="form_s" >  
            <input  id="search" type="text" name="find"  placeholder="<?=$start['search_im_my_patient']?>..." />    
           <Select name="field"  id="select" >
    <Option value="last_name">Фамилия</option>
    <Option value="first_name">Имя</option>
    <Option value="date_in">Дата поступлении</option>
    <Option value="date_replace_out">Дата выписки</option>
    </select>
    <input type="submit" id="submit"  name="search" value="Поиск" />
      </form>
        
        </div>


    view_search.php

    PHP:
        
    <?php
    include_once '../include/processes.php';

        
    $field $_POST['field'];
               if (empty(
    $field)){
    echo 
    "<h2>".$start['chuse_field']."</h2>";
    }
       
    $find $_POST['find'];
    if (empty(
    $find)){
    echo 
    "<h2>".$start['chuse_find']."</h2>";
    }

    $find strtoupper($find);
    $find strip_tags($find);
    $find trim ($find);
    ?>

    <table border="2" class="table  table-ayc-f table_all_recept"  width="100%" >
             <tr>
               <th style="text-align:center;" width="40">N</th>
               <th style="text-align:center;" width="120">Дата поступлении</th>
              
                   <th style="text-align:center;" width="120">Дата выписки</th>
                   <th style="text-align:center;" width="330">ИФ</th>
            
            
             </tr>



    <?

    $res=mysql_query("SELECT * FROM `reception` WHERE (upper($field) LIKE '%".$find."%') AND `doctor_userid`= '".$_SESSION['id']."'") ;
    if ($res)
    {$i=mysql_num_rows($res);

    while ($row = mysql_fetch_array($res))
    {

       echo "
           <tr>
             <td style='text-align:center;'>".$i--."</td>
               <td style='text-align:center;'> <a  href='../recuest/reception_view.php?id=".$row['id']."'>".$row['date_in']."</a></td>
               <td style='text-align:center;'><a  href='../recuest/reception_view.php?id=".$row["id"]." ' >
                 ".$row["date_replace_out"]."</a></td>
                 <td style='text-align:center;'><a  href='../recuest/reception_view.php?id=".$row['id']."'>".$row['last_name']."  ".$row['first_name']."  ".$row['second_name']."</a></td>
            
            
             </tr>
       ";
    }
    mysql_free_result($res);
    }
    echo"
         </table>  
          

       ";
    ?>
    И еще я прочел про функцию explode , но не знаю как использовать
     
  5. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    996
    Симпатии:
    268
    Неверный подход к выбору поиска что искать. Нужно искать по всем полям сразу, предварительно проверяя их на заполненость (есть) и корректность заполнения (опущен код). Упрощенный вариант см. ниже.

    В зависимости от заполнения полей в запрос добавляются условия. Содержимое полей обычно обрабатывают через AND , а не OR. Но можно как-то комбинировать и условия и все остальное.

    PHP:
    if (!empty($_POST['last_name'])){
    $query_add[]='surname_user like "%'.$word.'%"' ;
    }
    if (!empty(
    $_POST['first_name'])){
    $query_add[]='name_user like "%'.$word.'%"' ;
    }
    if (!empty(
    $_POST['date_in'])){
    $query_add[]='date_in "%'.$word.'%"' ;
    }
    if (!empty(
    $_POST['date_replace_out'])){
    $query_add[]='date_out "%'.$word.'%"' ;
    }
    // $query_add Теперь тут лежит массив условий для запросов

    $query ='SELECT
    name_user, lastname from social_users
    WHERE '
    .implode(' AND '$query_add).'
    ORDER BY id ASC
    LIMIT 0,10'
    ;

    // посмотреть на получившийся результат
    echo $query;
    p.s. Возможно в синтаксисе где-нибудь лишняя кавычка. Это не проверял.

    Explode - обратная функция от implode. Она из строки делает массив. 1-ый аргумент - разделитель по которому строка будет разбиваться на элементы массива. Например, если нужно сделать массив слов из предложения, то разделителем будет пробел между словами (правда потом еще надо будет очистить от знаков припинания слова).

    http://ru2.php.net/manual/ru/function.explode.php
     
    Последнее редактирование: 19 окт 2014
  6. karen12

    karen12 Постоялец Нарушитель

    Регистр.:
    26 фев 2012
    Сообщения:
    80
    Симпатии:
    1

    Если честно я не понел что вы написали, я же привел другой код, на Вашем примере все смешанно:
    ((