简体   繁体   中英

Updating SQL query from single column single value LIKE to multiple columns single value search

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM