Question

Basically I have a database with 66 bible books; some from old testament some from new. The bname value is the NAME of the book, while bsect has a value of O or N(new or old), how can I make my dropdown box dynamically display a book into an old or new optgroup based on whether its' bsect is O or N? My teacher said I have to make some array, but i have no idea how to do it. Any thoughts?

My database sample:

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

I don't want to have to rely on manually setting opgroups based on the NUMBER OF THE ENTRY, I want it to be dynamic based on value of bsect.

Right now I just have the following query with a select dropdown which puts the book into old or new based on its record number, but It will break if more books were to be added

    $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++;   

    } 

    ?>
Was it helpful?

Solution

Simply order by bsect and display different optgroups dynamically

<?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++;   

    } 
?>

Of course, then your books may be out of order. So what you would want to do is add a book-order column (border) that stores a number defining how to order the books in a given group, e.g.

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

Then you can update the data to have the proper book order and do a query like this:

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

Of course, this being the Bible, you aren't going to be adding books, so you can probably just define a static Book ID that defines the ordinality of each book. Then you could just sort by ID and know that "Old" and "New" books are coming out in the right order.

ALTER TABLE kjy 
        ADD COLUMN id INT UNSIGNED NOT NULL PRIMARY KEY BEFORE (bname);

OTHER TIPS

This is how you can create 2 arrays in php,


$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'
  }
}
now you have 2 arrays which are lists of books; $books_old and $books_new.
I'd use the name as the value rather than an arbitrary index;

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>";
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top