dennism
dennism

Reputation: 513

How to search a column within a mysql table using multiple keywords from an array?

I am trying to make a search function for my database that refines the search with each additional keyword.

I don't want to limit it to a fixed number of keywords so I use a foreach() loop to extend the sql by another AND column LIKE ? for each keyword.

However the array-binder loop produces different results than using other methods that should do the exact same thing.

My table contains 1 column and 3 rows : "a b c", "b c", "1 2 3".

$Keywords = array("a","b","c"); //those search keywords should only apply to the first row
$sql = "SELECT * FROM table WHERE column LIKE ?";

foreach ($Keywords as $Keyword) {

    if ($count > 0) {       
        $sql = $sql . "AND column LIKE ?";
    }
    $count = $count + 1;
}
$query = $con->prepare($sql);

//loop to bind parameters
foreach ($Keywords as $n=>$Keyword) {
    $Keyword = "%".$Keyword."%";                                
    $query->bindParam($n+1,$Keyword,PDO::PARAM_STR);
}
$query->execute;

This will return the rows a b c and b c although it should only return the row that contains all 3 strings: a , b and c.

If I don't use a loop to bind the parameters (which limits the number of keywords) it does what is is supposed to and only shows "a b c".

        $a = "%a%";
        $b = "%b%";
        $c = "%c%";
        $query->bindParam(1,$a,PDO::PARAM_STR);
        $query->bindParam(2,$b,PDO::PARAM_STR);
        $query->bindParam(3,$c,PDO::PARAM_STR);

It also works If I just execute this :

$sql = "SELECT * FROM table WHERE column LIKE '%a%' AND column LIKE '%b%' AND column LIKE '%c%'";

Upvotes: 3

Views: 1107

Answers (1)

FuzzyTree
FuzzyTree

Reputation: 32392

The working examples use the % wildcard but your looped values don't.

Change

$Keywords = array("a","b","c");

to

$Keywords = array("%a%","%b%","%c%");

or another solution is to add the wildcards in the bindParam call

foreach ($Keywords as $n=>$Keyword) {                               
   $query->bindParam($n+1,"%$Keyword%",PDO::PARAM_STR);
}

Another potential issue is that your constructed query doesn't have a space between ? and AND i.e.

SELECT * FROM table WHERE column LIKE ?AND column LIKE ?AND column LIKE ?

Although I'm not sure if a missing space after the ? is illegal, I recommend padding your AND condition with spaces

$sql = $sql . " AND column LIKE ? ";
               ^                 ^

Upvotes: 1

Related Questions