Проблем с търсачка

Blackmailer

Registered
Всичко работи както трябва просто, когато напиша ключовите думи така:

" web-tourist" - с интервал отпред ми се извеждат всички новини от базата данни, а не тези, които съдържат ключовата дума web-tourist.
 
Дай mysql заявката, с която взимаш редовете(+няколко реда преди нея)... без нея нищо не можем да ти кажем :)
 
PHP:
 $keywords = $_POST['keywords'];
				
				$keywords = addslashes($keywords);
				
				$terms = explode(" ", $keywords); 
			
				$query_search = "SELECT id, title, DATE_FORMAT(date, '%d.%m.%Y %H:%i') AS formatted_date, image, text, author, views, catid FROM articles WHERE ";
				
				$i = 0;
				
				foreach ($terms as $each)
				{
					$i++;
					
					if ($i == 1)		
					{
						$query_search = $query_search."keywords LIKE '%$each%' ";
					}
					
					else 
					{
						$query_search = $query_search."OR keywords LIKE '%$each%' ";		
					}
				} 
				
				$each = addslashes($each); 
				
				$query_search = $query_search."ORDER BY id DESC";      	   
                   
				$query_search = mysql_query($query_search) ;
				$num_rows = mysql_num_rows($query_search);
				
				if (!$terms || !$each)
					{
						echo 'Не сте въвели ключови думи за търсене.';
						exit;
					}
				
				if ($terms == " ".$keywords || $each == " ".$keywords)
					{
						echo 'Няма намерени резултати.';
						exit;
					}
 
Третия ред (където ползваш explode) ред го направи така:

PHP:
$terms = preg_split('/\s+/', $keywords);
 
Blackmailer каза:
няма промяна
Тогава дай
Код:
var_dump($terms);
веднага след preg_split-a и постни какво ти връща. Би трябвало да са думите, с които си търсил? :idea:

И точно преди реда с mysql_query($search_query) дай
Код:
print_r($query_search);
И постни какво ти връща.
 
array(2) { [0]=> string(0) "" [1]=> string(12) "банда" } SELECT id, title, DATE_FORMAT(date, '%d.%m.%Y %H:%i') AS formatted_date, image, text, author, views, catid FROM articles WHERE keywords LIKE '%%' OR keywords LIKE '%банда%' ORDER BY id DESC
 
Тогава ползвай trim(), за да махнеш празните разстояния в краищата на низа.
Код:
$terms = preg_split('/\s+/', trim($keywords));

Кодът трябва да ти изглежда така:

PHP:
$keywords = $_POST['keywords'];
$keywords = addslashes($keywords);                                
$terms = preg_split('/\s+/', trim($keywords));
$query_search = ........
.....

(Ако дава същия резултат, какви ключови думи си използвал: " банда" с интервал отпред ли?)
 
PHP:
function clear_space($strVar)
	{
		$strVar = preg_replace('/\s\s+/', ' ', $strVar);
		return $strVar;
	}
	
	function search_array($strVar)
	{
		$arrSearch = array();
		$strVar = clear_space(trim(addslashes($strVar)));
		$strVar = explode(" ", $strVar);
		
		foreach($strVar as $stringVar)
		{
			if($stringVar == true)
			{
				$arrSearch[] = $stringVar;
			}
		}
		
		return $arrSearch;
	}
	
	$keywords = $_POST['keywords'];
    $arrSearch = search_array($keywords);

от една две функций глава не боли

и като сме на темата
PHP:
$terms = preg_split('/\s+/', trim($keywords));

преди време ми даде грешка на уиндоус 98, грешката е пречупване на информация на една единствена буква : главно "Р" на килица...
за да няма проблеми трябва
PHP:
$terms = preg_split('/\s\s+/', trim($keywords));
 
stankata90 каза:
PHP:
...

от една две функций глава не боли

и като сме на темата
PHP:
$terms = preg_split('/\s+/', trim($keywords));

преди време ми даде грешка на уиндоус 98, грешката е пречупване на информация на една единствена буква : главно "Р" на килица...
за да няма проблеми трябва
PHP:
$terms = preg_split('/\s\s+/', trim($keywords));
Не е вярно.
Направи следната елементарна проверка:

PHP:
<?php
$keywords = "eriouhg io\toie   owej voiaj   oig roi jgo\nier irewo  er efewr";
$terms = preg_split('/\s\s+/', trim($keywords));
print_r($terms);
?>
Ето го и резултата:
Array
(
[0] => eriouhg io oie
[1] => owej voiaj
[2] => oig roi jgo
ier irewo
[3] => er efewr
)
както виждаш всеки елемент съдържа няколко думи :twisted: :P
А сега ще ти кажа защо: \s означава някакво празно пространство (едно на брой!) - нов ред, спейс, табулация...
\s+ означава поне едно такова.
Когато ги сложиш едно до друго - \s\s+ - ще матчне с поне два "празни" символа. Затова един спейс няма да бъде отчетен в проверката :?:

Ако може да дадеш пример, в който не е така?
Windows 98 вече е доста стар, никой не го използва, може да е било бъг?
 
Съвсем възможно е да е бъг... там съм използвал PHP 4. Нямам възможност да изнамеря тогавашните скриптове. Но си го спомням проблема, даже имаше някакви проблеми с ANSI-то на документите че половината функций не бачкаха. 8)
 

Back
Горе