【问题标题】:PHP/MySql search one value in an arrayPHP/MySql 在数组中搜索一个值
【发布时间】:2015-05-30 13:40:34
【问题描述】:

我正在尝试根据某个普罗旺斯从我的 usermeta 表中获取值。 我住在荷兰。我们这里有 12 个普罗旺斯,我想选择居住在某个普罗旺斯的所有用户。所以我在用户数据库中添加了一个名为“provincies”的字段。一个值为<a href="results.php?provincie=provencename" 的按钮 告诉我根据 url 中的值选择谁。

这并不难。问题是用户可以有多个来源。
所以 meta_key provincie 字段保存 meta_value friesland','groningen','drenthe'

所以现在我需要搜索来自 url 的附加值是否在数据库 meta_value 中。

$provincie_array = "friesland','groningen','drenthe"; 
$query = "SELECT * 
          FROM $wpdb->usermeta 
          WHERE meta_key='provincie' 
          AND meta_value IN ('".$provincie_array."')";

我认为这是对的。然而 PHP 和 MySql 却有所不同。

谁能看到我在这里遗漏了什么?

-编辑-

$provincie = $_GET['provincie'];
                global $wpdb;
                //$query = "SELECT * FROM $wpdb->usermeta WHERE meta_key='provincie' AND meta_value IN ('".$provincie_array."')";

$provincie_array = array('friesland','groningen','drenthe','noordholland','flevoland','overijssel','zuidholland','utrecht','gelderland','zeeland','noordbrabant','limburg'); 
$provincie_check = '';
foreach ($provincie_array as $value) {
    $provincie_check[]="`meta_value` LIKE '%[{$value}]%'";
}
$query = "SELECT * 
          FROM $wpdb->usermeta 
          WHERE meta_key='provincie' 
          AND ( ".implode(' OR ',$provincie_check)." )";
          $personen = $wpdb->get_results($query);

【问题讨论】:

  • $provincie_array 中单词 drenthe 的最后一个单引号不应存在。
  • 没错,错字,因为列表更长。但是问题仍然存在:-)
  • @MySQLRockstar 开始和结束引号在IN函数中
  • 根本不要使用单引号。 $provincie_array = "弗里斯兰、格罗宁根、德伦特";
  • @BishopBarber 我已经删除了我的 cmets。 干杯

标签: php mysql arrays search


【解决方案1】:

这会起作用的...... :)

对于@Interactive:您设置 $find_provincie = $_GET['provincie'];就是这样。

$find_provincie = 'groningen'; //look for 1
$find_provincie = array('friesland','groningen'); //look for multiple


if(is_array($find_provincie)){
    $provincie_check = '';
    foreach ($find_provincie as $value) {
        $provincie_check[]="`meta_value` LIKE '%[{$value}]%'";
    }
    $provincie_check=implode(' OR ',$provincie_check);
}else{
    $provincie_check = "`meta_value` LIKE '%[{$find_provincie}]%'";
}

$query = "SELECT * FROM usermeta WHERE meta_key='provincie' AND ( ".$provincie_check." )";

如果您将每个元素存储在括号中,例如:[groningen][drenthe]

【讨论】:

  • 不,它没有。无论我点击哪里,我总是看到同一个人
  • 它确实有效。在本地环境中测试:s2.postimg.org/h0269r42x/Screen_Shot_20150326160332.png 检查您的代码 :) 也许是同一个人,因为您只检查 1 条返回的行,而不是全部检查?
  • 您没有正确阅读我的问题。您将每个普罗旺斯都放在不同的行中,而我在单个表行中有多个普罗旺斯。我使用 for 循环来获取所有内容:-)
  • 你说得对,我错过了。解决方案是在 meta_value 中写入所有省份,例如:[friesland][groningen] 等等。括号中的每个值都是这样。然后你会做我在我的 asnwer 中写的新查询。
  • 我会试试的。我需要用 , 分隔 [] 吗?
【解决方案2】:

试试这个:

$provincie_array = array("friesland","groningen","drenthe"); 
$query = "SELECT * 
      FROM $wpdb->usermeta 
      WHERE meta_key='provincie' 
      AND meta_value IN ('".implode(",", $provincie_array)."')";

【讨论】:

  • 稍微解释一下会很有帮助。问题是什么,您采取了哪些措施来解决它?
【解决方案3】:

我认为您的数据库结构并不理想。 如果您在一个字段中存储多个值,则需要搜索一个字符串。

尝试使用“like”语句(不是最好的,也不是最快的),但在您的情况下可以,除非您决定更改数据库结构。

您的查询应如下所示:

$query = "SELECT *
          FROM $wpdb->usermeta
          WHERE meta_key='provincie'
          AND (
                meta_value LIKE '%friesland%'
                OR meta_value LIKE '%groningen%'
                OR meta_value LIKE '%drenthe%'
          )";

所以在 php 中你应该这样做:

$provincie_array = array('friesland','groningen','drenthe');

$querypart = "meta_value LIKE '%".implode("%' OR meta_value LIKE '%", $provincie_array)."%'";

$query = "SELECT *
          FROM $wpdb->usermeta
          WHERE
            meta_key='provincie'
            AND (".$querypart.")";

【讨论】:

  • 不走运。无论普罗旺斯,仍然给我一个人。但是我没有更改数据库,与$provincie_array 完全相同
  • 会有一个很大的问题是各省有类似的乞讨或结束。假设您有“drenthe”和“drentheng”:如果您搜索“drenthe”,您会同时找到“drenthe”和“drentheng”。我不认为这是 @Interactive 的问题,但这种方法有一个巨大的错误。您可以看到我的回答,说明如何在没有这样的错误的情况下制作它。
猜你喜欢
  • 2015-05-27
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多