【问题标题】:Insert dynamic number of checkboxes into many-to-many relationship database将动态数量的复选框插入多对多关系数据库
【发布时间】:2017-04-28 02:34:31
【问题描述】:

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

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

doorAccess 表是连接doorUserdoors 表的中间表。我想做的事情是插入到 doorUser 表和 doorAccess 表中,这样每个用户都可以访问任意数量的门。我已经设法让我的 PHP 可以插入到 doorUser 表中,但 doorAccess 表被证明要困难得多。

下面的代码是来自提交和帖子的sn-p。

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"]."')"

                                }

                            }                       

下面的代码是表单中的sn-p:

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>";

门表可以在另一部分添加或删除,因此我需要能够为门动态生成许多复选框,但我还需要一种方法来链接哪些用户可以访问哪些门。复选框按预期生成,但我在将用户 ID 和门插入中间表时遇到问题。

我检查了一下,我可以使用此代码插入到 doorUser 表中,但问题出在 doorAccess 插入的某处。

任何帮助将不胜感激!

【问题讨论】:

  • $_POST[LAST_INSERT_ID()] 我怀疑你可以使用它。在您的查询中使用mysqli_error($mysqli),看看会发生什么。

标签: php mysql database checkbox


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    一些更改应该可以按您的预期工作:

    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方法fetch_assoc()进行后续查询,获取新插入的userID值。

      $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)
      

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      相关资源
      最近更新 更多