1

基本上我有一个包含 66 本书的数据库;有些来自旧约,有些来自新约。bname 值是书的名称,而 bsect 的值为 O 或 N(新的或旧的),我怎样才能让我的下拉框根据它的 bsect 是否为 O 动态显示一本书到旧的或新的 optgroup还是N?我的老师说我必须做一些阵列,但我不知道怎么做。有什么想法吗?

我的数据库示例:

+-----------+-------+
| bname     | bsect |
+-----------+-------+
| Genesis   | O     |
| Exodus    | O     |
| Leviticus | O     |
+-----------+-------+

我不想依赖基于条目数手动设置操作组,我希望它根据 bsect 的值是动态的。

现在我只有以下查询和一个选择下拉列表,它根据记录号将书放入旧书或新书,但如果要添加更多书,它将中断

    $query = $mysqli->query("select distinct bname as Name from kjv");



?>

<select name="book">
    <?php
    $i=1;
    while($option = $query->fetch_object()){ 
        if($i==1) echo "<optgroup label='Old Testament'>";
        else if($i==40) echo "<optgroup label='New Testament'>";
        echo "<option value='$i'>".$option->Name."</option>";
            $i++;   

    } 

    ?>
4

2 回答 2

0

只需按 bsect 排序并动态显示不同的 optgroup

<?php
$query = $mysqli->query("SELECT DISTINCT bsect, bname AS Name FROM kjv ORDER BY bsect");    
?>

<select name="book">
<?php
    $i = 1;
    $bsect = "";
    while($option = $query->fetch_object()){ 
        if($bsect != $option->bsect) {
            $bsect = $option->bsect;
            echo "<optgroup label='{$bsect}'>";
        }
        else if($i==40) echo "<optgroup label='New Testament'>";
        echo "<option value='$i'>".$option->Name."</option>";
            $i++;   

    } 
?>

当然,那么你的书可能会出现问题。所以你想要做的是添加一个书籍顺序列(边框),它存储一个数字,定义如何对给定组中的书籍进行排序,例如

ALTER TABLE kjy 
    ADD COLUMN border INT U?NSIGNED NOT NULL DEFAULT 0;

然后您可以更新数据以获得正确的图书顺序并执行如下查询:

SELECT DISTINCT bsect, bname AS Name FROM kjv ORDER BY bsect, border;

当然,这是圣经,您不会添加书籍,因此您可能只需定义一个静态书籍 ID 来定义每本书的序数。然后你可以只按 ID 排序,就知道“旧”和“新”书的出版顺序是正确的。

ALTER TABLE kjy 
        ADD COLUMN id INT UNSIGNED NOT NULL PRIMARY KEY BEFORE (bname);
于 2013-10-06T17:31:53.597 回答
0

这就是您可以在 php 中创建 2 个数组的方法,


$query = $mysqli->query("select distinct bname,bsect from kjv");
while($option = $query->fetch_object()){ 
  if ($option->bsect == 'O'){
    $books_old[] = $option->bname;
  } elseif ($option->bsect == 'N'){
    $books_new[] = $option->bname;
  } else {
    # Error collection - bsect not 'O' or 'N'
  }
}
现在你有 2 个数组,它们是书籍列表;$books_old 和 $books_new。
我会使用名称作为值而不是任意索引;

echo "<optgroup label='Old Testament'>";
foreach($books_old as $this_book){
  echo "<option value=\"$this_book\">$this_book</option>";
}
echo "<optgroup label='New Testament'>";
foreach($books_new as $this_book){
  echo "<option value=\"$this_book\">$this_book</option>";
}
于 2013-10-06T17:41:54.937 回答