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

karen12

Постоялец
Регистрация
26 Фев 2012
Сообщения
108
Реакции
4
Есть две таблицы
PHP:
CREATE TABLE IF NOT EXISTS `cw_users` (
  `userid` int(25) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `last_name` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `email_address` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `username` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `password` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `info` varchar(50) CHARACTER SET utf8 NOT NULL,
  `last_loggedin` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT 'never',
  `user_level` enum('1','2','3','4','5') CHARACTER SET utf8 NOT NULL DEFAULT '1',
  `forgot` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `status` enum('live','suspended','pending') CHARACTER SET utf8 NOT NULL DEFAULT 'live',
  PRIMARY KEY (`userid`)
)

и

PHP:
CREATE TABLE IF NOT EXISTS `reception` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `patient_userid` int(11) NOT NULL,
  `fill_date` text NOT NULL,
  `cart` text NOT NULL,
  `date_in_title` text NOT NULL,
  `date_replace_title` text NOT NULL,
  `date_out_title` text NOT NULL,
  `date_in` text NOT NULL,
  `clock_in` text NOT NULL,
  `date_replace` text NOT NULL,
  `clock_replace` text NOT NULL,
  `date_out` text NOT NULL,
  `clock_out` text 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>   


   ";
?>

Что я делаю неправильно????
 
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`
 
Последнее редактирование:
Добавлю. Конкретно неправильно в запросе следующее:
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']."'  "
 
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`


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

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`


Помаги мне написать поиск с сортировкой по всем полям select option
 
Последнее редактирование модератором:
PHP:
for($i=0;$i<strlen(массив_с_результатом);$i++){
if(массив_с_результатом[$i]=="Что искали"){
//бла,бла,бла
}
}
 
Последнее редактирование модератором:
Поиск с русскими символами может неработать изза кодировки, для этого надо задать кодировку соединения с бд или декодировать строку.
 
определите кодировку на сервере на такую что и в БД
 
Проблема русского языка и MySQL ещё состоит в том, что MySQL чувствителен к регистру, так что самый верный способ это использовать поиск по заглавным или прописным словам. В данном случае тебе поможет функция UPPER Для просмотра ссылки Войди или Зарегистрируйся
 
Сначала приводишь к одному регистру 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'");
 
Перепишите запрос. Во-первых, логично сначала отсеять только нужных юзеров по id, а потом уже для них искать по всем строкам, а не наоборот.
Во-вторых, будете уверенны, что порядок действий правильный.

PHP:
SELECT * FROM reception 
WHERE 
`patient_userid`= '".$_SESSION['id']."' AND
(
(`last_name` LIKE '%".$search."%') OR
(`first_name` LIKE '%".$search."%')  OR
(`date_in` LIKE '%".$search."%') OR
(`date_out` LIKE '%".$search."%') OR
(`date_replace` LIKE '%".$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']."' "
 
Назад
Сверху