I have the following code:
function av_connections_search($string){
global $wpdb;
// remove url parameter from string
$string = trim($string,'s=');
$search = explode('%20',$string);
// query the wp_connections database table according to search entry
$sql = "
SELECT *
FROM {$wpdb->prefix}connections
WHERE contact_first_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
";
// prepare() to prevent sql injection
$query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $search));
// get query results
//var_dump($query);
$results = $wpdb->get_results($query);
// return if no results
if(empty($results)){
return false;
}
// flush $wpdb cache
$wpdb->flush();
// return data to search.php
return $results;
}
where $string
looks like ?s=search+these+terms when passed to the function
My question, how can I use multiple WHERE statements? I've tried simply:
WHERE contact_first_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
OR contact_last_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
but it fails completely. When I do:
WHERE contact_first_name OR contact_last_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
it only returns contact_last_name
. What am I missing?
EDIT: Ok, so I'm quite sure the problem lies within this:
$query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $search));
but, for a lack of sleep I cannot wrap my mind around why it's not merging the array with both WHERE clauses.
EDIT 2 Should this not work? It works great if I use the single WHERE clause, but the moment I use OR and another clause, it returns nothing, which makes no sense because this is the query:
SELECT * FROM wp_connections WHERE
contact_first_nameIN (%s, %s) OR
contact_last_nameIN (%s, %s) " [1]=> string(4) "Mina" [2]=> string(5) "Morse"
EDIT 3 I do not believe prepare() is the problem. Consider this (doesn't work):
global $wpdb;
$string = trim($string,'s=');
$search = explode('%20',$string);
$how_many = count($search);
$placeholders = array_fill(0, $how_many, '%s');
$format = implode(', ', $placeholders);
$query = "SELECT * FROM wp_connections WHERE contact_first_name IN($format) OR contact_last_name IN($format)";
$results = $wpdb->query($query, $search);
return $results;
Even removing prepare completely, same result. What am I missing? If I remove the OR
condition and just check one value, it works fine, but OR kills the query.
EDIT 4 It turns out this was the solution:
$results = $wpdb->query($query, $search, $search);
I was missing the second $search variable... *scratching head still