hossein ahmadi
hossein ahmadi

Reputation: 39

PHP MySqli Multiple Keyword Search

I use ajax search in my site. The user can search through homes. I want to enable user to do an exact search with exactly the keywords he wants. But the my problem is I don't know from what the user types how many keywords I can search. This is my query:

$query = "Select a.*,c.name as agent_name,d.country_name,e.state_name,g.city from #__osrs_properties as a"
                                ." inner join #__osrs_agents as c on c.id = a.agent_id"
                                ." inner join #__osrs_types as f on f.id = a.pro_type"
                                ." inner join #__osrs_categories as j on j.id = a.category_id"
                                ." inner join #__osrs_countries as d on d.id = a.country"
                                ." inner join #__osrs_states as e on e.id = a.state"
                                ." inner join #__osrs_cities as g on g.id = a.city"
                                ." where a.approved = '1' and a.published = '1' and a.category_id = '$category->id' and (";
                        //

                        $newKeyword = explode(" ",$keyword);    
                        $query1="j.category_name like '%$newKeyword[0]%' and f.type_name like '%$newKeyword[1]%' and  g.city like '%$newKeyword[2]%'";

it works but when user only types 3 keywords and no more.

Upvotes: 1

Views: 436

Answers (4)

Vladimir Bashkirtsev
Vladimir Bashkirtsev

Reputation: 1354

The best option is not to try to re-invent the wheel and just use FULLTEXT index in MySQL. Then just prepend all your keywords with + (plus sign) and search by normal SELECT . MySQL will take care of your keywords mix regardless of order and regardless of field size in your database.

Upvotes: 0

Sachin Talan
Sachin Talan

Reputation: 11

For getting exact result you should use regular expression in query

$query1="j.category_name REGEXP '$newKeyword[0]' and f.type_name REGEXP '$newKeyword[1]' and g.city REGEXP '$newKeyword[2]'";

Upvotes: 0

William_Wilson
William_Wilson

Reputation: 1264

You will need to somehow know what the user's are supplying. E.g. what fields you want to match. Right now, you assume the keywords are in a certain order, but is that guaranteed? I suspect not if you can't be sure the user will supply all 3.

I would suggest breaking up the keywords into fields that can be determined and apply them individually to the query. Otherwise it will be impossible to know which of the 3 keywords was supplied.

Also you will want to sanitize the user supplied values to prevent malicious injection.

Upvotes: 0

Umar A.
Umar A.

Reputation: 11

use OR instead of AND

$query1 = "j.category_name like '%$newKeyword[0]%' OR f.type_name like '%$newKeyword[1]%' OR g.city like '%$newKeyword[2]%'";

I hope it will help you.

Upvotes: 1

Related Questions