Я пытаюсь выполнить две вещи с помощью кода ниже. Во-первых, я хочу, чтобы мои параметры выбора были заполнены из моей базы данных. Во-вторых, я хочу, чтобы в поле в форме было сохраненное значение, выбранное при загрузке страницы (например, в профиле для члена). То, как я выполнил ниже, работает, вроде, но у меня две проблемы. Во-первых, если вы откроете раскрывающийся список, выбранный параметр появится дважды (один раз вверху и один раз в нормальном положении). Во-вторых, если это обязательное поле, пользователь должен открыть раскрывающийся список и снова выбрать его, даже если он появляется в поле (ужасный ux). Если это не обязательное поле, форма действует так, как будто ничего не выбрано, и я получаю неопределенную ошибку индекса дальше по строке. Я очень уверен, что есть лучший способ реализовать то, что я пытаюсь достичь, что не даст мне этих проблем... все они очень помогают.
<?php
$query6 = "SELECT catname FROM travisor_catagory";
$result6 = mysqli_query($conn, $query6) or die(mysqli_error($conn));
$queryread3 = "SELECT * FROM travisor_catagory WHERE id = $catagory";
$result3 = mysqli_query($conn, $queryread3) or die(mysqli_error($conn));
if (mysqli_num_rows($result3) > 0) {
while ($row = mysqli_fetch_assoc($result3)) {
$cat = $row["catname"];
}
}
echo "<div class='form-group'>
<label>Catagory *</label>
<select class='form-control' name='catagory' required>
<option disabled selected value> $cat </option>";
if (mysqli_num_rows($result6) > 0) {
while ($row2 = mysqli_fetch_assoc($result6)) {
$catagory2 = $row2["catname"];
echo "<option>$catagory2</option>";
}
}
echo "</select>"
?>
Не смешивайте вещи так много...
Когда вы попадаете в более крупные программы, вы быстро потеряетесь, поэтому KISS !!!
Вы можете "прыгать" в/из HTML и вернуться к PHP, чтобы отобразить переменную $ options, а затем вернуться в HTML, чтобы завершить выбор. (это мое описание этого, когда я учу новичков - эта концепция "прыгать в/из" работает для PHP, HTML, JS - хорошо, любые языки, которые вы можете объединить на одной странице... - это заслуживает понимания концепции! )
Во-первых, получите параметры, которые вам понадобятся с ONE-запросом (посмотрите, как мы позаботимся о выбранном), - это сделает "пакет" данных в переменной $ options.
<?php
// declare some values that we'll use later
$options = '';
// gather the data for the options
$sql = "SELECT id, catname FROM travisor_catagory";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$selected = '';
if($category == $row['id']){
$selected = "selected";
}
$options .= '<option ' . $selected . ' value="' . $row["id"] . '">" . $row["catname"] . "</option>";
}
}
// now we will 'jump' out of PHP and back to HTML
?>
<!-- we are in HTML, so comments and language changed... -->
<div class='form-group'>
<label>Catagory *</label>
<select class='form-control' name='catagory' required>
<!-- here we 'jump' out of HTML and into PHP to use the $options variable -->
<?php echo $options; // and back out of PHP to HTML... ?>
<!-- where we finish up our select and whatever other HTML things -->
</select>
</div>
Это должно позаботиться обо всех ваших проблемах с тем, что у вас было.....
Кстати, похоже, что вы используете Bootstrap - если да, я настоятельно рекомендую вам проверить это (изменил мою жизнь о борьбе с выборами! :) Bootstrap Select
mysqli
значительно менее многословен, что облегчает чтение и аудит кода, и его нелегко спутать с устаревшим интерфейсомmysql_query
. Прежде, чем вы слишком инвестируете в процедурный стиль, стоит переключиться. Пример:$db = new mysqli(…)
и$db->prepare("…")
Процедурный интерфейс является артефактом эпохи PHP 4, когда был представленmysqli
API, и его не следует использовать в новом коде.mysqli
вы должны использовать параметризованные запросы иbind_param
для добавления пользовательских данных в ваш запрос. НЕ используйте интерполяцию или конкатенацию строк для достижения этой цели, поскольку вы создали серьезную ошибку внедрения SQL . НИКОГДА не помещайте$_POST
,$_GET
или любые пользовательские данные непосредственно в запрос, это может быть очень вредно, если кто-то попытается использовать вашу ошибку.