![](/img/trans.png)
[英]How to include a dropdown menu and a table in a form using php, mysql and 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 JOIN
( 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.