我有一个与三个表有多对多关系的数据库:
+-----------+ +----------+ +----------+
|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 插入的某个位置。
非常感谢任何帮助!
答案 0 :(得分:0)
mysqli API的部分优点在于它提供了参数化查询的使用,例如:
$query = "
INSERT INTO doorUser
(fname
,lname
,username
,accessNum) VALUES
(:fname
,:lname
,:username
,:accessNum);
";
答案 1 :(得分:0)
一些改变应该让你按预期工作:
更新复选框的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>";
在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()'];
}
使用由步骤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)