php - 根据复选框编辑中间表

标签 php mysql

我的目标:

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="">&nbsp;canPushAPK</label>
    <input type="hidden" name="permissions[2]" value="false">
    <label>
        <input type="checkbox" name="permissions[2]" value="true">&nbsp;canBeCool</label>
    <input type="hidden" name="permissions[3]" value="false" checked="">
    <label>
        <input type="checkbox" name="permissions[3]" value="true" checked="">&nbsp;canEditSettings</label>
    <input type="hidden" name="permissions[4]" value="false" checked="">
    <label>
        <input type="checkbox" name="permissions[4]" value="true" checked="">&nbsp;canManageRoles</label>
    <input type="hidden" name="permissions[5]" value="false" checked="">
    <label>
        <input type="checkbox" name="permissions[5]" value="true" checked="">&nbsp;canAddUser</label>
    <input type="hidden" name="permissions[6]" value="false">
    <label>
        <input type="checkbox" name="permissions[6]" value="true">&nbsp;canFoo</label>
    <input type="hidden" name="permissions[7]" value="false">
    <label>
        <input type="checkbox" name="permissions[7]" value="true">&nbsp;canTalk</label>
    <input type="hidden" name="permissions[8]" value="false">
    <label>
        <input type="checkbox" name="permissions[8]" value="true">&nbsp;canTest</label>
    <input type="hidden" name="permissions[9]" value="false">
    <label>
        <input type="checkbox" name="permissions[9]" value="true">&nbsp;canPoo</label>
</div>
<input type="hidden" name="roleId" value="1">

View as JSFiddle.

然后根据检查“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"' : ''; ?>
                >&nbsp;<?= $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/

相关文章:

php - 是否可以添加一个链接,在单击时会登录用户?

javascript - 第 6 行 mysql_fetch_array 错误

php - Mysql在不使用别名的情况下连接具有相同列名的2个表

php - mysql命名约定

python - Python 中的 MySQL LOAD DATA INFILE 无法使用变量

PHP、PDO bindValue - 如何传递逗号分隔的 INT 以用于 'in clause'

php - 如何在 Doctrine 中使用mysql变量

php - 如何在 zend 框架中将错误从模型传递到 Controller

php - excel导入MySQL后出现未知字符,如何避免?

mysql - 在 MySQL 列中存储 XML/JSON 总是不好吗?