真的很簡單的問題。我遇到了一個工作問題,在這種情況下,將<= < =和==存儲爲一個變量,以便在某些情況下可以吐出某些if語句。PHP if語句是否可以包含所有變量?
$numb1 = 5
$numb2 = 10
$option = >=
if($numb1 $option $numb2)
真的很簡單的問題。我遇到了一個工作問題,在這種情況下,將<= < =和==存儲爲一個變量,以便在某些情況下可以吐出某些if語句。PHP if語句是否可以包含所有變量?
$numb1 = 5
$numb2 = 10
$option = >=
if($numb1 $option $numb2)
你不能在控制指令中放置一個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
}
我還沒有使用開關,雖然我正在檢查atm。 – user1707616 2013-02-14 02:13:22
但是,在常規的IF/ELSEIF語句中使用它有什麼好處? – user1707616 2013-02-14 02:17:27
在這種情況下對我來說更清潔。使用if()和elseif(),嵌套if(){if()} elseif {if()}的可見性會降低... – Valky 2013-02-14 02:21:14
如果不使用eval()
通常被認爲是一個壞主意
這將如何工作?此外,爲什麼它被認爲是一個壞主意?現在我有< > ==存儲在SQL中,我做檢查,先看看它是哪個,然後繼續正確的如果語句 – user1707616 2013-02-14 01:58:44
你必須非常小心,以確保eval永遠不會接受用戶輸入。即使你100%確定你,使用開關和if-else結構仍然更安全,而不是冒險。如果沿着某人看到你的功能的軌道下去,並認爲「這看起來很方便」,並沒有意識到eval()的潛在後果,所以他們將用戶輸入作爲參數之一發送到函數中...... – 2013-02-14 02:03:08
變量用於eval()是靜態的,並通過選擇列表設置,然後存儲在SQL中。因此,我確切知道我想在聲明中將會發生什麼。 – user1707616 2013-02-14 02:06:55
直接做它這樣,只會使用eval()工作 - 使用eval不被認爲是很好的做法。主要的問題是,如果eval()語句需要用戶輸入,用戶可以將PHP注入代碼中。這顯然很糟糕。請參考此線程 - When is eval evil in php?
您最好做的是爲所有各種操作(例如「大於」,「小於」,「等於」等等)創建一系列開關語句...
好吧這麼長的故事短我正在做它正確的方式。我只是想確保我沒有那樣的東西。謝謝! – user1707616 2013-02-14 02:01:40
實際上,考慮到這一點,eval()被認爲是不好的事情,如果用戶輸入了什麼會去那裏是正確的?對於這種情況,我使用了預設爲< >和==的選擇列表。這也許說使用eval()更合理嗎? – user1707616 2013-02-14 02:04:02
如果您正在使用選擇列表,則用戶已輸入,在這種情況下,絕對不應使用eval()。即使您正在使用選擇框來限制輸入,但這只是僞安全性,因爲沒有什麼可以阻止用戶使用螢火蟲或任何其他工具操縱HTML頁面,將選項的值更改爲某些惡意代碼,然後發佈這種形式到您的Web服務器。 – 2013-02-14 02:06:58
要做到這一點最好的辦法是做一個函數調用或對象包裝,然後調用函數來實現相同的結果。
實施例:
$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。你的思想需要擺脫將「==」看作一個變量。這是一個操作員!
我認爲這個答案可能是另一個好方法,但我對功能還不完全熟悉。他們很難以我想象的方式獲得把握。 – user1707616 2013-02-14 02:11:36
不錯的想法+1,但「東西」將永遠是一樣的,我不知道這可能會有用... – Valky 2013-02-14 02:15:28
一般來說沒有太多的事情要做。 > =和<=運營商就是這樣,運營商。如果您嘗試將它們用作變量,解析器應如何計算運算符優先級? – 2013-02-14 02:17:04
考慮如果/ elseif的/ elseif使用功能? – Mirco 2013-02-14 01:56:35
這就是我目前正在做的事情,但我想知道是否有另一種選擇。目前我正在說... if $ option ='==' if $ numb1 == $ numb2 – user1707616 2013-02-14 01:59:30