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

karen12

Постоялец
Регистрация
26 Фев 2012
Сообщения
108
Реакции
4
Вот делаю поиск пользователей в системе имею такой запрос:

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 отдельных поиска. Первый по фамилии, второй по имени. Затем объедините результаты.
Либо
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 запросы не кешируются.


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

1. Если я переведу строку в uppercase или lowercase, число Unicode-символов не изменится.

Нет. В тексте могут попасться строчные лигатуры, которым не соответствует один символ в верхнем регистре. Например, при переводе в uppercase: fi (U+FB00) -> FI (U+0046, U+0049)
Для просмотра ссылки Войди или Зарегистрируйся
конечно, это не ваш случай, но все же.
 
Последнее редактирование:
Сделайте лучше 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 запросы не кешируются.


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


Для просмотра ссылки Войди или Зарегистрируйся
конечно, это не ваш случай, но все же.
Я тут немножко именил свои условия поиска и поля поиска, вот привожу мой вариант поиска с возможностью выбора по какому полю искать, но хочу все это объеденить, как описал выше, если у Вас есть время и терпение прошу помочь реализовать мою просьбу

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 , но не знаю как использовать
 
Неверный подход к выбору поиска что искать. Нужно искать по всем полям сразу, предварительно проверяя их на заполненость (есть) и корректность заполнения (опущен код). Упрощенный вариант см. ниже.

В зависимости от заполнения полей в запрос добавляются условия. Содержимое полей обычно обрабатывают через 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-ый аргумент - разделитель по которому строка будет разбиваться на элементы массива. Например, если нужно сделать массив слов из предложения, то разделителем будет пробел между словами (правда потом еще надо будет очистить от знаков припинания слова).

Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Неверный подход к выбору поиска что искать. Нужно искать по всем полям сразу, предварительно проверяя их на заполненость (есть) и корректность заполнения (опущен код). Упрощенный вариант см. ниже.

В зависимости от заполнения полей в запрос добавляются условия. Содержимое полей обычно обрабатывают через 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-ый аргумент - разделитель по которому строка будет разбиваться на элементы массива. Например, если нужно сделать массив слов из предложения, то разделителем будет пробел между словами (правда потом еще надо будет очистить от знаков припинания слова).


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