为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL在数据库数组字段中查找数组值

MySQL在数据库数组字段中查找数组值

PHP
慕无忌1623718 2023-09-15 21:07:51
我有一个数组,它可以包含不同的值,例如:数组( [0] => General Pharmacy [1] => Geriatric Pharmacy )WordPress DB 在 meta_value 中包含以下数组:a:4:{i:0;s:20:"Allgemeine Pharmazie";i:1;s:22:"Geriatrische Pharmazie";i:2;s:16: "Fachascient*in";s:8:"other_16";s:8:"Tierarzt";}我想获取数据库中具有数组值的用户的 user_id 。我尝试了这个问题的解决方案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);但我只得到空结果,而且我认为这不是正确的查询,因为如果在元值中找到数组元素(Allgemeine Pharmazie 和 Geriatrische Pharmazie),我想要 user_id,对吧?在此先感谢您的帮助 :)
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

由于您的数据存储为 PHP 序列化数组,因此您需要首先提取通用数据并循环遍历它,或者需要执行 LIKE 查询。

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 

    )

一旦你调用该 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);

}


查看完整回答
反对 回复 2023-09-15
  • 1 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信