| |
|
|
| | Как написать скрипт поиска по базе? | |
| |
|
|
| |
|
|
| |
для: Ozxar
(11.12.2004 в 16:22)
| | | как раз сейчас этим занимаюсь. надо знать структуру таблицы, по которой собираетесь искать. имена полей, их тип. поиск будет простой - одно текстовое поле для ввода запроса? или сложный - по многим критериям или по нескольким таблицам?
я делаю так. первым делом обрабатываю запрос пользователя:
обрезаю ненужные пробелы, перевожу все слова в один регистр, убираю специальные символы, чтобы база не выдала ошибку, потом убираю двойные пробелы, которые могут появиться после операций удаления.
потом проверяю, какие дополнительные условия поиска ввел пользователь. если в запросе не одно слово, а больше, можно предложить искать любое слово или фразу целиком, если выбрана тема сайта, то поиск производится только в выбранной теме, если выбран еще и интервал дат, то только в этом интервале.
запрос к базе строится динамически, в зависимости от условий, которые выбрал пользователь. если нужно искать любое слово, запрос разбивается на слова и поиск производится в цикле, равном числу слов (при этом можно поставить ограничение на поиск только слов > 3 букв, чтоб не отвлекаться на предлоги). результат я заношу во временную таблицу. потом из нее методом DISTINCT выбираю уникальные значения, отвечающие остальным условиям, если они заданы.
могу приложить скрипт. только его все равно надо будет переделывать для вашей базы. | |
| |
|
|
| |
|
|
| |
для: elenaki
(11.12.2004 в 17:22)
| | | давай посмотрю | |
| |
|
|
| |
|
|
| |
для: 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
$qu2= eregi_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." äå âñÝèçêå.</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." äå âñÝèçêå.</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");
?>
|
| |
| |
|
|
| |
|
|
| |
для: Ozxar
(11.12.2004 в 16:22)
| | | А что ищем? Числа, строки? | |
| |
|
|
| |
|
|
| |
для: cheops
(11.12.2004 в 22:19)
| | | исчем все что потребует пользователь | |
| |
|
|
| |
|
|
| |
для: Ozxar
(12.12.2004 в 22:01)
| | | Хм... ну для того, чтобы реализовать поиск следует знать структуру таблицы: сколько и какие поля она содержит, по каким поиск следует осуществлять (описание, цены и т.п.), а по каким нет (первичные и вторичные ключи). | |
| |
|
|
|