MySQL найти значения массива в поле массива БД - PullRequest
1 голос
/ 06 августа 2020

у меня есть массив, который может содержать разные значения, например: Array ([0] => Allgemeine Pharmaz ie [1] => Geriatrische Pharmaz ie)

База данных WordPress содержит в meta_value следующий массив: a: 4: {i: 0; s: 20: «Allgemeine Pharmaz ie»; i: 1; s: 22: «Geriatrische Pharmaz ie»; i: 2; s: 16 : "Fachassistent * in"; s: 8: "other_16"; s: 8: "Tierarzt";}

Я хочу получить user_id тех, у которых есть значения массива в БД.

Я пробовал решение из этого вопроса PHP / MySql массив поиска с массивом

$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);

Но я получаю только пустые результаты, также я думаю, что это неправильный запрос, потому что мне нужен user_id, если элементы массива (Allgemeine Pharmaz ie и Geriatrische Pharmaz ie) находятся в meta_value, верно?

Заранее благодарим за вашу помощь :)

1 Ответ

1 голос
/ 06 августа 2020

Поскольку ваши данные хранятся в виде сериализованного массива PHP, вам нужно сначала вытащить общие c данные и l oop поверх них, либо вам нужно будет выполнить запрос LIKE. Этот пост углубляется в детали, но я покажу вам, как выполнить запрос LIKE для WordPress.

WordPress имеет специальную функцию для правильного экранирования параметров LIKE, которая называется wpdb::esc_like. После выполнения этого SQL должен выглядеть примерно так:

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

После того, как вы вызовете команду prepare для этого SQL, он будет преобразован в:

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

Это не Это не самое идеальное решение, но, вероятно, лучшее для работы с этим типом данных в контексте WordPress. Вот код, который создает вышеуказанное:

$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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...