PHP中的动态Optgroup

时间:2017-03-24 14:43:38

标签: php mysqli dynamic drop-down-menu optgroup

这是我目前的SQL表,我用来获取我的php下拉列表的数据。这样做的主要目的是将其转换为具有以下成员的optgroup的下拉列表等等......



+-----------+------------+-----------+
| GroupName | MemberName | ValueName |
+-----------+------------+-----------+
| 1st Team  | Joe Bob    | Joe       |
| 1st Team  | Catherine  | Kat       |
| 2nd Team  | Tommy      | Tom       |
| 3rd Team  | John Razks | John      |
+-----------+------------+-----------+
 Table name: Members




基本上,最终结果是下面的代码。这将是一个名为" 1st Team"并有以下成员。第二队和第三队等等。



<optgroup class="1st Team">
  <option value="Joe">Joe Bob</option>
  <option value="Kat">Catherine</option>
</optgroup>
<optgroup class="2nd Team">
  <option value="Tom">Tommy</option>
</optgroup>
<optgroup class="3rd Team">
  <option value="John">John Razks</option>
</optgroup> 
&#13;
&#13;
&#13;

现在,这就是我从SQL表中获取信息的方式。这工作正常,但如果我想添加一个新的GroupName,那么我将不得不在我的主页面添加一个新代码,我不想这样做。

尝试使其动态化,因此如果使用新的GroupName更新SQL表,则下拉列表中将出现一个新的optgroup类,成员将在下面。

&#13;
&#13;
<optgroup class="1st Team">
		<?php
			$conn = mysqli_connect("#connect_to_sql");

			if(!$conn){
				die("Connection Failed".myslqi_connect_error());
			}
				$result = mysqli_query($conn, "SELECT distinct MemberName from Members where GroupName = "1st Team" order by MemberName ASC");
				while ($row = mysqli_fetch_assoc($result)){
				unset($membername, $groupname);
				$groupname = $row['GroupName'];
				$membername = $row['MemberName'];
				echo '<option value="'.$membername.'">'.$membername.'</option>';
			}
		?>	
</optgroup>
&#13;
&#13;
&#13;

对于该做什么我根本不是正面的。我看过其他人的例子,但不知道如何处理这一步。

2 个答案:

答案 0 :(得分:1)

这不是最优雅的方式,但你可以用这种方式构建你的组,它正在做的是检查组的名称,并在每次名称更改时将其更改为新的optgroup,$ first var就在那里它不会在第一次添加结束标记。

我相信你可以改进这一点,但它应该让你去。

它确实依赖于组名的一致命名约定,所以我说,我相信你可以改进它。我还没有包含连接检查,因为你已经在你的例子中已经完成了

$result = mysqli_query($conn, "SELECT * FROM Members ORDER BY GroupName");
$groupName = '';
$first = true;
echo '<select>';
while ($row = mysqli_fetch_assoc($result)){
    if ($row['GroupName'] != $groupName) {
        $groupName = $row['GroupName']; // Just set the new group name
        if (!$first) { // Add a closing tag when we change the group, but only if we're not in the first loop
            echo '</optgroup>';
        } else {
            $first = false; // Make sure we don't close the tag first time, but do after the first loop
        }
        echo '<optgroup label="' . $groupName . '">';
    }
    // We want to echo the options every loop so it's outside the if condition
    echo '<option value="' . $row['MemberName'] . '">' . $row['ValueName'] . '</option>';
}
echo '</select>';

答案 1 :(得分:1)

首先从数据库中获取所有记录。使用键作为组名创建一个数组。循环新数组以生成所需的输出。

// query to get all records from database table
$result = mysqli_query($conn, "SELECT distinct MemberName,GroupName,ValueName from Members order by MemberName ASC");
while ($row = mysqli_fetch_assoc($result)){
    // generate an array with keys as group name
    $array[$row['GroupName']][] = $row;
}

// loop the array to create optgroup
foreach($array as $key=>$value){
    // check if its an array
    if(is_array($value)){
        // create optgroup for each groupname
        echo "<optgroup class='".$key."'>";
        foreach($value as $k=>$v){
            echo "<option value='".$v['membername']."'>'".$v['membername']."'</option>";
        }
        echo "</optgroup>";
    }
}

我没有对此进行过测试,但相信这会对您有所帮助。你可以做出改进。