У меня есть эта функция, которая позволяет мне выбрать категорию (из выбранной комбинации), чтобы связать ее с продуктом, пока я его создаю. Это работает хорошо, но когда я изменяю продукт, я хотел бы, чтобы категория, назначенная во время создания, оставалась выбранной и видимой в начале комбинации.
Я полагаю, что мне нужно что-то изменить в функции, когда я обновляю продукт. Любое предложение?
Спасибо
Функция:
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 . " ");
}
}
// 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>
$_POST, $_GET или любые пользовательские данные непосредственно в запрос. Обратитесь к PHP правильный путь за общими указаниями и рекомендациями.
Привет, В запросе я передаю только значение сеансов. Является ли $_SESSION также уязвимым для SQL-инъекций?






Я думаю, что вам нужно (если я правильно понял вашу проблему) использовать атрибут 'selected' опции, вы можете сказать, какая опция помечена как выбранная, когда страница загружается, говоря
'<option '. $disable.' value=' . $c['cat_id'] . ' selected>'
(https://www.w3schools.com/tags/att_option_selected.asp)
Затем вы можете использовать значение в $_POST['category'] при отправке формы и сравнить его со значением категории ($c['cat_id']) в цикле, чтобы решить, какой элемент выбран.
Когда форма отправлена и страница перезагружена, последнее выбранное значение останется выбранным.
Простите меня, если я не понял ваш вопрос должным образом, но я ДУМАЮ, что вы имеете в виду это
Я, конечно, плохо объяснил. Мне жаль. Я хотел сказать, что описанная выше функция используется для СОЗДАНИЯ продукта, и это нормально, но возможно ли иметь одну и ту же функцию, которая работает как для СОЗДАНИЯ, так и для ОБНОВЛЕНИЯ? В чем разница? Когда я редактирую продукт (уже созданный), мне нужно показать в поле со списком категорию, выбранную на этапе создания. Или мне нужна новая функция?
извините @Ogum, я действительно не понимаю. Возможно, отредактируйте свой вопрос с примером вывода того, что вы получаете по сравнению с тем, что хотите. Также не могли бы вы уточнить, что вы подразумеваете под созданием (я предположил, что вы говорите о создании записи в базе данных, но не видите никаких запросов на создание или обновление). Попробуйте переписать вопрос с более конкретными деталями, и я уверен, что кто-то сможет помочь :)
Хорошо, я перепишу свой вопрос здесь, так как я не могу объяснить себя. Мне нужно переписать этот код со старого 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);
}
Привет, я не понял, потому что после того, как пользователь выбрал вариант из раскрывающегося списка этой категории, он буду остается выбранным ... это нормальное поведение для любого
<select>HTML-элемента, верно?