помогите создать поиск по базе

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

  1. karen12

    karen12 Постоялец

    Регистр.:
    26 фев 2012
    Сообщения:
    83
    Симпатии:
    1
    Есть две таблицы
    PHP:
    CREATE TABLE IF NOT EXISTS `cw_users` (
      `
    useridint(25NOT NULL AUTO_INCREMENT,
      `
    first_namevarchar(25CHARACTER SET utf8 NOT NULL DEFAULT '',
      `
    last_namevarchar(25CHARACTER SET utf8 NOT NULL DEFAULT '',
      `
    email_addressvarchar(50CHARACTER SET utf8 NOT NULL DEFAULT '',
      `
    usernamevarchar(25CHARACTER SET utf8 NOT NULL DEFAULT '',
      `
    passwordvarchar(255CHARACTER SET utf8 NOT NULL DEFAULT '',
      `
    infovarchar(50CHARACTER SET utf8 NOT NULL,
      `
    last_loggedinvarchar(100CHARACTER SET utf8 NOT NULL DEFAULT 'never',
      `
    user_levelenum('1','2','3','4','5'CHARACTER SET utf8 NOT NULL DEFAULT '1',
      `
    forgotvarchar(100CHARACTER SET utf8 DEFAULT NULL,
      `
    statusenum('live','suspended','pending'CHARACTER SET utf8 NOT NULL DEFAULT 'live',
      
    PRIMARY KEY (`userid`)
    и

    PHP:
    CREATE TABLE IF NOT EXISTS `reception` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    patient_useridint(11NOT NULL,
      `
    fill_datetext NOT NULL,
      `
    carttext NOT NULL,
      `
    date_in_titletext NOT NULL,
      `
    date_replace_titletext NOT NULL,
      `
    date_out_titletext NOT NULL,
      `
    date_intext NOT NULL,
      `
    clock_intext NOT NULL,
      `
    date_replacetext NOT NULL,
      `
    clock_replacetext NOT NULL,
      `
    date_outtext NOT NULL,
      `
    clock_outtext NOT NULL,
      
    PRIMARY KEY (`id`)
    Есть форма авторизации, регистрируется юзера в таблице "cw_users" . Как видно обе таблицы связанны друг с другом по userid и patient_userid. Авторизировавшиейся пользователь может добавить материал в таблицу "reception" . авторизация работает на сессиях, каждый пользователь может посматреть свои добавленные данные с помощью вот этого вывода
    PHP:
    $res mysql_query("SELECT * FROM `reception`  WHERE  `patient_userid`= '".$_SESSION['id']."'  ORDER BY  `id` DESC LIMIT $start$num");
    Все работает прекрасно, НО когда хочу сделать поиск по добавленным материалам, то выводятся все данные добавленные всеми пользователями, а мне надо чтобы при поиске вывелись только добавленные данные данного пользователя- вот мой скрипт поиска
    PHP:
    <form id="search-form" action="view_search.php" method="post" name="form_s" >
           
            <
    input  type="text" name="search" placeholder="Поиск.." />
           </
    form>
       
    PHP:
    <table border="2" class="table  table-ayc-f table_all_recept" >
             <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="120">дата отправки</th>
                   <th style="text-align:center;" width="330">ФИО</th>
             
               <th style="text-align:center;"  width="120"></th>
             </tr>
       
           
    <?php
    $res
    =mysql_query("SELECT * FROM reception  WHERE  (`last_name` LIKE '%".$search."%') OR (`first_name` LIKE '%".$search."%')  OR (`date_in` LIKE '%".$search."%') OR (`date_out` LIKE '%".$search."%') OR (`date_replace` LIKE '%".$search."%')  and `patient_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_out']."</a></td>
                 <td style='text-align:center;'><a  href='recuest/reception_view.php?id="
    .$row['id']."'>
                 "
    .$row['date_replace']."</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>
             
             
               <td style='text-align:center;'><a class='btn btn-primary' href='recuest/reception_edit.php?id="
    .$row['id']."'><i class='icon-edit'></i></a>&nbsp;&nbsp;
               <a class='btn btn-danger'  href='recuest/reception_delete.php?id="
    .$row['id']."'><i class='icon-trash'></i></a>
               
                       
               
               </td>
             </tr>
       "
    ;
    }
    mysql_free_result($res);
    }
    echo
    "
         </table>   


       "
    ;
    ?>   
    Что я делаю неправильно????
     
  2. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    1. Данные надо экранировать.
    2. Наверное в созданную таблицу ещё нужно добавить FULLTEXT поиск
    Код:
    FULLTEXT KEY `search` (`first_name`,`last_name`,`date_in`,`date_out`,`date_replace`)
    3. Это
    Код:
    $res=mysql_query("SELECT * FROM reception WHERE (`last_name` LIKE '%".$search."%') OR (`first_name` LIKE '%".$search."%') OR (`date_in` LIKE '%".$search."%') OR (`date_out` LIKE '%".$search."%') OR (`date_replace` LIKE '%".$search."%') and `patient_userid`= '".$_SESSION['id']."' ");
    Поменять на это:
    Код:
    $res=mysql_query("SELECT * FROM `reception` WHERE `patient_userid`= '".$_SESSION['id']."' AND MATCH(`first_name`,`last_name`,`date_in`,`date_out`,`date_replace`) AGAINST ('".$search."' IN BOOLEAN MODE);";
    Хотя я бы усложнил — добавил сортировку по полям даты.
    Сейчас для пользователя непонятно — зачем и как искать по полям `date_in`,`date_out`,`date_replace`
    Мне кажется эти поля сейчас в поиске бесполезны, но можно в выводе ставить радиобуттон «сортировка» — и там уже добавить эти 3 поля, с пояснением.
    А в запрос добавить "order by" — и выбирать между `date_in`,`date_out`,`date_replace`
     
    Последнее редактирование: 11 сен 2014
  3. Demian12

    Demian12 Создатель

    Регистр.:
    13 авг 2014
    Сообщения:
    12
    Симпатии:
    9
    Добавлю. Конкретно неправильно в запросе следующее:
    PHP:
    "SELECT * FROM reception  WHERE  (`last_name` LIKE '%".$search."%') OR (`first_name` LIKE '%".$search."%')  OR (`date_in` LIKE '%".$search."%') OR (`date_out` LIKE '%".$search."%') OR (`date_replace` LIKE '%".$search."%')  and `patient_userid`= '".$_SESSION['id']."'  "
    Дело в том, что оператор OR выполняется после оператора AND. Поэтому ограничение по пользователю добавляется только к последнему условию. Достаточно поставить скобки:
    PHP:
    "SELECT * FROM reception  WHERE  ((`last_name` LIKE '%".$search."%') OR (`first_name` LIKE '%".$search."%')  OR (`date_in` LIKE '%".$search."%') OR (`date_out` LIKE '%".$search."%') OR (`date_replace` LIKE '%".$search."%'))  and `patient_userid`= '".$_SESSION['id']."'  "
     
  4. karen12

    karen12 Постоялец

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

    Спасибо, я хотел перейти на ваш способ ,как заметил что поиск не выдает слова с русскими буквами, пожалуйста посматрите на пост
    https://www.nulled.cc/threads/255339/ если можете помагите


    Помаги мне написать поиск с сортировкой по всем полям select option
     
    Последнее редактирование модератором: 29 сен 2014
  5. MrLolthe1s

    MrLolthe1s Писатель

    Регистр.:
    15 сен 2014
    Сообщения:
    0
    Симпатии:
    0
    PHP:
    for($i=0;$i<strlen(массив_с_результатом);$i++){
    if(
    массив_с_результатом[$i]=="Что искали"){
    //бла,бла,бла
    }
    }
     
    Последнее редактирование модератором: 29 сен 2014
  6. Vhhhhh

    Vhhhhh Писатель

    Регистр.:
    24 фев 2014
    Сообщения:
    6
    Симпатии:
    1
    Поиск с русскими символами может неработать изза кодировки, для этого надо задать кодировку соединения с бд или декодировать строку.
     
  7. maxtor96

    maxtor96 Писатель

    Регистр.:
    4 фев 2013
    Сообщения:
    5
    Симпатии:
    0
    определите кодировку на сервере на такую что и в БД
     
  8. SNip

    SNip Создатель

    Регистр.:
    1 окт 2012
    Сообщения:
    19
    Симпатии:
    0
    Проблема русского языка и MySQL ещё состоит в том, что MySQL чувствителен к регистру, так что самый верный способ это использовать поиск по заглавным или прописным словам. В данном случае тебе поможет функция UPPER http://www.mysql.ru/docs/maryan/#upper
     
  9. rastafara

    rastafara Писатель

    Регистр.:
    9 окт 2015
    Сообщения:
    0
    Симпатии:
    0
    Сначала приводишь к одному регистру strtoupper
    Потом ищите. LIKE '%'
    Плюс кодировка:
    @mysql_query("SET NAMES 'utf8'");
    @mysql_query("SET CHARACTER SET 'utf8'");
    @mysql_query("SET collation_connection='utf8_general_ci'");
    @mysql_query("SET collation_server='utf8_general_ci'");
    @mysql_query("SET character_set_client='utf8'");
    @mysql_query("SET character_set_connection='utf8'");
    @mysql_query("SET character_set_results='utf8'");
    @mysql_query("SET character_set_server='utf8'");
     
  10. mSnus

    mSnus Создатель

    Регистр.:
    4 дек 2015
    Сообщения:
    24
    Симпатии:
    5
    Перепишите запрос. Во-первых, логично сначала отсеять только нужных юзеров по id, а потом уже для них искать по всем строкам, а не наоборот.
    Во-вторых, будете уверенны, что порядок действий правильный.

    PHP:
    SELECT FROM reception 
    WHERE 
    `patient_userid`= '".$_SESSION['id']."' AND
    (
    (`
    last_nameLIKE '%".$search."%') OR
    (`
    first_nameLIKE '%".$search."%')  OR
    (`
    date_inLIKE '%".$search."%') OR
    (`
    date_outLIKE '%".$search."%') OR
    (`
    date_replaceLIKE '%".$search."%')
    )
    "SELECT * FROM reception WHERE (`last_name` LIKE '%".$search."%') OR (`first_name` LIKE '%".$search."%') OR (`date_in` LIKE '%".$search."%') OR (`date_out` LIKE '%".$search."%') OR (`date_replace` LIKE '%".$search."%') and `patient_userid`= '".$_SESSION['id']."' "