【问题标题】:Store checkboxes data from php to database将复选框数据从 php 存储到数据库
【发布时间】:2019-05-01 03:15:20
【问题描述】:

我的数据库中有以下表格:

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”表中,我试图关联“subjects”和“users”表。 表中的所有数据都是从我的 index.php 输入的。

我从 index.php 中引入 subject_name,每次输入一个新的主题时,都会在添加用户的部分创建类似这样的复选框:

这是输入用户的代码,每次引入主题时都会形成复选框(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_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');
    }
}
?>

【问题讨论】:

  • 我看到的唯一问题是subject='$subject[$i]' 必须是subject='{$subject[$i]}'。我还会在$subject 上执行var_dump 以验证它是否包含您期望的键/值。

标签: php database checkbox


【解决方案1】:

你的主要问题就在这里:

        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 将是一个数组,其中包含每个单击框的值。 (请不要忘记进行适当的尽职调查并验证这些数据。这超出了您的问题范围,但我确实想提一下)。

如果您只想将数组存储在数据库中,则需要“序列化()”数组。这将获取您的数组变量并将其转换为表示数组的字符串。然后,您可以将该字符串存储到您的数据库中,当您读取数据库时,您可以将字符串“反序列化()”回数组中。你也可以只取数组并使用 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

玩得开心:)

【讨论】:

  • 您需要将mysqli_real_escape_string($conn, $_POST['subject']); 转换为foreach($_POST['subject'], as &amp;$subject){ $subject = mysqli_real_escape_string($conn, $subject); },因为它会在数组上出错(数组到字符串的转换)但我强烈建议改用准备好的语句而不是转义。
  • 没错,我被剪切并粘贴了他的示例。我将编辑我的回复,使其更加清晰。
  • 感谢您的回答!很好的解释:D
  • 很高兴为您提供帮助:)
【解决方案2】:

正如您所说:我遇到的问题是我不知道如何支持“users_subjects”表中的复选框数据”您可以创建另一个文本类型字段并保留值 ​​in JSON 格式,其中复选框的键和类型以及值是 true 还是 false,具体取决于复选框是否被标记。 es。 {sat:true,ICT:false,subject:false}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2012-12-11
    相关资源
    最近更新 更多