【问题标题】:MySQL row data to PHP array key/valueMySQL 行数据到 PHP 数组键/值
【发布时间】:2012-08-10 20:36:34
【问题描述】:

所以我正在尝试将一些 Wordpress 与后端集成。他们的 MySQL 架构不是很好,尤其是当您添加 Woocommerce 时。

我想出了以下查询:

SELECT wp.* 
FROM   wp_postmeta wp
       INNER JOIN (SELECT post_id 
                   FROM   wp_postmeta
                   WHERE  ( `meta_key` = '_shipping_method' 
                            AND `meta_value` = 'free_shipping' ) 
                           OR ( `meta_key` = '_order_items' 
                                AND `meta_value` LIKE '%search%' )) a 
               ON a.post_id = wp.post_id 
ORDER  BY wp.post_id DESC

在这张桌子上运行http://i.imgur.com/YBaGq.jpg 为某些人选择正确的东西。

现在,当我在 PHP 中 var_dump 时,它会像这样(截断)-http://pastebin.com/WR3byT8k

有什么方法可以将它正确地映射到一个数组,以便我可以使用一些简单的东西,例如:

echo $content['_billing_first_name']; 
echo $content['_billing_last_name'];

会输出:
John Citizen

请记住,所有内容都是动态的,所以我不能只使用行号。

【问题讨论】:

  • 我刚刚发布了输出的一个片段,但是它很奇怪。这是我的代码 - pastebin.com/pxdcJNni
  • 一方面,mysql_fetch_assoc 而不是mysql_fetch_array。似乎完成您想要的最简单的方法是执行 GROUP BY 然后循环每个结果,合并数组。
  • WordPress 电子商务?多么糟糕的数据库灾难。
  • 对,你是 njk。 @jli 你怎么建议我GROUP BY?我看不到任何明显的解决方案...
  • 题外话,但为了避免 Wordpress 电子商务这一垃圾风暴,我建议看看 Shopify。

标签: php mysql wordpress


【解决方案1】:

如果您需要检索一组固定的元键(不一定是固定顺序),您可以使用类似于数据透视表的技术在查询本身中完成。

SELECT 
  post_id,
  MAX(CASE WHEN meta_key = '_billing_first_name' THEN meta_value ELSE NULL END) AS _billing_first_name,
  MAX(CASE WHEN meta_key = '_billing_last_name' THEN meta_value ELSE NULL END) AS _billing_last_name,
  MAX(CASE WHEN meta_key = '_some_other_attribute' THEN meta_value ELSE NULL END) AS _some_other_attribute,
  MAX(CASE WHEN meta_key = '_another_attribute' THEN meta_value ELSE NULL END) AS _another_attribute,
  ...
  ...
FROM wp_post_meta
GROUP BY post_id

CASE 语句确定您要提取的参数并将其分配给列。它们被包装在 MAX() 聚合中,只是为了消除键不匹配时导致的 NULL,将其折叠成单行,每个属性都有列,而不是多行,其中大部分是 NULL 值。

如果不这样做(如果您的属性集意外变化),您将需要在代码中进行迭代。不过那样会很乱。

在 PHP 中:

使用 PHP,如果您有一个要检索的 meta post 键数组,您可以遍历所有行,如果 meta_key 是您想要的,则将 meta_value 存储到一个数组中:

// Assumes your WP query results are already stored into the array $your_db_rows

// Will hold your final processed results
$output = array();
// If you want only a specific set of meta_key names rather than all meta_key names
$keys_you_want = array('_billing_first_name','_billing_last_name','_some_other_attribute');

// Loops over the result set
foreach ($your_db_rows_array as $row) {
  // If the current row holds one of the meta_key you are looking for
  if (in_array($row['meta_key'], $keys_you_want)) {
    // Put it onto the output array using the meta_key as the array key
    $output[$row['meta_key'] = $row['meta_value'];
  }
  // Otherwise do nothing...
}
var_dump($output);

要获取所有meta_key,只需省略in_array() 测试和$keys_you_want 数组。这会将遇到的每个meta_key 存储到$output

// Loops over the result set for all values of meta_key, not a specific set
foreach ($your_db_rows_array as $row) {
  // Put it onto the output array using the meta_key as the array key
  $output[$row['meta_key'] = $row['meta_value'];
}
var_dump($output);

【讨论】:

  • 理想情况下,我需要能够访问 meta_keys 下行中的任何数据...我想知道 Woocommerce 首先是如何做到这一点的。
  • @Dean 只要你知道meta_keys中存在哪些可能的键值,你就可以用这个方法把它们全部列出来。
  • 我明白了,这也将使用meta_value 中的任何内容?
  • @Dean 是的 - meta_key 和 meta_value 都是同一行中的列。这与您想要的每个 attr 的 meta_key 的值匹配,并返回该行的 meta_value。最后,您应该根据GROUP BY 获得每个 post_id 的一行,其中包含与 attrs 匹配的尽可能多的列。
  • 好的,谢谢。这似乎是目前唯一合乎逻辑的解决方案。我还向可爱插件的开发人员发送了一封电子邮件,看看他们可以阐明什么。再次感谢。
猜你喜欢
  • 2015-02-02
  • 2011-02-06
  • 2013-01-05
  • 1970-01-01
  • 2011-08-29
  • 2012-12-16
  • 1970-01-01
  • 2023-03-25
  • 2016-04-07
相关资源
最近更新 更多