簡體   English   中英

MySQL / PHP / HTML如何在分層下拉菜單中插入子項?

[英]MySQL/PHP/HTML How to insert children in hierarchical dropdown form menu?

我有以下變量可從數據庫中獲取值。 這些變量存儲層次結構列表(格式)的父級值和同一層次結構列表的子級值:

$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

從邏輯上講,我的對象數組包含:

$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中構造合適的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注入。在您的情況下,這應該不成問題,但是永遠不能太確定,無論如何都應養成良好的習慣。如果使用字符串鍵執行此操作,則可以使用適合數據庫的字符串引用功能將其替換。)

但是,如果有很多父記錄,則使用子查詢( 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 JOINSQLFiddle上的演示 ):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM