2017-04-25 44 views
0

我有一個許多一對多關係的數據庫與三個表:插入動態數複選框成許多一對多關係數據庫

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

doorAccess表是連接中間表門用戶表。我想要做的事情是插入門用戶表以及門accessAccess表,以便每個用戶可以訪問任何數量的門。我已經設法讓我的PHP到我可以插入到門用戶表中,但門accessAccess表被證明是更加困難。

下面的代碼是來自提交和帖子的片段。

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

門表能夠被添加到或從另一部分刪除,因此我需要能夠動態地生成然而,門的許多複選框,但我還需要一種方法來鏈接哪些用戶有權訪問哪些門。複選框按照它們應該生成的方式生成,但我在將用戶標識和門插入中間表時遇到問題。

我檢查,我能夠插入doorUser表與此代碼,但問題是某處doorAccess插入。

任何幫助將不勝感激!和mysqli API的美麗

+3

'$ _ POST [LAST_INSERT_ID()]'我懷疑你可以使用它。在你的查詢中使用'mysqli_error($ mysqli)',看看它是什麼。 –

回答

0

部分原因是它提供了使用參數化查詢,例如:

    $query = " 
        INSERT INTO doorUser 
        (fname 
        ,lname 
        ,username 
        ,accessNum) VALUES 
        (:fname 
        ,:lname 
        ,:username 
        ,:accessNum); 
        "; 
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的函數新插入的用戶ID值LAST_INSERTED_ID()和PHP-Mysqli方法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)