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);
";
通过几项更改,您应该可以如期工作:
echo "<p><input type = 'checkbox' name = 'doorName' value = '".$row2["doorNum"]."' /> Door $doorNum</p>";
$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)