2011-11-24 52 views
3

對不起,如果這是一個很容易的問題,但我找不到任何線程相同。簡化如果isset案例php

可以說,從那時起我們的服務器端,我們把這個

 if (isset($_POST['only_admin'])) { 
      $permission['only_admin'] = $_POST['only_admin']; 
     } 

     if (isset($_POST['can_request'])) { 
      $permission['can_request'] = $_POST['can_request']; 
     } 

     if (isset($_POST['can_offer'])) { 
      $permission['can_offer'] = $_POST['can_offer']; 
     } 

     if (isset($_POST['can_post'])) { 
      $permission['can_post'] = $_POST['can_post']; 
     } 

     if (isset($_POST['is_maintenance'])) { 
      $permission['is_maintenance'] = $_POST['is_maintenance']; 
     } 

是有一個簡單的版本,以上面的代碼中我們設置的值一樣

<li><input type="checkbox" name="only_admin" value="1" /> Only Admin</li> 
    <li><input type="checkbox" name="can_request" value="1" /> Can Request</li> 
    <li><input type="checkbox" name="can_offer" value="1" /> Can Offer</li> 
    <li><input type="checkbox" name="can_post" value="1" /> Can Post</li> 
    <li><input type="checkbox" name="is_maintenance" value="1" /> Is Maintenance</li> 

謝謝! 亞當·拉馬丹

PS如果已經有大約一個很好的線索,請我加標記*

+1

對於readablility原因,你可以做從$permission[]過濾未設置值'$ permission ['only_admin'] =!empty($ _ POST ['only_admin'])? 1:0;'這更可讀,但不會真正簡化它。 –

回答

10
$values = array("only_admin", 
       "can_request", 
       "can_offer", 
       "can_post", 
       "is_maintenance"); 

foreach($values as $v) 
{ 
    if(isset($_POST[$v])) 
    { 
     $permission[$v] = $_POST[$v]; 
    } 
} 
+0

不錯,看起來像我的也是:) –

2

需要更多的工作,但你爲什麼不只是使用:

$permission = $_POST; 

您還可以添加in_array檢查,以便$permission只有在表單發送更多值時纔會獲取特定鍵。

+1

危險的方式,因爲你會複製$ _POST中的所有數據,這並不意味着它是你需要的全部數據。該方法可以使用array_intersect僅獲取$ _POST值。 –

+0

我知道,這就是爲什麼我說它需要更多的工作,並建議使用in_array創建密鑰的白名單。 – Shomz

-1
$permission['only_admin'] = isset($_POST['only_admin']); 

等等等等。

+2

這是無效的,因爲它會將TRUE或FALSE設置爲$ permission數組,並且它可能不是被複制的布爾標誌,至少當前代碼不會將其視爲布爾值 –

+0

複選框本質上是布爾值。他們要麼有價值,要麼沒有價值。如果你生成了複選框,你應該知道它應該具有的價值是什麼。但是,惡意表單提交可能會將任何內容放入值字段(嘗試SQL注入的代碼或其他任何內容),並且上述方法將阻止這些嘗試在其軌道中死去。 – GordonM

+1

複選框的狀態本質上是布爾值,而不是值,值可以是任何您希望從JSON傳遞到字符串和數字的XML數據。因此,如果複選框的值是數據庫中某個權限的ID,則isset($ _ POST ['only_admin'])將失敗,因爲它會在標記中返回true或false,而不是原始值=「number」 –

4

有簡化它,看這一些方法......這不是唯一的解決辦法,但它是一個乾淨的:

$permissions = array(
    'only_admin' => 0, 
    'can_offer' => 0, 
    'can_request' => 0, 
    'can_post' => 0, 
    'is_maintenance' => 0, 
); 
foreach(array_keys($permissions) as $permission){ 
    if(isset($_POST[$permission])){ 
     $permissions[$permissions] = $_POST[$permission]; 
    } 
} 

這將成爲非常強大的更多的權限,你有!

+1

發揮先生:-) – Flukey

+0

最好的,我想我去這!,我怎麼可能從來沒有想到這一點。 –

+0

那麼你爲什麼要把Flukey標記爲正確的答案? –

1

我想你可以很容易地爲此寫一個函數,因爲$ _POST也是一個全局變量。例如:

<?php 
function check_permissions() { 
$permissions_array = array("only_admin", "can_request", "can_offer", "can_post", "is_maintenance"); 
foreach ($_POST as $p => $value) 
{ 
    if (in_array($p, $permissions_array)) 
    { 
    $permission[$p] = $value; 
    } 
return $permission; 
?> 

} >

1

請嘗試:

<li><input type="checkbox" name="permission[only_admin]" value="1" /> Only Admin</li> 
<li><input type="checkbox" name="permission[can_request]" value="1" /> Can Request</li> 
<li><input type="checkbox" name="permission[can_offer]" value="1" /> Can Offer</li> 
<li><input type="checkbox" name="permission[can_post]" value="1" /> Can Post</li> 
<li><input type="checkbox" name="permission[is_maintenance]" value="1" /> Is Maintenance</li> 

$permission[] = $_POST['permission']; 

,然後如果你想