Вы получаете пустые опции ПОСЛЕ каждой опции с ожидаемым значением, потому что не удалось написать закрывающий тег опции. /
должен быть записан во второй тег option следующим образом:
while ($row = mysqli_fetch_array($result)) {
echo "<option>{$row['CourseID']}</option>";
}
Теги параметров по-прежнему отображаются, даже если вы не закрыли их должным образом. В этом случае ошибка проявляется в том, что дважды генерируются нужные теги.
Я рекомендую использовать MYSQLI_ASSOC
в качестве второго параметра вашего mysqli_fetch_array
вызова или более удобно: mysqli_fetch_assoc
Фактически, поскольку $result
является итеративным, вы можете написать:
foreach ($result as $row) {
echo "<option>{$row['CourseID']}</option>";
}
Об использовании extract($_POST)
...
Я ни разу не нашел веской причины использовать extract
в одном из моих сценариев. Ни разу. Кроме того, руководство php имеет специальное предупреждение с указанием:
Внимание!
Не используйте extract () для ненадежных данных, таких как пользовательский ввод (например, $ _GET, $ _FILES).
На странице появляется больше предупреждений, но вы фактически внесли в свой код небезопасность, вызвав extract
для предоставленных пользователем данных. НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО, НЕТ ХОРОШЕЙ ПРИЧИНЫ, ЧТОБЫ СДЕЛАТЬ ЭТО.
Вот достойная страница, которая говорит о доступе к отправленным данным: Переменная PHP Pass на следующую страницу
В частности, именно так вы получаете доступ к ожидаемым суперглобальным данным:
$name = $_POST['name'];
$testsentence = $_POST['testsentence'];
$courseid = $_POST['course'];
Вы никогда не должны записывать нефильтрованные, неанифицированные пользователем данные непосредственно в ваш запрос mysql, в лучшем случае это приводит к нестабильности запроса и в худшем - к ненадежности.
Вы должны использовать подготовленный оператор с заполнителями и связанными переменными в вашем запросе INSERT. Существуют тысячи примеров того, как выполнить этот процесс в Stackoverflow, пожалуйста, изучите его, пока он не станет понятным - не говорите себе, что вы сделаете это слоем.