Как сохранить выбранные данные в списке выбора после запроса?

У меня есть эта функция, которая позволяет мне выбрать категорию (из выбранной комбинации), чтобы связать ее с продуктом, пока я его создаю. Это работает хорошо, но когда я изменяю продукт, я хотел бы, чтобы категория, назначенная во время создания, оставалась выбранной и видимой в начале комбинации.

Я полагаю, что мне нужно что-то изменить в функции, когда я обновляю продукт. Любое предложение?

Спасибо

Функция:

function CategoryTree(&$output=null, $cat_parent_id=0, $indent=null){

    global $con;

    try {

    // prepare select query
    $query = "SELECT * FROM category WHERE cat_parent_id=:parentid AND cat_lang = '{$_SESSION['lang']}'";
    $stmt = $con->prepare($query);

    // this is the first question mark
    $stmt->bindParam(2, $id);

    // execute our query
    $stmt->execute(array( 'parentid' => $cat_parent_id));

    while($c = $stmt->fetch(PDO::FETCH_ASSOC)){
       $disable= "";
        if ($cat_parent_id==0 ){
          $disable= 'disabled = "disabled" style = "color:black;font-weight:bold;font-style:oblique"';
    }
    $output .= '<option  '. $disable.'  value=' . $c['cat_id'] . '>' . $indent . $c['cat_name'] . "</option>\n";
    if ($c['cat_id'] != $cat_parent_id){

        CategoryTree($output, $c['cat_id'], $indent . "&nbsp;&nbsp;");
    }
}
    // return the list of categories
    return $output;
}
// show error
catch(PDOException $exception){
    die('ERROR: ' . $exception->getMessage());
}
}

HTML:

<select name = "category" class = "form-control" id = "category" required />
   <option value = "">Select a category</option>

<?php

    echo CategoryTree();
?>   
    </select>

Привет, я не понял, потому что после того, как пользователь выбрал вариант из раскрывающегося списка этой категории, он буду остается выбранным ... это нормальное поведение для любого <select> HTML-элемента, верно?

Fernando Mertins 18.03.2019 20:53
ПРЕДУПРЕЖДЕНИЕ: при использовании PDO вы должны использовать подготовленные заявления со значениями-заполнителями и предоставлять любые пользовательские данные в качестве отдельных аргументов. В этом коде у вас есть потенциально серьезный Ошибки внедрения SQL. Никогда не используйте интерполяцию или конкатенацию строк, вместо этого используйте подготовленные заявления и никогда не помещайте $_POST, $_GET или любые пользовательские данные непосредственно в запрос. Обратитесь к PHP правильный путь за общими указаниями и рекомендациями.
tadman 18.03.2019 21:08

Привет, В запросе я передаю только значение сеансов. Является ли $_SESSION также уязвимым для SQL-инъекций?

Ogum 19.03.2019 16:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
51
2

Ответы 2

Я думаю, что вам нужно (если я правильно понял вашу проблему) использовать атрибут 'selected' опции, вы можете сказать, какая опция помечена как выбранная, когда страница загружается, говоря

'<option  '. $disable.'  value=' . $c['cat_id'] . ' selected>'

(https://www.w3schools.com/tags/att_option_selected.asp)

Затем вы можете использовать значение в $_POST['category'] при отправке формы и сравнить его со значением категории ($c['cat_id']) в цикле, чтобы решить, какой элемент выбран.

Когда форма отправлена ​​и страница перезагружена, последнее выбранное значение останется выбранным.

Простите меня, если я не понял ваш вопрос должным образом, но я ДУМАЮ, что вы имеете в виду это

Я, конечно, плохо объяснил. Мне жаль. Я хотел сказать, что описанная выше функция используется для СОЗДАНИЯ продукта, и это нормально, но возможно ли иметь одну и ту же функцию, которая работает как для СОЗДАНИЯ, так и для ОБНОВЛЕНИЯ? В чем разница? Когда я редактирую продукт (уже созданный), мне нужно показать в поле со списком категорию, выбранную на этапе создания. Или мне нужна новая функция?

Ogum 19.03.2019 16:54

извините @Ogum, я действительно не понимаю. Возможно, отредактируйте свой вопрос с примером вывода того, что вы получаете по сравнению с тем, что хотите. Также не могли бы вы уточнить, что вы подразумеваете под созданием (я предположил, что вы говорите о создании записи в базе данных, но не видите никаких запросов на создание или обновление). Попробуйте переписать вопрос с более конкретными деталями, и я уверен, что кто-то сможет помочь :)

imposterSyndrome 19.03.2019 16:59

Хорошо, я перепишу свой вопрос здесь, так как я не могу объяснить себя. Мне нужно переписать этот код со старого mysql_ на PDO. Возможно, написав код напрямую, его лучше понять.

Основная функция:

/*
    Generate combo box options containing the categories we have.
    if $catId is set then that category is selected
*/
function buildCategoryOptions($catId = 0)
{
    $sql = "SELECT cat_id, cat_parent_id, cat_name
            FROM tbl_category  WHERE cat_lang = '{$_SESSION['lang']}'
            ORDER BY cat_id";
    $result = dbQuery($sql);

    $categories = array();
    while($row = dbFetchArray($result)) {
        list($id, $parentId, $name) = $row;

        if ($parentId == 0) {
            // we create a new array for each top level categories
            $categories[$id] = array('name' => $name, 'children' => array());
        } else {
            // the child categories are put int the parent category's array
            $categories[$parentId]['children'][] = array('id' => $id, 'name' => $name); 
        }
    }   

    // build combo box options
    $list = '';
    foreach ($categories as $key => $value) {
        $name     = $value['name'];
        $children = $value['children'];

        $list .= "<optgroup label=\"$name\">"; 

        foreach ($children as $child) {
            $list .= "<option value=\"{$child['id']}\"";
            if ($child['id'] == $catId) {
                $list.= " selected";
            }

            $list .= ">{$child['name']}</option>\r\n";
        }

        $list .= "</optgroup>";
    }

    return $list;
}

Создать.php:

$catId = (isset($_GET['catId']) && $_GET['catId'] > 0) ? $_GET['catId'] : 0;
$categoryList = buildCategoryOptions($catId);

а потом

<select name = "cboCategory" id = "cboCategory" class = "width-50">
     <option value = "" selected>-- Choose Category --</option>
<?php
echo $categoryList;
?>   
  </select>

update.php

// get category list
$sql = "SELECT cat_id, cat_parent_id, cat_name
        FROM tbl_category 
          ORDER BY cat_id";
$result = dbQuery($sql) or die('Cannot get Product. ' . mysql_error());

$categories = array();
while($row = dbFetchArray($result)) {
    list($id, $parentId, $name) = $row;

    if ($parentId == 0) {
        $categories[$id] = array('name' => $name, 'children' => array());
    } else {
        $categories[$parentId]['children'][] = array('id' => $id, 'name' => $name); 
    }
}   
// build combo box options
$list = '';
foreach ($categories as $key => $value) {
    $name     = $value['name'];
    $children = $value['children'];

    $list .= "<optgroup label=\"$name\">"; 

    foreach ($children as $child) {
        $list .= "<option value=\"{$child['id']}\"";

        if ($child['id'] == $cat_id) {
            $list .= " selected";
        }
        $list .= ">{$child['name']}</option>";
    }

    $list .= "</optgroup>";
}
?> 

а потом

<select name = "cboCategory" id = "cboCategory" class = "box">
     <option value = "" selected>-- Choose Category --</option>
<?php
    echo $list;
?>   
    </select>

Функции:

 dbQuery() =    global $dbConn;

  $result = mysqli_query($dbConn, $sql) or die(mysqli_error($dbConn));

    return $result;

dbFetchArray = function dbFetchArray($result, $resultType = MYSQL_NUM) {
    return mysqli_fetch_array($result, $resultType);
}

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