I've used the following method to search for one single value in one single column.
/**
* @param array $searchArray
* @return array
*/
private static function returnPetSearchResults(array $searchArray): array
{
global $wpdb;
$qry = "SELECT ID
FROM {$wpdb->pets}
WHERE softDelete = 0
AND isAdopted = 0";
$parameters = [];
if ($searchArray['status'] !== '') {
$qry .= " AND status = %d";
$parameters[] = $searchArray['status'];
}
if ($searchArray['type']) {
$qry .= " AND type = %d";
$parameters[] = $searchArray['type'];
}
if ($searchArray['size']) {
$qry .= " AND size = %d";
$parameters[] = $searchArray['size'];
}
if ($searchArray['keyword']) {
$qry .= " AND name LIKE %s";
$parameters[] = '%'.$searchArray['keyword'].'%';
}
if ($searchArray['startDate']) {
$date = date('Y-m-d', strtotime($searchArray['startDate']));
$qry .= " AND dateEntered > %s";
$parameters[] = $date;
}
if ($searchArray['quarantineStatus'] != '') {
$qry .= " AND quarantineStatus = %d";
$parameters[] = $searchArray['quarantineStatus'];
}
if ($searchArray['kennel'] != '') {
$qry .= " AND kennel = %s";
$parameters[] = $searchArray['kennel'];
}
if ($searchArray['domain']) {
$qry .= " AND domain = %s";
$parameters[] = $searchArray['domain'];
}
$qry .= " ORDER BY ID DESC";
$sql = $wpdb->prepare($qry, $parameters);
return $wpdb->get_results($sql,OBJECT);
}
Now I want to extend to search one single value across multiple columns. I've searched online and you can see the few commented out examples I've tried.
/**
* @param array $searchArray
* @return array
*/
private static function returnPetSearchResults(array $searchArray): array
{
global $wpdb;
$qry = "SELECT ID
FROM {$wpdb->pets}
WHERE softDelete = 0
AND isAdopted = 0";
$parameters = [];
if ($searchArray['status'] !== '') {
$qry .= " AND status = %d";
$parameters[] = $searchArray['status'];
}
if ($searchArray['type']) {
$qry .= " AND type = %d";
$parameters[] = $searchArray['type'];
}
if ($searchArray['size']) {
$qry .= " AND size = %d";
$parameters[] = $searchArray['size'];
}
if ($searchArray['keyword']) {
$qry .= " AND name LIKE %s";
$parameters[] = '%'.$searchArray['keyword'].'%';
}
// if ($searchArray['keyword']) {
// $qry .= " WHERE name LIKE %s AND previousOwner LIKE %s";
// $parameters[] = '%'.$searchArray['keyword'].'%';
// }
// if ($searchArray['keyword']) {
// $qry .= " WHERE name = %s OR previousOwner = %s";
// $parameters[] = '%'.$searchArray['keyword'].'%';
// }
if ($searchArray['startDate']) {
$date = date('Y-m-d', strtotime($searchArray['startDate']));
$qry .= " AND dateEntered > %s";
$parameters[] = $date;
}
if ($searchArray['quarantineStatus'] != '') {
$qry .= " AND quarantineStatus = %d";
$parameters[] = $searchArray['quarantineStatus'];
}
if ($searchArray['kennel'] != '') {
$qry .= " AND kennel = %s";
$parameters[] = $searchArray['kennel'];
}
if ($searchArray['domain']) {
$qry .= " AND domain = %s";
$parameters[] = $searchArray['domain'];
}
$qry .= " ORDER BY ID DESC";
$sql = $wpdb->prepare($qry, $parameters);
return $wpdb->get_results($sql,OBJECT);
}
What am I missing to effectively search one single string value across multiple columns?
You would - bind the parameters values - escape the variable - pass in logic to search any text in the string - update your query to use LIKE
instead of =
...
if ($searchArray['keyword']) {
$qry .= " AND
(name LIKE %s
OR previousOwner LIKE %s
OR intakeNotes LIKE %s
OR previousOwnerStreetAddress LIKE %s
OR previousOwnerCity LIKE %s
OR previousOwnerPhone LIKE %s
OR previousOwnerEmail LIKE %s
OR traits LIKE %s
OR dogBreed LIKE %s
OR catBreed LIKE %s)";
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
$parameters[] = '%'.$wpdb->esc_like($searchArray['keyword']).'%';
}
...
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.