我的目标:
To change my MySql table that looks like this:
role_permission:
role_id permissions_id
2 1
1 3
1 4
1 5
1 2
基于此 HTML 代码:
<div class="element">
<label for="permissions">Permissions:</label>
<input type="hidden" name="permissions[1]" value="false" checked="">
<label>
<input type="checkbox" name="permissions[1]" value="true" checked=""> canPushAPK</label>
<input type="hidden" name="permissions[2]" value="false">
<label>
<input type="checkbox" name="permissions[2]" value="true"> canBeCool</label>
<input type="hidden" name="permissions[3]" value="false" checked="">
<label>
<input type="checkbox" name="permissions[3]" value="true" checked=""> canEditSettings</label>
<input type="hidden" name="permissions[4]" value="false" checked="">
<label>
<input type="checkbox" name="permissions[4]" value="true" checked=""> canManageRoles</label>
<input type="hidden" name="permissions[5]" value="false" checked="">
<label>
<input type="checkbox" name="permissions[5]" value="true" checked=""> canAddUser</label>
<input type="hidden" name="permissions[6]" value="false">
<label>
<input type="checkbox" name="permissions[6]" value="true"> canFoo</label>
<input type="hidden" name="permissions[7]" value="false">
<label>
<input type="checkbox" name="permissions[7]" value="true"> canTalk</label>
<input type="hidden" name="permissions[8]" value="false">
<label>
<input type="checkbox" name="permissions[8]" value="true"> canTest</label>
<input type="hidden" name="permissions[9]" value="false">
<label>
<input type="checkbox" name="permissions[9]" value="true"> canPoo</label>
</div>
<input type="hidden" name="roleId" value="1">
然后根据检查“roleId”= 1 的值,将其插入数据库。对于所有未选中的情况,它会删除该行。
IE: 如果全部选中,它将如下所示:
role_permission:
role_id permissions_id
2 1
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
我在想什么: 两个查询:
DELETE FROM role_permissions
WHERE role_id = ?
然后:
$query = $this->mysqli->prepare("INSERT INTO role_permission(role_id,permission_id) VALUES (?,?)");
$query->bind_param("ii", $roleId, $permissionId);
$roleId = $_POST['roleId'];
foreach ($_POST['permissions'] as $permissionId=> $value){
if ($value){
$query->execute();
}
}
最佳答案
你的方法会起作用。你似乎喜欢 HTML。
如果您使用“权限名称”数组并且无论是否有效,则代码只是 foreach 循环,如下所示:
测试代码:PHP 5.3.18,Windows XP 上的 mysqli(Oi,停止拉芬)
<?php // Q22950444
// program smarter not harder...
// arrays are your friend...
$allPermissions =
array('canPushAPK' => false, "canBeCool" => false, "canEditSettings" => false,
"canManageRoles" => false, "canAddUser" => false, "canFoo" => false,
"canTalk" => false, "canTest" => false, "canPoo" => false);
$mysqlhost = 'localhost';
$mysqluser = 'test';
$mysqlpass = 'test';
$myDBname = 'testmysql';
$mysqli = new mysqli($mysqlhost, $mysqluser, $mysqlpass, $myDBname);
if (!empty($_POST['goForIt'])) {
if (!empty($_POST['permissions'])) {
foreach($_POST['permissions'] as $permissionName) {
if (isset($allPermissions[$permissionName])) { // test is valid permission
$allPermissions[$permissionName] = true;
}
}
}
// process db...
$sql = "delete from `role_permissions` where `role_id` = ?";
$deleteQuery = $mysqli->prepare($sql);
if ($deleteQuery === false) { // drat
die('deleteQuery: '. $mysqli->error);
}
$deleteQuery->bind_param('s', $_POST['roleId']);
$allOk = $deleteQuery->execute();
if (!$allOk) { // drat
die('deleteQuery: '. $deleteQuery->error);
}
$sql = "insert into role_permissions (role_id, permission_id) values (?, ?)";
$insertQuery = $mysqli->prepare($sql);
if ($insertQuery === false) { // drat
die('insertQuery: '. $mysqli->error);
}
foreach($allPermissions as $permissionName => $active) {
if ($active) {
// bind the variables to the ALREADY PREPARED query
$insertQuery->bind_param('is', $_POST['roleId'], $permissionName);
$allOk = $insertQuery->execute();
if (!$allOk) { // drat
die("insertQuery: $permissionName : {$insertQuery->error}");
}
}
}
echo "<br />role: {$_POST['roleId']}: now has:<br />";
foreach($allPermissions as $permissionName => $active) {
echo $permissionName, ' : ', $active ? '<strong>Yippee!</strong>' : 'sadly, no', '<br />';
}
}
?>
<form action="" method="post">
<div class="element"><!-- easy peasy way of sending out the current permissions -->
<label for="permissions">Permissions:</label>
<?php foreach(array_keys($allPermissions) as $permissionName): ?>
<div>
<label>
<input type="checkbox" name="permissions[]"
value="<?= $permissionName ?>"
<?= $allPermissions[$permissionName] ? 'checked="checked"' : ''; ?>
> <?= $permissionName; ?></label>
</div>
<?php endforeach; ?>
</div>
<input type="hidden" name="roleId" value="1">
<input type="submit" name="goForIt" value="Go For It!">
</form>
关于php - 根据复选框编辑中间表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22950444/