【问题标题】:MySQL/PHP/HTML How to insert children in hierarchical dropdown form menu?MySQL/PHP/HTML 如何在分层下拉表单菜单中插入子项?
【发布时间】:2012-12-17 08:17:18
【问题描述】:

我有以下从我的数据库中获取值的变量。这些变量存储分层列表(格式)的父值和同一分层列表的子值:

$getSolos = $wpdb->get_results($wpdb->prepare("
        SELECT * FROM wp_terms p 
        LEFT OUTER JOIN wp_term_taxonomy t ON p.term_id = t.term_id
        WHERE t.taxonomy = 'format'
        AND t.parent = 0
        AND t.term_id NOT IN (SELECT parent FROM wp_term_taxonomy WHERE taxonomy = 'format' AND parent > 0)
        ORDER BY t.parent
        "));

$getParents = $wpdb->get_results($wpdb->prepare("
        SELECT * FROM wp_terms p 
        LEFT OUTER JOIN wp_term_taxonomy t ON p.term_id = t.term_id
        WHERE t.taxonomy = 'format'
        AND t.parent = 0
        AND t.term_id IN (SELECT parent FROM wp_term_taxonomy WHERE taxonomy = 'format' AND parent > 0)
        "));

虽然上面的不一定重要,但我的数据库如下所示:

term_id name          slug                   term_id1    parent
1         Entry Form    entry-form           1           0
2         Facebook      facebook             2           0
3         Entry Form    entry-form-facebook  3           2
4         Twitter       twitter              4           0
5         Page          page-facebook        5           2

从逻辑上讲,我的 OBJECT ARRAYS 包含:

$getParents->parent = 2 // contains only IDs of parent formats
$getSolos->term_id = 1,5 // contains only IDs of formats that have no children

这个想法是用这些格式填充下拉表单菜单,父格式是包含其子格式的 optgroup。到目前为止,我已经实现了以下目标:

<form>
    Format: <select name="format">
        <option value="empty"></option>
            <?php 
                foreach ($getSolos as $solo) {
                    echo "<option value='".$solo->name."' ".$selected.">".$indent.$solo->name."</option>";
                }
                foreach ($getParents as $parent) {
                    echo "<optgroup label='".$parent->name."'>";
                    // How do I get the children in here?
                    echo "</optgroup>";
                }
            ?>
    </select>
</form>

以上输出:

Entry Form
Twitter
Facebook // Bold as it is an optgroup header

输出应该是:

Entry Form
Twitter
Facebook // Bold as it is an optgroup header
    Entry Form
    Page

所以这是我的问题: 1) 如何让孩子出现在父 optgroup 中?

【问题讨论】:

标签: php html mysql drop-down-menu optgroup


【解决方案1】:

您确实可以在 PHP 中构造一个合适的 NOT IN 条件并将其传递给 MySQL,例如:

$parents_sql = implode(',', array_map(intval, $getParents->parent));

$getSolos = $wpdb->get_results($wpdb->prepare("
    SELECT term_id FROM wp_term_taxonomy            
    WHERE taxonomy = 'format'           
    AND parent = 0 AND term_id NOT IN ($parents_sql)
    "));

(注意:intval 是为了确保确保此代码不会导致 SQL 注入。在您的情况下,这应该不是问题,但永远不能太确定,无论如何,这是一个好习惯。如果您使用字符串键执行此操作,则可以将其替换为适合您数据库的字符串引用函数。)

但是,如果父记录很多,使用子查询(demo on SQLFiddle)可能效率更高:

SELECT term_id FROM wp_term_taxonomy AS t1            
WHERE taxonomy = 'format'           
AND parent = 0
AND term_id NOT IN (
    SELECT parent FROM wp_term_taxonomy         
    WHERE taxonomy = 'format'           
    AND parent > 0)

LEFT JOIN (demo on SQLFiddle):

SELECT t1.term_id
FROM wp_term_taxonomy AS t1            
  LEFT JOIN wp_term_taxonomy AS t2
    ON t1.term_id = t2.parent
WHERE t1.taxonomy = 'format'           
  AND t1.parent = 0
  AND t2.term_id IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 2014-12-04
    • 2023-03-18
    • 2016-12-11
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多