Selected = 'selected' значения в множественном раскрывающемся списке из mysql

Я пытаюсь выбрать значения в раскрывающемся списке "Несколько" из 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 с использованием двух 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>
0
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

последнее, что я знал, это должно быть просто ВЫБРАТЬ в вашей записи.

<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

Да, основная проблема заключается в том, что они читают результаты запроса более одного раза, как только курсор достигает конца, во внутреннем while он будет возвращать false с этого момента (цикл 2 внешнего цикла while). Вот почему они могут установить только один выбор ...

ArtisticPhoenix 26.10.2018 10:21
Ответ принят как подходящий

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

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. Следовательно, на второй итерации внешнего цикла результат будет возвращать 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

Другие вопросы по теме