2011-07-16 185 views
0

我試圖通過檢查變量來避免重複我的代碼,如果它是某個運算符。運算符(操作數?)作爲參數

基本上..

$op = $_POST['operator']; 
$x = 5; 
$y = 2; 
$result = $x /* $op instead of '+'/'-'/'*'/'/'/'%' */ $y; 

這是可能的,或者我會送運營商作爲一個字符串和重複每個運營類型的代碼?

回答

2

這是一個很大安全做這樣的事情:

$x = 5; 
$y = 2; 

switch($_POST['operator']){ 
    case '+': 
     $result = $x + $y; 
     break; 
    case '-': 
     $result = $x - $y; 
     break; 
    case '*': 
     $result = $x*$y; 
     break; 
    case '/': 
     $result = $x/$y; 
     break; 
    case '%': 
     $result = $x % $y; 
     break; 
    default: 
     $result = 'Operator not supported'; 
} 

類似的規定。

+0

相當長,但仍然比'eval()更好'使用eval的恕我直言 – Sufendy

1

Ahem。你可以eval

$result = eval("$x $op $y"); 

但這危險,你應該非常小心淨化你的變量。有一種說法就像「如果你的問題需要使用eval,那麼問題就是錯誤的。」類似的東西。這幾乎當然是更好的做這樣的事情:

function apply_op($x, $y, $op) { 
    switch ($op) { 
    case '+': return $x + $y; 
    ... 
    } 
} 
+0

所有參數將被適當處理。謝謝! :) –

+2

而eval往往表明你做錯了某件事 - 它的重量遠遠超過危險 - 即使是在大寫字母和粗體字中) – hakre

+0

@hakre:我通常會說「危險的」比「錯誤的」更糟糕, 。 –

0

可以讓這個:

$operators = array("+", "-","*","%","/"); 
$op = $_POST["operator"]; 
if(in_array($op, $operators)) { 
    echo eval("$x $op $y"); 
} else { 
    echo "Operator not supported"; 
} 
+0

在這種情況下是相當危險的,因爲$ op是用戶輸入。用戶可以輸入任何內容,包括執行一些危險的PHP代碼。 – Sufendy