Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在多对多关系数据库中插入动态数量的复选框_Php_Mysql_Database_Checkbox - Fatal编程技术网

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

Php 在多对多关系数据库中插入动态数量的复选框,php,mysql,database,checkbox,Php,Mysql,Database,Checkbox,我有一个与三个表有多对多关系的数据库: +-----------+ +----------+ +----------+ |doorUser | |doorAccess| | doors | +-----------+ +----------+ +----------+ | userID | | userID | | doorNum | | lname |

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

+-----------+       +----------+        +----------+
|doorUser   |       |doorAccess|        | doors    |
+-----------+       +----------+        +----------+
| userID    |       | userID   |        | doorNum  |
| lname     |       | doorNum  |        | doorName |
| fname     |       +----------+        +----------+
| username  |
| accessNum |
+-----------+
doorAccess表是连接doorUser和doors表的中间表。我想做的事情是同时插入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>";
echo“”;
回声“

”; 回声“

”; 回声“

”; 回声“

”; $query2=“选择门编号”; $query2.=“来自门”; $result2=$mysqli->query($query2); 如果($result2&&$result2->num_rows>0){ 而($row2=$result2->fetch_assoc()){ $doorNum=$row2[“doorNum”]; 回声“门$doorNum

”; } } 回声“”; 回声“;
门表可以在另一部分中添加或删除,因此我需要能够动态生成门的多个复选框,但是我还需要一种方法来链接哪些用户可以访问哪些门。复选框按预期的方式生成,但是我在将userID和doors插入中间表时遇到了问题

我检查了,我可以用这个代码插入到doorUser表中,但是问题出在doorAccess insert的某个地方


任何帮助都将不胜感激

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

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

通过几项更改,您应该可以如期工作:

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

    echo "<p><input type = 'checkbox' name = 'doorName' value = '".$row2["doorNum"]."' />   Door $doorNum</p>";
    
  • 使用步骤1中的更改形成的数组,将记录插入doorAccess表。可用于获取要插入的值列表,这些值可以使用函数联接

    这样,存储在
    $query3
    中的查询的格式与

     INSERT INTO doorAccess (userID, doorNum) VALUES(42, 3), (42,6), (42,9)
    
  • $\u POST[LAST\u INSERT\u ID()]
    我怀疑你能用得上。在您的查询中使用
    mysqli\u error($mysqli)
    ,看看结果如何。
    $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()'];
    }
    
    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);
    }
    
     INSERT INTO doorAccess (userID, doorNum) VALUES(42, 3), (42,6), (42,9)