Проблем с търсачка и LIKE в заявката...

t0m3kk

Registered
Здравейте, преди малко седнах и си направих 1 търсачка, която търси записи в MySQL база данни, но имам малък проблем.
Проблема е в това, че когато това, което търся е от една дума намира всичко както трябва, но когато добавя 2 думи (разделени с " " (интервал)) не работи :?

Ето и кода, който съм написал:
Код:
<?php
header("Content-Type: text/html; charset=UTF-8");

$host = "хост";
$user = "потребител";
$pass = "парола";
$db = "база-данни";

$conn = mysql_connect($host, $user, $pass) or die("Грешка 1!");
mysql_select_db($db) or die("Грешка 2!");
mysql_query("SET CHARACTER SET utf8", $conn);

echo "<form action=\"search.php\" method=\"post\">
<input type=\"text\" name=\"find\" size=\"30\" /><br />
<input name=\"submit\" type=\"submit\" value=\"Търси\" />
</form>";

if(isset($_POST['submit'])) {
$find = htmlspecialchars(addslashes($_POST['find']));

$result = mysql_query("SELECT * FROM `news` WHERE `title` LIKE '%$find%' ORDER BY id DESC") or die('Грешка 3!');
$results = mysql_num_rows(mysql_query("SELECT * FROM `news` WHERE `title` LIKE '%$find%' ORDER BY id DESC")) or die('Грешка 4!');
if($results < 1) {
echo "няма резултати";
}

while($row = mysql_fetch_array($result)) {
$count2 = mb_strlen($row['content'], "UTF-8");
$content = mb_substr($row['content'], 0, 100, "utf-8")."...";
echo "
	ID: ".$row['id']."  <a href=\"news.php?id=".$row['id']."\">Новина: ".$row['title']."</a> Съдържание: $content<br />
	";
}
echo "<br />Има $results резултата!";
}
?>

Не, че има голямо значение, но файла news.php го направих само за теста и представлява това:
Код:
<?php
header("Content-Type: text/html; charset=UTF-8");

$host = "хост";
$user = "потребител";
$pass = "парола";
$db = "база-данни";

$conn = mysql_connect($host, $user, $pass) or die("Грешка 1!");
mysql_select_db($db) or die("Грешка 2!");
mysql_query("SET CHARACTER SET utf8", $conn);

$id = $_GET['id'];

$result = mysql_query("SELECT * FROM `news` WHERE `id`='$id'") or die('Грешка 3!');
$row = mysql_fetch_array($result);

echo "
	<b>Заглавие:</b> ".$row['title']."<br /><br />
	<b>Съдържание:</b> ".$row['content']."
	";

?>

та ако някой може да помогне, ще съм благодарен, защото за първи път правя такова нещо като търсачка и общо взето я правя от интерес...
btw някъде из форума преди бая време пак в една тема за търсачка бях чел, че е хубаво да се слага RLIKE вместо LIKE, но с RLIKE не извежда никакви резултати...

Поздрави :)
 
Replace каза:
Пробвай с MATCH/AGAINST, или поне разделяй думите с explode() и ги търси поотделно
WHERE text LIKE '%$duma1%' OR text LIKE '%$duma2%'

С Match/Against нещо не можах да го наглася и не работи както трябва, а когато го направя с:
WHERE text LIKE '%$duma1%' OR text LIKE '%$duma2%'
изкарва всичките резултати, които имам в базата данни... :idea:
 
t0m3kk каза:
Replace каза:
Пробвай с MATCH/AGAINST, или поне разделяй думите с explode() и ги търси поотделно
WHERE text LIKE '%$duma1%' OR text LIKE '%$duma2%'

С Match/Against нещо не можах да го наглася и не работи както трябва, а когато го направя с:
WHERE text LIKE '%$duma1%' OR text LIKE '%$duma2%'
изкарва всичките резултати, които имам в базата данни... :idea:
На мястото на text - duma1, duma2 сложи ли твойте променливи?
 
ExpressYourself каза:
t0m3kk каза:
Replace каза:
Пробвай с MATCH/AGAINST, или поне разделяй думите с explode() и ги търси поотделно

С Match/Against нещо не можах да го наглася и не работи както трябва, а когато го направя с:
WHERE text LIKE '%$duma1%' OR text LIKE '%$duma2%'
изкарва всичките резултати, които имам в базата данни... :idea:
На мястото на text - duma1, duma2 сложи ли твойте променливи?

да, нагласих си ги така:
Код:
$find = htmlspecialchars(addslashes($_POST['find']));
$find = explode(" ", $find);

$result = mysql_query("SELECT * FROM `news` WHERE `title` LIKE '%".$find['0']."%' OR `title` LIKE '%".$find['1']."%' ORDER BY id DESC") or die('Грешка 3!');
$results = mysql_num_rows(mysql_query("SELECT * FROM `news` WHERE `title` LIKE '%".$find['0']."%' OR `title` LIKE '%".$find['1']."%' ORDER BY id DESC")) or die('Грешка 4!');

като във втората заявка дава грешка при броенето в смисъл die("Грешка 4!);
 
И аз имах същият проблем и го "реших" като го заобиколих. Направил съм го така - с малко PHP код оформям заявката да търси най-напред съвпадение на целия израз, после за всяка дума от израза. И понеже или MySQL трудно се оправя с кирилицата или (по-вероятно) аз не мога да го настроя да се оправя, резултатите ги филтрирам повторно със stristr(). Резултата можеш да видиш тук.

Моля, бъдете снизходителни - по тази търсачка има още много работа за да се доближи до това, което трябва да е.
 
и к'фо ?! искате да кажете, че никой не знае как да се направи търсачка, която да работи с повече от 1 дума ли ?!
 
t0m3kk каза:
Replace каза:
SELECT * FROM `news` WHERE MATCH (`title`) AGAINST ('$find' IN BOOLEAN MODE);

ами пак не работи с повече от една дума и на всичкото отгоре не работи с думи от 3 и 4 символа :(
http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
Note

In implementing this feature, MySQL uses what is sometimes referred to as implied Boolean logic, in which

*

+ stands for AND
*

- stands for NOT
*

[no operator] implies OR
Замени празното пространство с плюс.
 
работи с 2 думи, но пък не иска с по-кратки от 3-4 символа... (за кода на Replace говоря, а за това с "+" на празните места - пак не иска за тези по-кратките от думи
 

Back
Горе