将动态数量的复选框插入多对多关系数据库

时间:2017-04-25 21:33:57

标签: php mysql database checkbox

我有一个与三个表有多对多关系的数据库:

+-----------+       +----------+        +----------+
|doorUser   |       |doorAccess|        | doors    |
+-----------+       +----------+        +----------+
| userID    |       | userID   |        | doorNum  |
| lname     |       | doorNum  |        | doorName |
| fname     |       +----------+        +----------+
| username  |
| accessNum |
+-----------+

doorAccess 表是连接 doorUser door 表的中间表。我想要做的是插入 doorUser 表以及 doorAccess 表,以便每个用户都可以访问任意数量的门。我已经设法将我的PHP插入到 doorUser 表中的位置,但 doorAccess 表证明要困难得多。

以下代码是提交和发布的代码段。

if (isset($_POST["submit"])) {
                if( (isset($_POST["fname"]) && $_POST["fname"] !== "") && (isset($_POST["lname"]) && $_POST["lname"] !== "") &&(isset($_POST["username"]) && $_POST["username"] !== "") &&(isset($_POST["accessNum"]) && $_POST["accessNum"] !== "")  ) {

                    $query = "INSERT INTO doorUser ";
                    $query .= "(fname,lname,username,accessNum) ";
                    $query .= "values('".$_POST["fname"]."', '".$_POST["lname"]."', '".$_POST["username"]."', '".$_POST["accessNum"]."')";


                    $query3 = "SELECT doorNum, doorName ";
                    $query3 .= "FROM doors ";

                        $result3 = $mysqli->query($query3);
                            while ($row3 = $result3->fetch_assoc())  {
                                $doorNum = $row3["doorNum"];
                                $doorName = $row3["doorName"];


                            if( (isset($row3["doorName"]) && $row3["doorName"] !== "")){

                                $query3 = "INSERT INTO doorAccess ";
                                $query3 .= "(userID, doorNum) ";
                                $query3 .= "values('".$_POST[LAST_INSERT_ID()]."', '".$_POST["doorNum"]."')"

                                }

                            }                       

以下代码是表单中的代码段:

echo "<p><form action = 'addUser.php?id={$ID}' method='post'>";

                    echo "<p><input type = 'text' name = 'fname' placeholder = 'First Name' /></p>";
                    echo "<p><input type = 'text' name = 'lname' placeholder = 'Last Name' /></p>";
                    echo "<p><input type = 'text' name = 'username' placeholder  = 'username' /></p>";
                    echo "<p><input type = 'text' name = 'accessNum' placeholder = 'password' /></p>";      


                    $query2 = "SELECT doorNum ";
                    $query2 .= "FROM doors ";

                        $result2 = $mysqli->query($query2);
                        if ($result2 && $result2->num_rows > 0) {
                            while ($row2 = $result2->fetch_assoc())  {
                            $doorNum = $row2["doorNum"];

                        echo "<p><input type = 'checkbox' name = 'doorName' value = '".$row2["doorNum"]."' />   Door $doorNum</p>";


                        }
                    }


                    echo "<p><input type = 'submit' name = 'submit' value = 'Add Person' />";   
                    echo "</form>";

门表可以添加到另一部分或从中删除,所以我需要能够动态生成门的多个复选框,但是我还需要一种方法来链接哪些用户可以访问哪些门。复选框按照它们应该生成,但是我在将userID和门插入中间表时遇到问题。

我检查过,我可以使用此代码插入 doorUser 表,但问题出在 doorAccess 插入的某个位置。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

mysqli API的部分优点在于它提供了参数化查询的使用,例如:

                    $query = "
                    INSERT INTO doorUser 
                    (fname
                    ,lname
                    ,username
                    ,accessNum) VALUES
                    (:fname
                    ,:lname
                    ,:username
                    ,:accessNum);
                    ";

答案 1 :(得分:0)

一些改变应该让你按预期工作:

  1. 更新复选框的HTML以在名称中使用方括号。这样,当提交表单时,服务器端代码(即PHP)将能够将数据视为一个数组(有关更多详细信息,请参阅this answer)。所以这一行:

    echo "<p><input type = 'checkbox' name = 'doorName' value = '".$row2["doorNum"]."' />   Door $doorNum</p>";
    

    变为:

    echo "<p><input type = 'checkbox' name='selectedDoorNums[]' value = '".$row2["doorNum"]."' />   Door $doorNum</p>";
    
  2. 在PHP代码中,插入 doorUser 表后,使用MySQL函数LAST_INSERTED_ID()和PHP-Mysqli执行后续查询以获取新插入的userID值方法fetch_assoc()

    $insertDoorUserQuery = "INSERT INTO doorUser ";
    $insertDoorUserQuery .= "(fname,lname,username,accessNum) ";
    $insertDoorUserQuery .= "values('".$_POST["fname"]."', '".$_POST["lname"]."', '".$_POST["username"]."', '".$_POST["accessNum"]."')";
    $mysqli->query($query);
    //get inserted Id
    $lastInsertIdQuery = 'SELECT LAST_INSERT_ID()';
    $lastInsertIdResults = $mysqli->fetch_assoc($lastInsertIdQuery);
    if (count($lastInsertIdResults) && array_key_exists('LAST_INSERT_ID()', $lastInsertIdResults) {
        $newUserID = $lastInsertIdResults['LAST_INSERT_ID()'];
    }
    
  3. 使用由步骤1中的更改​​形成的数组,将记录插入 doorAccess 表。 array_map()可用于获取要插入的值列表,可以使用函数implode()连接。

    if( (isset($_POST["selectedDoorNums"]) && count($_POST["selectedDoorNums"])){
        $insertValues = array_map(function($doorNum) use ($newUserID) {
            return '(' . $newUserID . ', ' . $doorNum . ')';
        }, $_POST["selectedDoorNums"]);
        $query3 = "INSERT INTO doorAccess ";
        $query3 .= "(userID, doorNum) VALUES ".implode(', ', $insertValues);
        $mysqli->query($query3);
    }
    

    这样,存储在$query3中的查询将具有类似于

    的格式
     INSERT INTO doorAccess (userID, doorNum) VALUES(42, 3), (42,6), (42,9)