我正在尝试根据MySQL查询的输出创建数据数组。
我希望用户能够从下拉框中指定他们的城市,在这种情况下,只能为相关城市返回条目。
重要的是,如果用户没有选择城市(即将其留空),我希望他们看到所有数据,而不是 none 数据。
我的代码
// Parameters for order
$ordercity = ( ! empty( $_GET['city'] ) ) ? $_GET['city'] : '%'; // Set a wildcard if not provided
$exclstatus = 'wc-refunded'; // Set any excluded statuses
// Get the order details
$orderdata = $wpdb->get_results( "
SELECT
posts.post_status,
posts.id as post_id,
meta1.meta_value AS city,
meta2.meta_value AS company,
meta3.meta_value AS email
FROM
wp2_posts posts,
wp2_postmeta meta1,
wp2_postmeta meta2,
wp2_postmeta meta3
WHERE posts.ID = meta1.post_id
AND posts.post_status NOT LIKE '$exclstatus'
AND meta1.meta_key LIKE '_billing_city'
AND meta1.meta_value LIKE '$ordercity'
AND meta1.post_id = posts.id
AND meta2.meta_key LIKE '_billing_company'
AND meta2.post_id = posts.id
AND meta3.meta_key LIKE '_billing_email'
AND meta3.post_id = posts.id
", ARRAY_A );
我当前方法的局限性
我目前的方法是使用'%'来填充$ ordercity。如果没有设置城市,则使用通配符。
这是有限的,因为只选择了具有_billing_city值(即,不是空的)的记录。
我的研究
这个建议使用条件的Stack Overflow post很有意思,但它需要我有两个非常相似的查询(一个有AND meta1.meta_value LIKE '$ordercity'
而另一个没有)这似乎是不必要的,如果我有可能很长有多个变量。
我还在SQL Wildcards上查看了W3学校的建议,但是我没有看到任何关于通配符的指导,如果它是“什么都没有”,那就会选择该字段39;
答案 0 :(得分:1)
肮脏技巧。 您的查询是一个字符串。
if ($city != "") $wheee = "AND city = 'whatever' ";
[...]
WHERE posts.ID = meta1.post_id ".$wheee."
AND posts.post_status NOT LIKE '$exclstatus'
AND meta1.meta_key LIKE '_billing_city'
[...]
答案 1 :(得分:0)
为什么不添加OR
条件
AND (meta1.meta_value LIKE '$ordercity' OR meta1.meta_value IS NULL)
答案 2 :(得分:0)
我已经想出了一个答案,这个答案的灵感来自Rahul的建议。
基本上,如果没有设置参数,我使用PHP将其设置为''。然后在SQL中,如果该参数设置为''我继续,如果不是,我使用该参数
// Parameters for order - if it isn't set, set it to ''
$ordercompany = ( ! empty( $_GET['company'] ) ) ? $_GET['company'] : '';
$exclstatus = 'wc-refunded'; // Set any excluded statuses
// Get the order details
$orderdata = $wpdb->get_results( "
SELECT
posts.post_status,
posts.id as post_id,
meta1.meta_value AS company,
meta2.meta_value AS city,
meta3.meta_value AS email
FROM
wp2_posts posts,
wp2_postmeta meta1,
wp2_postmeta meta2,
wp2_postmeta meta3
WHERE posts.ID = meta1.post_id
AND posts.post_status NOT LIKE '$exclstatus'
AND meta1.meta_key LIKE '_billing_company'
// This is the important bit!
AND ('$ordercompany = '' OR meta1.meta_value LIKE '$ordercompany')
AND meta1.post_id = posts.id
AND meta2.meta_key LIKE '_billing_city'
AND meta2.post_id = posts.id
AND meta3.meta_key LIKE '_billing_email'
AND meta3.post_id = posts.id
", ARRAY_A );