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

Форум MySQL

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

 

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

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

тема: Поиск данных из базы
 
 автор: Ozxar   (11.12.2004 в 16:22)   письмо автору
 
 

Как написать скрипт поиска по базе?

   
 
 автор: elenaki   (11.12.2004 в 17:22)   письмо автору
 
   для: Ozxar   (11.12.2004 в 16:22)
 

как раз сейчас этим занимаюсь. надо знать структуру таблицы, по которой собираетесь искать. имена полей, их тип. поиск будет простой - одно текстовое поле для ввода запроса? или сложный - по многим критериям или по нескольким таблицам?

я делаю так. первым делом обрабатываю запрос пользователя:
обрезаю ненужные пробелы, перевожу все слова в один регистр, убираю специальные символы, чтобы база не выдала ошибку, потом убираю двойные пробелы, которые могут появиться после операций удаления.
потом проверяю, какие дополнительные условия поиска ввел пользователь. если в запросе не одно слово, а больше, можно предложить искать любое слово или фразу целиком, если выбрана тема сайта, то поиск производится только в выбранной теме, если выбран еще и интервал дат, то только в этом интервале.

запрос к базе строится динамически, в зависимости от условий, которые выбрал пользователь. если нужно искать любое слово, запрос разбивается на слова и поиск производится в цикле, равном числу слов (при этом можно поставить ограничение на поиск только слов > 3 букв, чтоб не отвлекаться на предлоги). результат я заношу во временную таблицу. потом из нее методом DISTINCT выбираю уникальные значения, отвечающие остальным условиям, если они заданы.

могу приложить скрипт. только его все равно надо будет переделывать для вашей базы.

   
 
 автор: Ozxar   (11.12.2004 в 17:56)   письмо автору
 
   для: elenaki   (11.12.2004 в 17:22)
 

давай посмотрю

   
 
 автор: elenaki   (11.12.2004 в 18:25)   письмо автору
 
   для: Ozxar   (11.12.2004 в 17:56)
 

вот. смотри.
<? require ("dbconnect.inc.php");
function 
mysql_datetime_to_timestamp($dt) {   
    
$yr=strval(substr($dt,0,4));   
    
$mo=strval(substr($dt,5,2));   
    
$da=strval(substr($dt,8,2));   
    
$hr=strval(substr($dt,11,2));   
    
$mi=strval(substr($dt,14,2));   
    
$se=strval(substr($dt,17,2));   
    return 
mktime(0,0,0,$mo,$da,$yr);   
    } 

//require ("utils.inc.php");
require ("interface_start.inc.php");
?>
<tr><td>
<table align="center" cellspacing="2" cellpadding="0" border="0" width="100%">
<tr>
<? 
echo $text."<br>".$thema
mysql_query("DROP TABLE vrem"); // obnulyaem vremennuyu tablicu
$words trim($words);//obrezaem probeli
$qu2 strtolower($words);//ubiraem zaglavnwe bukvw
$qu2 chop($qu2);//ubiraem lishnee probeli
$qu2eregi_replace ('[.?,!()#":;|]'''$qu2); //ubiraem lishnii simvoli
while (stristr($qu2"  ")) $qu2 str_replace("  "" "$qu2);//ubiraem dvoyinwe probelw

// sozdaem vremennuyu tablicu 
   
mysql_query("CREATE TABLE vrem ( 
  'id' varchar(11) NOT NULL default '',
  'datestamp' varchar(12) NOT NULL default '',
  'number' varchar(100) NOT NULL default '',
  'categ' varchar(10) NOT NULL default '',
  'headline' varchar(250) NOT NULL default ''
   ) TYPE=HEAP;"
) or die (mysql_error());
//razbivaem zapros na slova
    
$words explode(' '$qu2);
    
// preobrazovanie dat
    
$d explode("-",$apo); 
    
$apo mktime("","","",$d[1],$d[0],$d[2]);
    
$dd explode("-",$mexri); 
    
$mexri mktime("","","",$dd[1],$dd[0],$dd[2]);
    
$query1 =  " SELECT * FROM nomoi";//osnovnoyi zapros
        
for ($q=0$q<count($words); $q++): // nachalo cikla perebora slov zaprosa
    
    
if ($cond == "lexi") {$poisk $words[$q];} // ischem slovo
    
if ($cond == "phrase") {$poisk $qu2;}    // ischem frazu
    
            
if (strlen($poisk)>3): // esli est' slovo i slovo > 3 znakov, delaem 
            
$query1 "SELECT * FROM nomoi where 
            date like '%
$poisk%' or 
            number = '
$poisk' or 
            headline like '%
$poisk%' or
            keywords like '%
$poisk%' or
            text like '%
$poisk%'";
            endif; 
// konec proverki na dlinu slova
            
$result1 MYSQL_QUERY($query1); // delaem zapros
$number1=mysql_numrows($result1);
    if (
$number1 == 0// slovo ne nashli
    
{print "<TR><TD class=t bgColor=#ffffff><b>";
    echo 
$poisk." &#228;&#229; &#226;&#241;&#221;&#232;&#231;&#234;&#229;.</td></tr>";
    }
    else 
// esli nashli slovo
    
{for ($i=0$i $number1$i++)
         {
         
$id mysql_result($result1,$i,"id");
         
$art_number mysql_result($result1,$i,"number");
         
$headline mysql_result($result1,$i,"headline");
         
$categ mysql_result($result1,$i,"categ");
         
$date mysql_result($result1,$i,"date");
         
$datestamp date_to_datestamp($date);
         
$headline stripslashes($headline);
// zanosim vo vrem tablicu
$query2 =   "insert into vrem (id, datestamp, number, headline, categ) values ('$id', '$datestamp', '$art_number','$headline', '$categ')"
$result2 mysql_query($query2);
           }
    }            
endfor;
// konec cikla perebora slov zaprosa
// vibiraem iz vremennoy tablicw (osnovnoy zapros)

$query3 =  "SELECT DISTINCT id,number,datestamp,headline FROM vrem ";
    
// uto4niaem zapros po drugim usloviyam
    
if ($category !== ""$poteme " categ = $category ";// poisk i po teme
    
else {$poteme "";}// ne nado po teme
    
    
if ($apo != -1// data nachala ne vibrana
    
{$podate " (datestamp > $apo AND datestamp < $mexri) ";}
    else 
$podate ""// ne nado po date
    
    
if ($poteme !== "" || $podate !== ""$usl1 " where ";
    if (
$poteme !== "" && $podate !== ""$usl2 " AND ";
    
$query3 .= $usl1.$poteme.$usl2.$podate." order by datestamp DESC"// polniy zapros
    //echo $query3;

        
$result3 MYSQL_QUERY($query3);
        
$number3=mysql_numrows($result3);
        
        if (
$number3 == 0// slovo ne nashli
        
{print "<TR><TD class=t bgColor=#ffffff><b>";
        echo 
$poisk." &#228;&#229; &#226;&#241;&#221;&#232;&#231;&#234;&#229;.</td></tr>";
        }
        else 
// esli nashli slovo
        
{
        for (
$i=0$i $number3$i++)
        {
        
$id mysql_result($result3,$i,"id");
        
$art_number mysql_result($result3,$i,"number");
        
$headline mysql_result($result3,$i,"headline");
        
$date mysql_result($result3,$i,"datestamp");
        
$datestamp date_to_datestamp($date);
        
$headline stripslashes($headline);
        
// vivod nazvania i dati stat'i
        
echo"<TR><TD class=t bgColor=#ffffff><p align=justify><b>".
        
strftime("%d/%m/%Y"$date)." - <a href=\"viewnews.php?article=$id\" target=_self>N: $art_number - $headline</a></b></p></td></tr>";
        }
    }
?>
</table>
<br><br>
<?
require ("interface_end.inc.php");
?>

   
 
 автор: cheops   (11.12.2004 в 22:19)   письмо автору
 
   для: Ozxar   (11.12.2004 в 16:22)
 

А что ищем? Числа, строки?

   
 
 автор: Ozxar   (12.12.2004 в 22:01)   письмо автору
 
   для: cheops   (11.12.2004 в 22:19)
 

исчем все что потребует пользователь

   
 
 автор: cheops   (12.12.2004 в 22:46)   письмо автору
 
   для: Ozxar   (12.12.2004 в 22:01)
 

Хм... ну для того, чтобы реализовать поиск следует знать структуру таблицы: сколько и какие поля она содержит, по каким поиск следует осуществлять (описание, цены и т.п.), а по каким нет (первичные и вторичные ключи).

   
Rambler's Top100
вверх

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