2012-01-29 151 views
2

我堅持的東西在PHP包含變量PHP字符串變量的值不

$l = $par['Length']; 
    $w = $par['Width']; 
    $d = $par['Depth']; 
    $length = $par['Expr_1']; 
    $width = $par['Expr_2']; 

$par是從數據庫中讀取的數組。 長度,寬度,深度是數字 Expr_1 & Expr_2是作爲字符串存儲這樣 即東西公式:

($l + .0625) * ($w + .125) * ($l + .125) * ($w + .0625) + 1.625 

希望發生的事情是,$l$w應與值代替。如果我獨自擁有正確的價值,那麼我echo $l,$w,$d。如果我echo $length or $width它顯示公式。

即使當我嘗試eval("$width = {$par['Expr_2']};");它不會強迫它計算而不是隻讀公式。我知道公式是正確的,因爲如果我手動將它粘貼到$length$width它工作正常。

+0

1.使用'eval'不好。 2.如果您仍想使用它,請確保它是從php.ini啓用的。 – Sarfraz 2012-01-29 06:47:04

+0

1.不關心,因爲提供公式的數據庫部分將被讀取,因此我並不擔心危險代碼,因爲我檢查了推測變量。 2.我只是看完整個php。ini並沒有看到有關啓用或禁用eval的任何信息。請註明我應該在哪裏尋找 – Seth 2012-01-29 07:03:27

回答

1

只有當這些字符串被評估源代碼時,纔會發生字符串變量插值。當它們只是存儲在變量中的值時,賦值不會進行插值。


更好

將存儲不需要全面的eval()簡單解析的格式。下面是一些代碼,可存儲的格式,看起來像這樣:

L,0.5;W,0.2;D,0.3:4.7 

這將相當於(L+0.5)*(W+0.2)*(D+0.3)+4.7:除了使用eval的公式

$eqn_parts = explode(':', $input); 
$add_part = $eqn_parts[1]; 
$mult_parts = explode(';', $eqn_parts[0]); 

$accum = 1; 
foreach($mult_parts as $part) { 
    $bits = explode(',', $part); 
    switch($bits[0]) { 
     case "L": 
      $accum *= ($length + (int)$bits[1]); break; 
     case "W": 
      $accum *= ($width + (int)$bits[1]); break; 
     case "D": 
      $accum *= ($depth + (int)$bits[1]); break; 
    } 
} 
$accum += (int)$add_part; 
+0

那麼我該如何解決?我需要存儲50多個公式,並且用戶需要輸入lxwxd以將其轉換爲lxw – Seth 2012-01-29 06:50:50

+1

考慮以可以解析和評估的方式存儲公式 - 例如,存儲'(L + 0.5)*(W +0.25)+ 0.3'爲'L,0.5; W,0.25:0.3'(然後將其解釋爲「分割在':'上,將冒號前的所有內容分割並放在';'s中,每個items是一個逗號分隔的輸入類型和一個常量的對,把它們放在一起,然後在冒號後加上常量。) – Amber 2012-01-29 07:03:59

+0

所以沒有辦法強制php將它評估爲源代碼? eval命令有錯誤嗎? – Seth 2012-01-29 07:11:10

1

...有可能的選項使用類似preg_replace()的替代...來替換來自數據庫的那些公式變量...然後將替換結果轉換爲/ 或任何您需要的數據類型。然後從那裏計算公式。雖然......它可能不如eval那樣可靠。

http://php.net/manual/en/function.preg-replace.php

+0

w我不會有同樣的問題嗎?將PHP評估它在那一點? – Seth 2012-01-29 07:07:33

+0

我認爲@Amber在數據庫中存儲公式的方式會更好。這只是查看問題的另一種方法... – summea 2012-01-29 07:11:34

0

雖然琥珀色的解決方案會工作,我想保持它的簡單,使所有的工作我沒有進入公式進入DB不是一種浪費。我只是在字符串的開始處將$ length/$ width結合起來,並在結尾處對其進行評估並對​​其進行評估。

謝謝大家

編輯補充一點,我使用的代碼:

$l = $par['Length']; 
    $w = $par['Width']; 
    $d = $par['Depth']; 
    $par['Expr_1'] = '$length='.$par['Expr_1'].';'; 
    eval($par['Expr_1']); 
    $par['Expr_2'] = '$width='.$par['Expr_2'].';'; 
    eval($par['Expr_2']); 
+0

編輯您的問題,而不是發佈答案。 – Toto 2012-01-30 14:41:05

0

假設你將不會被超越「的任何用戶提供的數據到它沒有正確驗證事前它。」

以下似乎很好。

$width = $par['Expr_2']; 
eval('$width = '.$width .';');