Хранить флажки данных из PHP в базу данных - PullRequest
1 голос
/ 30 апреля 2019

В моей базе данных есть следующие таблицы:

CREATE TABLE subjects (
  subject_id int(11) NOT NULL AUTO_INCREMENT,
  subject text,
  PRIMARY KEY (subject_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

CREATE TABLE users (
  id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  username varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE users_subjects (
  users_subjects_id int(11) NOT NULL AUTO_INCREMENT,
  user_id_fk int(11),
  subject_id_fk int(11),
  FOREIGN KEY(user_id_fk) REFERENCES users(id),
  FOREIGN KEY(subject_id_fk) REFERENCES subjects(subject_id),
  PRIMARY KEY (users_subjects_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

В таблице 'users_subjects' я пытаюсь связать таблицы 'subject' и 'users'. Все данные в таблицах вводятся из моего index.php.

Я ввожу subject_name из моего index.php, и каждый раз, когда я ввожу новый, флажки, подобные этим, создаются в той части, где добавляется пользователь:

enter image description here

Это код для входа в систему, где чекбоксы формируются каждый раз, когда вводится тема (index.php):

<form method="post" action="register.php">
    <?php include('errors.php'); ?>
    <div class="input-group">
        <label>User</label>
        <input type="text" name="username" value="">
    </div>
    <div class="input-group">
        <label>Subjects</label>
    </div>
    <div>
        <?php
        $sql = "SELECT subject FROM subjects"; /*Select from table name: subjects*/
        $result = $conn->query($sql); /*Check connection*/
        if($result)
        {
            foreach($result as $row)
            {
                echo "<input type='checkbox' name='subject' value='" . htmlspecialchars($row['subject']) . "' /> <label>" . $row['subject'] . " </label><br>";
            }
        }
        ?>
    </div>

    <div class="input-group">
        <button type="submit" class="btn" name="reg_user">Add new user</button>
    </div>
</form>

Мне удалось ввести имя пользователя в таблицу 'users'.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, как разместить данные флажков в таблице users_subjects. Я застрял и не могу решить это. Кто-нибудь может мне помочь?

Это код, который я сделал для «register.php»:

<?php
$username = "";
$subject = "";
$errors = array();

include('Conexion.php');

if (isset($_POST['reg_user'])) {
    // receive all input values from the form
    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $subject = mysqli_real_escape_string($conn, $_POST['subject']);


    if (empty($username)) { array_push($errors, "Username is required"); }
    if (empty($subject)) { array_push($errors, "Subject is required"); }

    $user_check_query = "SELECT * FROM users WHERE username='$username' LIMIT 1";
    $result = mysqli_query($conn, $user_check_query);
    $user = mysqli_fetch_assoc($result);

    if ($user) { // if user exists
        if ($user['username'] === $username) {
            array_push($errors, "Username already exists");
        }
    }
    // Register user if there are no errors in the form
    if (count($errors) == 0) {
        $query = "INSERT INTO users (username) 
           VALUES('$username')";
        mysqli_query($conn, $query);


        $insert_id = mysqli_insert_id($conn);
        $subject=implode(',',$_POST['subject']);
        //Count subjects and checks if the subject exists
        for($i=0; $i<count($subject); $i++) {

            $query = "SELECT subject_id FROM subject where subject='$subject[$i]'";
            $result = $conn->query($query); /*Check connection*/

            if ($result->num_rows > 0) {
                $row = $result->fetch_assoc();
                $subject_id = $row["subject_id"];
                $query = "INSERT INTO users_subjects (user_id_fk, subject_id_fk)
           VALUES('$insert_id', '$subject_id')";
                mysqli_query($conn, $query);
            } else {
                /*???*/
            }
        }



        header('location: indexAdmin.php');
    }
}
?>

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Ваша основная проблема прямо здесь:

        foreach($result as $row)
        {
            echo "<input type='checkbox' name='subject' value='" . htmlspecialchars($row['subject']) . "' /> <label>" . $row['subject'] . " </label><br>";
        }

При использовании флажков с тем же именем их нужно рассматривать как массив.Посмотрите на это:

        foreach($result as $row)
        {
            echo "<input type='checkbox' name='subject[]' value='" . htmlspecialchars($row['subject']) . "' /> <label>" . $row['subject'] . " </label><br>";
        }

Изменив "name =" на "subject []", php сохранит выбранные значения в массив:

        $subject = $_POST['subject'];

На этом этапе$ subject будет массивом, содержащим значение каждого кликабельного окна.(Пожалуйста, не забудьте провести надлежащую юридическую проверку и проверить эти данные. Это выходит за рамки вашего вопроса, но я хотел бы упомянуть об этом).

Если вы хотите просто сохранить массив в базе данных,Вы захотите "serialize ()" массив.Это возьмет переменную вашего массива и преобразует ее в строку, представляющую массив.Затем вы можете сохранить эту строку в вашей БД, а когда вы читаете БД, вы можете «unserialize ()» вернуть строку обратно в массив.Вы также можете просто взять массив и создать список с разделителями-запятыми, используя implode.

Например:

Чтобы сделать массив в строку:

$str = serialize($subject);

Чтобы повернутьсериализованная строка возвращается в массив:

$arrSubject = unserialize($str);

Или взять массив и поместить его в строку с разделителями-запятыми, чтобы сохранить его таким образом:

$str = implode(", ", $subject);

И некоторые ссылки:

https://www.php.net/manual/en/function.serialize.php

https://php.net/manual/en/function.implode.php

Веселитесь:)

0 голосов
/ 30 апреля 2019

как вы говорите: у меня проблема в том, что я не знаю, как разместить данные флажков в таблице 'users_subjects' ', вы можете создать другое поле текстового типа и сохранить значения в формате JSON, где ключи тип флажка и значение true или false в зависимости от того, установлен флажок или нет. es. {sat: true, ICT: false, subject: false}

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