Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск по сайту(3 часть)
 
 автор: Vados   (28.06.2006 в 17:49)   письмо автору
 
 

Всем привет!
Понимаю, что всем уже очень сильно надоел, особенно Cheops, но я поставил себе цель сделать во чтобы то ни стало поиск.
Сейчас я немного упростил себе задачу, а именно:
1) Мне необходимо реализовать поиск только по названию статьи и по содержанию статьи
2) Что я создал в БД:


БД: 'search'

Структура таблицы 'articles'

CREATE TABLE 'articles' (
  'id' int(10) unsigned NOT NULL auto_increment,
  'title' varchar(200) default NULL,
  'body' text,
  PRIMARY KEY  ('id'),
  FULLTEXT KEY 'title' ('title','body')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;

Дамп данных таблицы 'articles'

INSERT INTO 'articles' ('id', 'title', 'body') VALUES (1, 'MySQL', 'Начало совершенствования MySQL'),
(2, 'Windows', 'Операционная система'),
(3, 'MS Office', 'Пакет оффисных приложений');

3) написал по подобию из примеров, которые расматривались выше из др. топиков, вот что получилось:


<?php
include "config.php";
// Режим поиска
define(TITLES,1);
define(BODY,2);
// Устанавливаем переменные формы
$name $_POST['name'];
$srchwhere $_POST['srchwhere'];
$title $_POST['title'];
$body $_POST['body'];
?>
<html>
<head>
<body>
<table>
<form action="search.php" method="POST">
<tr>
<td>Введите слово или фразу</td>
<td><input type="text" name="name" value='<?php echo $name?>'></td>
</tr>
<tr>
<td>Искать в</td>
<td>
<select type=text name=srchwhere>
<option value=
<?php
echo TITLES;
if (
$srchwhere == TITLES)
echo 
"checked";
?>>
в названиях статей
<option value=
<?php
echo BODY;
if (
$srchwhere == BODY) echo "checked";
?>>в статьях
</select>
</td>
<td>
<input type=submit name=send value=Найти>
</td>
</tr>

<?php
if (!empty($name))
{
    
// Разбиваем поисковую фразу на подстроки, разделённые пробелами
    
$name trim($name);
    
$temp strtok($name" ");
    while (
$temp)
    {
        
// Полнотекстовый поиск по столбцу name таблицы articles 
        // Формируем поисковую часть SQL-запроса, учитывая логику,
        // заданную во временной переменной $logic
        
if ($is_query$search .= " MATCH (name) AGAINST  ('$temp')";
        else 
$search .= "MATCH (name) AGAINST ('$temp')";
        
$is_query true;
        
$temp strtok(" ");
    } 
    
// В зависимости от режима поиска формируем SQL-запрос
    
switch ($srchwhere)
    {
        case 
TITLES// Поиск в названиях статей
        
{
                    }
?>

Помогите грамотно дописать код.

4) После того, как напишу этот кусок кода, мне необходимо, чтобы все статьи и их названия хранились в БД?
А как это сделать, также необходимо писать сценарий?

Помогите пожалуйста!

Пока я не смогу написать поиск, я не успокоюсь!

А Вам всем, огромное спасибо за помощь!

   
 
 автор: куч1963   (28.06.2006 в 23:00)   письмо автору
 
   для: Vados   (28.06.2006 в 17:49)
 

Сейчас где они хранятся?
По моему ты ищеш в базе, поля проиндексированы, или ты хочешь сделать статистику обращений к документам через поиск?

   
 
 автор: Vados   (29.06.2006 в 00:03)   письмо автору
 
   для: куч1963   (28.06.2006 в 23:00)
 

Привет!
Я не совсем тебя понимаю!
Я сейчас только как пример загнал в БД, пару данных, которыу у меня хранятся в таблице articles.

Там я буду искать по заголовку статьи и по содержанию, мне пока более не нужно!

У тебя есть готовый пример, напиши, буду безумно благодарен! :-))

Только ести можешь, вышли с описанием, так как я в этом новичок! :-))

   
 
 автор: Vados   (29.06.2006 в 21:47)   письмо автору
 
   для: Vados   (29.06.2006 в 00:03)
 

Всем привет!
Мне кто-нибудь поможет?

Прошу очень нужно!

Заранее спасибо!

   
 
 автор: Vados   (30.06.2006 в 17:38)   письмо автору
 
   для: Vados   (29.06.2006 в 21:47)
 

Ребята, но мне кто-нибудь поможет?!

Спасибо!

   
 
 автор: куч1963   (30.06.2006 в 18:16)   письмо автору
 
   для: Vados   (30.06.2006 в 17:38)
 

Я тебе в предыдущем топе кидал скрипт, подставь свои данные столбов и название таблиц и все.

   
 
 автор: Vados   (01.07.2006 в 19:01)   письмо автору
 
   для: куч1963   (30.06.2006 в 18:16)
 

Привет!

Вот моя таблица:


Структура таблицы 'articles'

CREATE TABLE 'articles' (
  'id_article' int(10) unsigned NOT NULL auto_increment,
  'title' varchar(200) default NULL,
  'body' text,
  'datecreate' datetime default NULL,
  'url' varchar(200) default NULL,
  PRIMARY KEY  ('id_article'),
  FULLTEXT KEY 'title' ('title','body')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ;


Дамп данных таблицы 'articles'

INSERT INTO 'articles' ('id_article', 'title', 'body', 'datecreate', 'url') VALUES (1, 'Писательство', 'Всё о писательской жизни', '2006-07-01 17:18:14', NULL),
(2, 'поэзия', 'писательство', '2006-07-01 17:16:30', NULL),
(3, 'Поэзия', 'Всё о поэзии', '2006-07-01 17:16:37', NULL),
(4, 'Проза', 'Всё о прозе', '2006-07-01 17:16:45', NULL),
(5, 'Рассказы', 'Всё о рассказах', '2006-07-01 17:16:52', NULL);


А вот мой код самого сценария:


<? 
  
// Устанавливаем соединение с базой данных 
require_once("config.php"); 
$title="Поиск"
//include "index.php"; 
  // Устанавливаем переменные формы     
  
if (!get_magic_quotes_gpc()) 
  { 
    
$_POST['name'] = mysql_escape_string($_POST['name']); 
  } 
  
$name $_POST['name']; 
  
$srchwhere $_POST['srchwhere']; 
   
?> 
<p><font size="+1" color="#6699CC">Поиск на сайте</font></p> 
<table  width="500" border="0"  cellpadding="5" cellspacing="0"> 
  <form action=search1.php method=post> 
    <tr> 
      <td>Ключевые слова</td> 
      <td><input class="input" type=text name=name value='<?php echo $name?>' size="35"></td> 
    </tr> 
     
    <tr><td>&nbsp;</td><td><input class="vvod" type=submit name=send value=Поиск></td></tr> 
  <input type="hidden" name="scr" value="1"></form> 
</table> 
<?php 

  
if(isset($_POST['scr'])) 
  { 
  if(empty(
$name))     

  echo 
"<DL><DT>Не введено искомое слово 
            <DD>Введите поисковое слово и повторите поиск.</DL>"

            
//include "../util/bottom.php"; 
            
exit(); 

    
$name trim($name); 
   
    
// В зависимости от режима поиска формируем SQL-запрос 
        // Формируем SQL-запрос 
        
$query "select articles.id_article AS id_article, 
                        articles.name AS name, 
                     paragraphes.name AS text, 
                        paragraphes.id_article 
    from articles, paragraphes 
WHERE articles.id_article =  paragraphes.id_article AND  MATCH(paragraphes.name) AGAINST('
$name*' IN BOOLEAN MODE) 
GROUP BY articles.id_article"

      
$post mysql_query($query); 
        if(
$post
        { 
          
$num mysql_num_rows($post); 
          if(
$num>0
          { 
                 echo

              <DL> 
              <DT>По поисковому запросу: "
.$_POST['name'].
              <DD>в разделе <b>статьи</b> число соответствий: 
$num 
              </DL> 
              <DL>"

            while(
$posts mysql_fetch_array($post)) 
            { 
       
             echo 
" <DT><a href=../article/index.php?id_article=".$posts['id_article'].">".$posts['name']."</a><br>"
             
?> 
             <DD>Коротко:<br>...<?= strtok (stristr($posts['text'], $_POST['name']),'.');?><br> 
             <? 
            
}     
                   echo 
"</DL>";        
          } 
          else 
          { 
            echo 
"<DL><DT>По поисковому запросу: ".$_POST['name']." ничего не найдено. 
            <DD>Попробуйте изменить поисковое слово.</DL>"
;     
            exit(); 
          }
      
    } 
    } 
?>


Мне куч1963 кидал данный скрипт, но в нём я многое поубирал, так как мне нужен простенький поиск, без выпадающего меня с возможностью выбора где искать необходимое слово или фразу.
Так вот на основании выше созданной таблицы, я хочу реализовать поиск по:
1) названию статьи
2) содержанию статьи

Я не могу понять, как мне переделать часть в сценарии:


$query = "select articles.id_article AS id_article,
articles.name AS name,
paragraphes.name AS text,
paragraphes.id_article
from articles, paragraphes
WHERE articles.id_article = paragraphes.id_article AND MATCH(paragraphes.name) AGAINST('$name*' IN BOOLEAN MODE)
GROUP BY articles.id_article";


На ту, которая мне подойдёт.

Понимаю, что очень надоел со своими вопросами поиска, но очень хочу разобраться с принципом поиска, буду всем очень благодарен, а особенно: Cheops & куч1963.

   
 
 автор: куч1963   (02.07.2006 в 12:52)   письмо автору
 
   для: Vados   (01.07.2006 в 19:01)
 


$query = "SELECT * FROM articles WHERE MATCH(title) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
        GROUP BY name
        UNION  SELECT * FROM articles WHERE MATCH(body) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
        GROUP BY name"; 


и сделай поле title текстовым а не varchar, поиск идет по текстовым полям

   
 
 автор: Vados   (02.07.2006 в 15:45)   письмо автору
 
   для: куч1963   (02.07.2006 в 12:52)
 

Хорошо, спасибо, но у меня ничего не выводится при поиске, я ничего не понимаю, вот я передал, окончательный вариант скрипта:


<? 
  
// Устанавливаем соединение с базой данных 
require_once("config.php"); 
$title="Поиск"
  
// Устанавливаем переменные формы     
  
if (!get_magic_quotes_gpc()) 
  { 
    
$_POST['name'] = mysql_escape_string($_POST['name']); 
  } 
  
$name $_POST['name']; 
?> 
<p><font size="+1" color="#6699CC">Поиск на сайте</font></p> 
<table  width="500" border="0"  cellpadding="5" cellspacing="0"> 
  <form action=search1.php method=post> 
    <tr> 
      <td>Ключевые слова</td> 
      <td><input class="input" type=text name=name value='<?php echo $name?>' size="35"></td> 
    </tr> 
    <tr><td>&nbsp;</td><td><input type=submit name=send value=Поиск></td></tr> 
  <input type="hidden" name="scr" value="1"></form> 
</table> 
<?php 

  
if(isset($_POST['scr'])) 
  { 
  if(empty(
$name))     

  echo 
"<DL><DT>Не введено искомое слово 
            <DD>Введите поисковое слово и повторите поиск.</DL>"

            exit(); 

        
    
$name trim($name); 
  
        
// Формируем SQL-запрос 
        
$query "SELECT * FROM articles WHERE MATCH(title) AGAINST('$_POST[name]*' IN BOOLEAN MODE) 
        GROUP BY name 
        UNION  SELECT * FROM articles WHERE MATCH(body) AGAINST('
$_POST[name]*' IN BOOLEAN MODE) 
        GROUP BY name"

       
$post mysql_query($query); 
        if(
$post
        { 
          
$num mysql_num_rows($post); 
          if(
$num>0
          {     
          echo

              <DL> 
              <DT>По поисковому запросу: "
.$_POST['name'].
              <DD><b>в статьях</b> число соответствий: 
$num 
              </DL> 
              <DL>"

            
            while(
$posts mysql_fetch_array($post)) 
            { 
                   
             echo 
" <DT><a href=index.php?id_article=".$posts['id_article'].">".$posts['name']."</a><br>"
             
?> 
             <DD>Коротко:<br>...<?= $posts['body'];?> 
             <? 
            
}     
                   echo 
"</DL>";        
          } 
          else 
          { 
            echo 
"<DL><DT>По поисковому запросу: ".$_POST['name']." ничего не найдено. 
            <DD>Попробуйте изменить поисковое слово.</DL>"
;     
            exit(); 
          }
        } 
          }
?>

БД осталась таже, только изменил поле title на текстовый тип, но у меня ничего не выводится из БД при вводе в форму поиска, помогите разобраться!

Я уже 2-е недели с этим вожусь, но пока без результатно!

Заранее спасибо!

   
 
 автор: куч1963   (02.07.2006 в 17:58)   письмо автору
 
   для: Vados   (02.07.2006 в 15:45)
 


<?
  
// Устанавливаем соединение с базой данных
//Здесь у4казываеш свой путь
require_once("admin/config.php");
$title="Поиск";
  
// Устанавливаем переменные формы     
  
if (!get_magic_quotes_gpc())
  {
    
$_POST['name'] = mysql_escape_string($_POST['name']);
  }
  
$name $_POST['name'];
?>
<p><font size="+1" color="#6699CC">Поиск на сайте</font></p>
<table  width="500" border="0"  cellpadding="5" cellspacing="0">
  <form action=poisk.php method=post>
    <tr>
      <td>Ключевые слова</td>
      <td><input class="input" type=text name=name value='<?php echo $name?>' size="35"></td>
    </tr>
    <tr><td>&nbsp;</td><td><input type=submit name=send value=Поиск></td></tr>
  <input type="hidden" name="scr" value="1"></form>
</table>
<?php

  
if(isset($_POST['scr']))
  {
  if(empty(
$name))     
{
  echo 
"<DL><DT>Не введено искомое слово
            <DD>Введите поисковое слово и повторите поиск.</DL>"
;
            exit();
}
        
    
$name trim($name);
  
        
// Формируем SQL-запрос
        
$query "SELECT * FROM art WHERE MATCH(title) AGAINST('$_POST[name]*' IN BOOLEAN MODE)
        GROUP BY title
        UNION  SELECT * FROM art WHERE MATCH(body) AGAINST('
$_POST[name]*' IN BOOLEAN MODE)
        GROUP BY title"
;
       
$post mysql_query($query);
        if(
$post)
        {
          
$num mysql_num_rows($post);
          if(
$num>0)
          {     
          echo
"
              <DL>
              <DT>По поисковому запросу: "
.$_POST['name']."
              <DD><b>в статьях</b> число соответствий: 
$num
              </DL>
              <DL>"
;
            
            while(
$posts mysql_fetch_array($post))
            {
                   
             echo 
" <DT><a href=index.php?id_article=".$posts['id_article'].">".$posts['title']."</a><br>";
             
?>
             <DD>Коротко:<br>...<?= $posts['body'];?>
             <?
            
}     
                   echo 
"</DL>";        
          }
          else
          {
            echo 
"<DL><DT>По поисковому запросу: ".$_POST['name']." ничего не найдено.
            <DD>Попробуйте изменить поисковое слово.</DL>"
;     
            exit();
          }
        }
          }
?> 


CREATE TABLE 'art' (
'id_article' int(10) NOT NULL auto_increment,
'title' tinytext NOT NULL,
'body' tinytext NOT NULL,
'datecreate' datetime NOT NULL default '0000-00-00 00:00:00',
'url' tinytext NOT NULL,
PRIMARY KEY ('id_article'),
FULLTEXT KEY 'title' ('title'),
FULLTEXT KEY 'body' ('body')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=37 ;

так проверил, все работает, проверь версию базы.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования