2013-02-14 114 views
1

真的很簡單的問題。我遇到了一個工作問題,在這種情況下,將<= < =和==存​​儲爲一個變量,以便在某些情況下可以吐出某些if語句。PHP if語句是否可以包含所有變量?

$numb1 = 5 
$numb2 = 10 
$option = >= 

if($numb1 $option $numb2) 
+1

考慮如果/ elseif的/ elseif使用功能? – Mirco 2013-02-14 01:56:35

+0

這就是我目前正在做的事情,但我想知道是否有另一種選擇。目前我正在說... if $ option ='==' if $ numb1 == $ numb2 – user1707616 2013-02-14 01:59:30

回答

1

你不能在控制指令中放置一個var來測試它。 這將返回一些:syntax error, unexpected T_VARIABLE

你可以使用一些eval()來做到這一點,但這是不可取的。

Perhap的你可以做的東西有以下不同:

$option=$_GET['option']; // or POST or something else... 
$numb1 = 5; 
$numb2 = 10; 

switch($option) { 
case ">=": 
    if($numb1 >= $numb2){//someting} 
    break; 
case "<=": 
    if($numb1 <= $numb2){//someting} 
    break; 
case "==": 
    if($numb1 == $numb2){//someting} 
    break; 
default://something else if there is no $option 
    break; 
} 

或者通過類似以下的

function testVar($numb1,$numb2,$option) 
{ 
    // Same switch 
} 
+0

我還沒有使用開關,雖然我正在檢查atm。 – user1707616 2013-02-14 02:13:22

+0

但是,在常規的IF/ELSEIF語句中使用它有什麼好處? – user1707616 2013-02-14 02:17:27

+1

在這種情況下對我來說更清潔。使用if()和elseif(),嵌套if(){if()} elseif {if()}的可見性會降低... – Valky 2013-02-14 02:21:14

1

如果不使用eval()通常被認爲是一個壞主意

+0

這將如何工作?此外,爲什麼它被認爲是一個壞主意?現在我有< > ==存儲在SQL中,我做檢查,先看看它是哪個,然後繼續正確的如果語句 – user1707616 2013-02-14 01:58:44

+0

你必須非常小心,以確保eval永遠不會接受用戶輸入。即使你100%確定你,使用開關和if-else結構仍然更安全,而不是冒險。如果沿着某人看到你的功能的軌道下去,並認爲「這看起來很方便」,並沒有意識到eval()的潛在後果,所以他們將用戶輸入作爲參數之一發送到函數中...... – 2013-02-14 02:03:08

+0

變量用於eval()是靜態的,並通過選擇列表設置,然後存儲在SQL中。因此,我確切知道我想在聲明中將會發生什麼。 – user1707616 2013-02-14 02:06:55

1

直接做它這樣,只會使用eval()工作 - 使用eval不被認爲是很好的做法。主要的問題是,如果eval()語句需要用戶輸入,用戶可以將PHP注入代碼中。這顯然很糟糕。請參考此線程 - When is eval evil in php?

您最好做的是爲所有各種操作(例如「大於」,「小於」,「等於」等等)創建一系列開關語句...

+0

好吧這麼長的故事短我正在做它正確的方式。我只是想確保我沒有那樣的東西。謝謝! – user1707616 2013-02-14 02:01:40

+0

實際上,考慮到這一點,eval()被認爲是不好的事情,如果用戶輸入了什麼會去那裏是正確的?對於這種情況,我使用了預設爲< >和==的選擇列表。這也許說使用eval()更合理嗎? – user1707616 2013-02-14 02:04:02

+1

如果您正在使用選擇列表,則用戶已輸入,在這種情況下,絕對不應使用eval()。即使您正在使用選擇框來限制輸入,但這只是僞安全性,因爲沒有什麼可以阻止用戶使用螢火蟲或任何其他工具操縱HTML頁面,將選項的值更改爲某些惡意代碼,然後發佈這種形式到您的Web服務器。 – 2013-02-14 02:06:58

1

要做到這一點最好的辦法是做一個函數調用或對象包裝,然後調用函數來實現相同的結果。

實施例:

$func = '__my_eq_op_'; 


if ($func($numb1,$numb2)) { 
    // Do stuff 
} 

的操作功能然後...

例如。所以你可以把它分解成使用函數。

對於此:

如果($ X == $ y)的

解析器看到6個令牌... 1)KEYWORD IF: 2)LPAREN 3)VAR X 4) EQ 5)VAR Y 6)RPAREN

解析器使用這些標記爲IF條件構造AST。你的思想需要擺脫將「==」看作一個變量。這是一個操作員!

+0

我認爲這個答案可能是另一個好方法,但我對功能還不完全熟悉。他們很難以我想象的方式獲得把握。 – user1707616 2013-02-14 02:11:36

+0

不錯的想法+1,但「東西」將永遠是一樣的,我不知道這可能會有用... – Valky 2013-02-14 02:15:28

+0

一般來說沒有太多的事情要做。 > =和<=運營商就是這樣,運營商。如果您嘗試將它們用作變量,解析器應如何計算運算符優先級? – 2013-02-14 02:17:04