2014-04-08 35 views
0

我的目標:編輯中間表複選框

要改變我的MySQL表看起來像這樣:

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(); 
    } 
} 
+1

請不要接受你不滿意的答案!包括這一個!你不需要接受答案。我做代碼'因爲我喜歡這樣做。我可能需要自己的代碼,沒有它。我會用它來「真實」。顯然,我很喜歡它。 :-)其他人做'填字遊戲',我這樣做。 :-) –

回答

0

您的方法將起作用。你似乎喜歡HTML。

如果您使用的許可名「以及是否acive或者不是數組,那麼代碼就是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> 
+0

HTML已由PHP類生成:D 只需要基本格式。這正是我想要嘗試這樣做的原因。雖然,你的方式似乎很混亂。我會等待其他答案,並可能接受這個答案。 – Pachonk