selected = 'selected' значения в множественном выпадающем меню из mysql - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь выбрать значения в раскрывающемся списке Multiple из Mysql, используя PHP. Я не могу, кажется, получить право выбора в раскрывающемся списке. Кто-нибудь может мне помочь.

Вот оператор SELECT.

$id = '';
if( isset($_GET['id']) && !empty($_GET['id'])) {
    $id = $_GET['id'];

    $sqlParent = "SELECT * FROM multipleselect";
    $resultParent = mysqli_query($con, $sqlParent);
    // Output: One Two Three

    $sqlChildren = "SELECT * FROM multipleselect WHERE multipleselecttrackerid = $id";
    $resultChildren = mysqli_query($con, $sqlChildren);
    // Output: Two Three
}

Php Dropdown с использованием двух while loop

<select name ="fm_multiple" multiple>
    <?php
    while($row = mysqli_fetch_assoc($resultParent)){
        $selectedParent = $row['multipleselect_name'];

        while($row = mysqli_fetch_assoc($resultChildren)){
            $selectedChild = $row['multipleselect_name'];
        }

        $selected = ($selectedParent == $selectedChild) ? "selected='selected'": '';
        echo "<option value='{$selectedParent}' {$selected}>{$selectedParent}</option>";
    }
    ?>
</select>

Это вывод, который я получаю.

<select name="fm_multiple" multiple="">
    <option value="One">One</option>
    <option value="Two">Two</option>
    <option value="Three" selected="selected">Three</option>
    <option value=""></option>
</select>

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Не видя данных, все, что я могу сделать, это угадать, но это определенно неверно:

while($row = mysqli_fetch_assoc($resultParent)){
    $selectedParent = $row['multipleselect_name'];

    while($row = mysqli_fetch_assoc($resultChildren)){ //$row is overwritten
        $selectedChild = $row['multipleselect_name'];
    }

    $selected = ($selectedParent == $selectedChild) ? "selected='selected'": '';
    echo "<option value='{$selectedParent}' {$selected}>{$selectedParent}</option>";
}

Вы не можете повторять запрос несколько раз (технически это не так), но после первой итерациивнешнего цикла while внутренний цикл while выполняет итерацию по полному набору результатов $resultChildren set.Поэтому на второй итерации внешнего цикла ваш результат будет возвращать значение false с этого момента.

Если вы хотите снова выполнить итерацию по результату (что в данном случае бессмысленно), вам придется выполнить mysqli_data_seek($resultChildren,0),Это бессмысленно, потому что вы можете получить данные до цикла.И использование in_array более эффективно, чем циклическое повторение (даже если вы могли бы немного улучшить цикл, вызвав break после того, как нашли свое соответствие).

//only column you need is multipleselect_name, the smaller the result set the easier it is on the network trafic (so the faster it responds)
$sqlChildren = "SELECT multipleselect_name FROM multipleselect WHERE multipleselecttrackerid = $id";
$resultChildren = mysqli_query($con, $sqlChildren);

$selected = array_column(mysqli_fetch_all($resultChildren,MYSQLI_ASSOC), 'multipleselect_name');
/*
     we need ['item1','item2', .... ] instead of [['multipleselect_name'=>'item1'],['multipleselect_name'=>'item2']]

     I don't think you can fetch all from one column in mysqli
     ..PDO..
      $selected = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
*/

while($row = mysqli_fetch_assoc($resultParent)){
    $selectedParent = $row['multipleselect_name'];
    $selected = in_array($selectedParent,$selected) ? "selected='selected'": '';
    echo "<option value='{$selectedParent}' {$selected}>{$selectedParent}</option>";
}

Помимо того, что я упомянул выше, вы перезаписали $row вторым циклом.Что в данном случае может и не иметь значения (вы больше не используете $ row из Parent), но это плохая практика, которая может вызвать все виды трудностей для отслеживания проблем.

Я упростил логику, потому что если:

 $selectedParent = $parent['multipleselect_name']; //changed from row for clarity
 $selectedChild = $child['multipleselect_name'];   //changed from row for clarity
 //and
 $selectedParent == $selectedChild 
 //then
 $parent['multipleselect_name'] = $child['multipleselect_name'];
 //so if we have a list of all
 $child['multipleselect_name']
 //the we can find 
 $parent['multipleselect_name']
  //in that list

Надеюсь, что это имеет смысл, это все равно что сказать a=b и b=c так a=c

0 голосов
/ 26 октября 2018

Последнее, что я знал, это должно быть просто выбрано в вашей записи.

<select name="fm_multiple" multiple="">
    <option value="One">One</option>
    <option value="Two">Two</option>
    <option value="Three" SELECTED>Three</option>
    <option value=""></option>
</select>

https://www.w3schools.com/tags/att_selected.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...