PHP Search, GET or POST ?

_4efo_

Registered
Здравейте,

опитвам се да направя добра търсачка, но имам един съществен проблем...


HTML формата ми изглежда така :
HTML:
<form name="search" action="search.php" method="GET">

няколко IMPUT 

</form>

PHP страницата ми за търсене изглежда така :
PHP:
$cat = $_GET['cat'];
$key = $_GET['key'];
 $chapter = $_GET['chapter'];
 
	
 

if($chapter)
{
	$condition []= "chapter = '$chapter'";
	$value []= "$chapter ";
}
if($chapter)
 
 
if($cat)
{
	$condition []= "category = '$cat'";
	$value []=  "$cat ";
}

if($key)
{
	$condition []= "(description LIKE '%$key%' or name LIKE '%$key%' or  code = '$key' )";
	$value []=  "$key ";
}



 

$query = "SELECT * FROM products WHERE ".implode(" AND ", $condition)." ORDER BY pa ASC LIMIT 100";
 
 
$result = mysql_query($query);

if(mysql_num_rows($result) == 0) {echo"<h1>Няма намерени резултати</h1>";}
else {

echo"<h1>Резултати от търсенето   </h1>   ";

while($row = mysql_fetch_array($result)) { 

...
}


надявам се, че е написано читаво и се разбира какво точно правя...
но проблем ми създата сленото...

когато задам само един IMPUT примерно КЕY

ме препаща към : search.php?cat=&chapter=&key=BLA+BLA


и по този начин влзиам във всички if и съответно масива $condition []

приема всички променливи...


Как мога да избегна това ? Според мен е в method-a ... надявам се някой да помогне :)

Благодаря предварително! :)
 
Ами подавай на всички полета стойности по подразбиране. След като пратиш заявката, проверявай тези стойности поотделно(вложени if-ове)

PHP:
if(...){
     if(...){
           if(...){
                 //...
           }
     }
}

и вече според това, какво ти е зададено и незададено изпълнявай кода.
 
if ($cat) ---> if($cat and strlen($cat)>0)

но смятам че GET за търсене не много добре защото има ограничение в дължината на подаваните данни (виж в документацията на HTTP 1.0) - мисля че общата дължина на URL беше max 1024 символа, а ако си на UTF-8 става доста тясно. По-добре формата я подавай с POST, а чети данните не с $_POST['key'], а с $_REQUEST['key'] - така ще поддържаш търсене през URL, но самият ти скрипт няма да е ограничен до 1024 символа за търсене.
 
това не е много добър начин за търсачка, вместо да ползваш like, употребявай

Код:
MATCH(title,text) AGAINST('$search' IN BOOLEAN MODE)
, защо го правиш с гет, като може да е с пост
 
embaka каза:
това не е много добър начин за търсачка, вместо да ползваш like, употребявай

Код:
MATCH(title,text) AGAINST('$search' IN BOOLEAN MODE)
, защо го правиш с гет, като може да е с пост

Пост за търсене не се ползва от много време.

@_4efo_, какво ще стане ако отворя търсенето така?

http://site.com/search.php

Заявката ще изглежда така:

[sql]SELECT * FROM products WHERE ORDER BY pa ASC LIMIT 100[/sql]

След като линка е така: search.php?cat=&chapter=&key=BLA+BLA

Трябва да е само в кондиция с $key, другите са с null което значи, че другите не трябва да ги има.
 
Този РНР код:
PHP:
if($chapter)

всъщност е съкратения вариант на:
PHP:
if(isset($chapter))

Затова влизаш във всички условия - сетнато е, имаш стойност на $chapter, защото празната стойност също е стойност.

Това, което ти трябва е:
PHP:
if(!empty($chapter))

Предложението за "match ... against" работи само ако полето върху което търсиш има fulltext index и освен това трябва да имаш доста записи в таблицата. Ако имаш по-малко от 3-4 записа, които съвпадат със заявката, може и да не получиш резултат!

Разликата между GET и POST? Лесно е - използваш GET когато трябва да изкараш някаква информация от базата данни (GET me some data out of the database), POST използваш когато добавяш нещо в базата данни.

Този код тук:
PHP:
$cat = $_GET['cat'];

$key = $_GET['key'];

 $chapter = $_GET['chapter'];

няма особен смисъл, освен ако не правиш някакъв вид филтриране, например ако cat и chapter са числа:

$cat = (int) $_GET['cat'];

за да си сигурен, че имаш число.
 
Много благодаря на всички ви!

Определено мисля, че това което казва exec е точно това което ми трябва и на мен...

jooorooo и за мен е странно :) но пробвах какво ли не, докато не измисля начин за хубаво търсене...


Благодаря още веднъж на всички :)

Надявам се, че темата ще е полезна и за други
 

Back
Горе