Сложна заявка към БД. Моля, помощ!

sizif

Registered
Здравейте!

Имам нужда от помощ за заявка към БД:

Правя страница за имоти (аман от тази лудост!), но забих на търсенето, а това май е и основната мъчнотия на подобни сайтове (като изключим хамалогията).

Заявката е за търсене по няколко параметъра, извличани от ХТМЛ форма:
$cenamin и $cenamax за сравняване в полето на БД за цената,
$tip (от падащо меню) - полето за тип на обявата със стойности: продажба/наем - ако не е избрано да търси и за двете
$vid (също падащо меню): вид на имота, също отделна графа в таблицата - ако не е избрано да търси за всички видове
$grad (падащо меню) - поле в таблицата град - пак ако няма стойност да търси за всички градове
и $search - търсене по низ в заглавието на обявата и в съдържанието й.

С формата проблем нямам - получавам си променливите, както трябва.

Ето как се опитах да направя заявката към БД:


$result=mysql_query("SELECT * FROM ads WHERE (cena>='$cenamin') AND (cena<='$cenamax')) AND tip='$tip' AND vid='$vid' AND grad='$grad' AND (zaglavie like '%$search%' OR opis like '%$search%') ORDER BY ref DESC")
or die ("Zaqwkata ne mozhe da se izpylni!");


Организацията на таблицата в БД съм ориентирал към търсенето, така че една променлива от формата да се отнася към едно поле в таблицата.

Търсенето само по низ (в двете полета заглавие и опис) се получава, само по един параметър също мога да го направя (то не е и съвсем търсене, а повече сортиране), но цялата заявка в този (или подобен вид) не успявам да направя. - ПРОБЛЕМ 1

Другия препъни камък (още не съм стигнал до него - засега е хипотетичен, но все пак предстоящ) е, че търсенето може да става и без формата да е изцяло попълнена, т.е. в една заявка (съдържащ всички възможни условия) трябва да прави търсене само по променливите, които имат стойност. - ПРОБЛЕМ 2

Винаги мога да проверя дали една променлива е изпратена и ако да, дали има стойност и в зависимост от това да се включва онази заявка, която ще съдържа в себе си само наличните стойности, но това означава да правя 1001 различни заявки към базата данни в зависимост от комбинациите между променливите ("тука има-тука нема") :(

Другата екзотична идея, която ми хрумна е да направя пълен селект на всички редове в БД и да обработя резултата преди листване с помощта на РНР операторите за сравняване на стойност... При 20 реда в таблицата ще работи, но при 2000?!

Съществува ли някаква възможност да въвеждам някаква стойност на променливата според която търся в БД(константа?) като All, която да означава в заявката, че за въпросното поле в БД се приемат всички възможни стойности?
Или иначе казано (пак се оплетох), какъв е начина да се направи една обща заявка (като неработещата по-горе), съдържаща всички възможни опции за търсене, но вземаща предвид само онези, които имат стойност?

Имате ли идея, как може да стане? Моля, помогнете!

Благодаря предварително!
 

Admin

Registered
sizif. :)

Винаги мислиш "сложно" .

Заявката трябва да ти е:

Код:
$select = "SELECT * from  ads ".$sql ." ORDER BY ref ASC $limit";

:)


В зависимост от това какво е
направил потребителя и ти си обработил неговото търсене си присвоил
стойност на променливата $sql .

Примерно:

if(is_numeric($_GET['max_kvadratura'] ))
{
$cenamax=$_GET['max_kvadratura'] ;

$sql=$sql." AND (cena<='$cenamax'))";
$proverka=1;

}

Променливата $prowerka я слагам, защото трябва
по нещо да следиш дали да има and примерно.
Ако това е първото условие изпълнено ще се наложи да сложиш и where.

Ти ще разбереш какво ти говоря.
 

sizif

Registered
Благодаря, Админ! :)

Пак се включваш навреме!

Мисля, че схванах, но не съвсем. Ще пробвам, ако не съм разбрал, ще питам пак ;)
 

Admin

Registered
sizif каза:
Благодаря, Админ! :)

Пак се включваш навреме!

Мисля, че схванах, но не съвсем. Ще пробвам, ако не съм разбрал, ще питам пак ;)

Схванал си. :)
 

sizif

Registered
Благодаря ти много, Админ, получи се! :)

Ето кода, който направих по твоя приемр (ако на някой му трябва):

if(is_numeric($_POST['cenamin'] ))
{
$cenamin=$_POST['cenamin'];
$sql=" cena>='$cenamin'";
}
else
{
$cenamin=0;
$sql=" cena>='$cenamin'";
}

if(is_numeric($_POST['cenamax'] ))
{
$cenamax=$_POST['cenamax'];
$sql=$sql." AND cena<='$cenamax'";
}

if (!empty($_POST['tip']))
{
$tip=$_POST['tip'];
$sql=$sql." AND tip='$tip'";
}

if (!empty($_POST['vid']))
{
$vid=$_POST['vid'];
$sql=$sql." AND vid='$vid'";
}

if (!empty($_POST['grad']))
{
$grad=$_POST['grad'];
$sql=$sql." AND grad='$grad'";
}

if (!empty($_POST['search']))
{
$search=$_POST['search'];
$search=str_replace(" ","",$search);
$sql=$sql." AND zaglavie like '%$search%' OR opis like '%$search%'";
}


$result=mysql_query("SELECT * FROM ads WHERE ".$sql." ORDER BY ref DESC")
or die ("Zaqwkata ne mozhe da se izpylni!");

Отказах се от допълнителната променлива за AND - сетих се, че минималната цена може винаги да влиза в заявката (или е някаква стойност или 0 на което всички обяви отговарят), затова я сложих на първо място, всички следващи са с AND....

Админ, за пореден път ми помагаш!
 

Горе