Получение базы данных mySQL из формы HTML с помощью PHP - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь получить данные с веб-страницы с формой HTML и PHP в базу данных MySQL.Он отлично соединяется на обеих страницах, но я получаю сообщение об ошибке при попытке отправить из формы.Он примет данные, если я сам напишу их в PHP и нажму на кнопку «Отправить», но они не получат их из формы, поэтому там должно быть что-то не так, но я не могу понять, что именно.Раньше я никогда не использовал PHP с mySQL, поэтому я не совсем уверен, как все это работает.Любая помощь с объяснением того, как это работает, будет принята с благодарностью.

Ниже моя страница test.html.php, где находится моя форма, и страница testinsert.php, где я пытаюсь вставить данные.

(Кроме того, courseID является внешним ключом в 'test 'table, поэтому мне нужно сделать courseID выбираемым из опций, я боролся с этим, и я не знаю, в этом ли проблема. В текущем коде он находится в выпадающем меню, он показываетно между каждой опцией есть пустая опция, например, список опций будет - «4», «пусто», «5» и т. д.)

<!DOCTYPE html>

<?php
include 'connect.php';
?>

<html lang="en">
<head>
    <link rel="stylesheet" type="text/css" href="style.css" />
    <meta name="viewport" content="width=1024, initial-scale=1.0, maximum-scale=1.0,user-       scalable=no"/>
</head>
    <title>Test Sign Up</title>
<body>

<header>
    <h1>Test Sign Up</h1>

</header>
        <div class="contactform">
            <form action="testinsert.php" method ="post">

                <label for="name">Name:</label>
                <input type="text" id="name" name="name" placeholder="Enter 
                your name here" required>

                <label for="testsentence">Test Sentence:</label>
                <input type="text" id="testsentence" name="testsentence" placeholder="Enter your sentence here" required>


                <label for="course">Course:</label>
                <select id="course" name="course">
                <?php

                $query = "SELECT CourseID FROM Course";

                $result = mysqli_query($conn, $query);


                while($row = mysqli_fetch_array($result)){

                    echo "<option>" . $row['CourseID'] . "<option>";

                }

                mysqli_close($conn);

                ?>
                </select>

            <button type="submit" name="submit">Submit</button>

            </form>                                    
        </div>
    <p></p>
    <a href="courses.html.php">View Courses</a>
    <p></p>
    <a href="index.html">Return to home page</a>
</body>    
</html>

Testinsert.php -

<?php
include 'connect.php';

$name = 'name';
$testsentence = 'testsentence';
$courseid = 'course';

$sql="INSERT INTO Test (Name, TestSentence, Course)
VALUES ('$name','$testsentence', '$courseid')";

if (mysqli_query($conn, $sql)) {
    echo "<p></p>New record added successfully";
    echo '<p></p><a href="index.html">Return to home page</a>';
} else {
    echo "<p></p>Error adding record";
    echo '<p></p><a href="index.html">Return to home page</a>';
}

mysql_close($conn);
?>

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы получаете пустые опции ПОСЛЕ каждой опции с ожидаемым значением, потому что не удалось написать закрывающий тег опции. / должен быть записан во второй тег 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, пожалуйста, изучите его, пока он не станет понятным - не говорите себе, что вы сделаете это слоем.

0 голосов
/ 16 января 2019

Убедитесь, что вы добавили extract($_POST) (или что-то подобное) в ваш PHP-код!

Вам необходимо извлечь параметры из вашего POST-запроса перед их использованием, иначе ваши $name, $testsentence и $courseid будут неопределенными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...