1

i have an array, that can contain different values for example: Array ( [0] => Allgemeine Pharmazie [1] => Geriatrische Pharmazie )

The WordPress DB contains in the meta_value the following array: a:4:{i:0;s:20:"Allgemeine Pharmazie";i:1;s:22:"Geriatrische Pharmazie";i:2;s:16:"Fachassistent*in";s:8:"other_16";s:8:"Tierarzt";}

I want to get the user_id of the ones that have the array values in the DB.

I tried out the solution from this question PHP/MySql search array with array

$zuqual = $this->userInput["Zuquali"];
$imploded = (implode(",", $zuqual));
print_r($zuqual); //output Array ( [0] => Allgemeine Pharmazie [1] => Geriatrische Pharmazie )

if(!empty($zuqual)){
   $result = $this->wpdb->get_col($this->wpdb->prepare("SELECT user_id FROM wp_usermeta WHERE meta_key='addition_qualification' AND meta_value IN ('".$imploded."')"));
}
var_dump($result);

But i only get empty results, also I think its not the correct query, because i want the user_id if the array elements (Allgemeine Pharmazie and Geriatrische Pharmazie) are found in the meta_value right?

Thanks in advance for your help :)

1 Answer 1

1

Because your data is stored as a PHP serialized array you'll need to either pull the generic data out first and loop over that, or you'll need to perform a LIKE query. This post goes into things deeper but I'll show you how to do the LIKE query for WordPress.

WordPress has a dedicated function for properly escaping LIKE parameters, called wpdb::esc_like. After running through this, the SQL should look something like this:

SELECT
    user_id
FROM
    wp_usermeta
WHERE
    meta_key='addition_qualification'
    AND
    (
        meta_value  LIKE %s
        OR
        meta_value  LIKE %s 
    )

Once you call prepare on that SQL it will get transformed into:

SELECT
    user_id
FROM
    wp_usermeta
WHERE
    meta_key='addition_qualification'
    AND
    (
        meta_value  LIKE '%Allgemeine Pharmazie%'
        OR
        meta_value  LIKE '%Geriatrische Pharmazie%'
    )

This isn't the most ideal solution but it is probably the best for working with this type of data in a WordPress context. Here's the code that creates the above:

$zuqual = $this->userInput["Zuquali"];

if (!empty($zuqual)) {
    $likeTemplate = ' meta_value  LIKE %s ';
    
    // This will hold the above string repeated once for each item in our search array
    $likes = [];
    
    // This will hold sanitized values to perform LIKE searches, each surrounded by percent signs
    $params = [];
    foreach ($zuqual as $item) {
        $likes[] = $likeTemplate;
        $params[] = '%' . $this->wpdb->esc_like($item) . '%';
    }
    
    // If we have more than one search term, this will join with the OR, otherwise it will be left as-is
    $likeSql = implode(' OR ', $likes);
    
    // Create our query, remembering to surround the nested part with parentheses
    $sql = "SELECT user_id FROM wp_usermeta WHERE meta_key='addition_qualification' AND (" . $likeSql . ")";
    
    // Pass our escaped params in
    $prepared = $this->wpdb->prepare($sql, $params);
    $result = $this->wpdb->get_col($prepared);
}
Sign up to request clarification or add additional context in comments.

1 Comment

That is absolutly perfect. Thank you so much, there is no way i would have found this out by myself :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.