2013-03-17 50 views
1

我正在爲我使用PHP軟件的修改,我想允許用戶輸入自定義錯誤報告級別,如E_ALL & ~E_NOTICE在字符串中使用error_reporting?

的問題是,他們specifiy值被保存爲一個字符串 - 因此我不能引用它在error_reporting()功能。

反正是有,我可以將字符串轉換成由error_reporting()功能所需要的價值?我已經試過了constant()函數,但是它說那個常量找不到。

利亞姆

+3

爲什麼會有人喜歡這樣做? – zerkms 2013-03-17 21:32:47

+0

這不是一個解釋。有一個機會,你在做一個非常錯誤的方式 – zerkms 2013-03-17 21:40:38

+3

@LiamW - 我同意zerkms;這是一件非常奇怪的事情要做。我無法想象任何可能是明智的用例。顯示錯誤的唯一原因是協助在網站上工作的開發人員。因此,通常情況下,在開發系統上,您將顯示所有錯誤,並且在實時系統上,您將全部隱藏。要調試實時系統,您應該真正使用錯誤日誌,但即使您確實有查看錯誤的設置,它應該是單一調試模式,而不是更改核心PHP標誌的開放式功能,因爲那裏面寫着「安全漏洞」。 – Spudley 2013-03-17 21:41:23

回答

2

AFAIK,constant不適合你的主要原因是因爲字符串'E_ALL & ~E_NOTICE'不是常量,而是兩個常量和一些按位運算符。所以你可以在這裏做的是使用eval函數。但是...要小心,要非常小心。

在它獲取字符串中使用的所有常量去的其他方式。你可以使用正則表達式是:

$string = 'E_ALL & ~E_NOTICE'; 
$intval = 0; 
preg_match_all('/[A-Z_]+/',$string, $constants); 
//$constants looks like: array(array('E_ALL', 'E_NOTICE')) 
foreach ($constants[0] as $key => $const) 
{ 
    //either converts them to their value 
    $constants[0][$key] = constant($const); 
    //or replace them in the initial string 
    //you can do this using preg_replace_callback, too of course 
    $string = replace($const, constant($const), $string); 
} 

如果選擇與他們的價值觀來代替恆定的名字,你至少可以確保你傳遞一個稍微安全的字符串eval

$string = preg_replace('/[^0-9&!|\^]/','',$string);//remove anything that isn't a number or bitwise operator. 
error_reporting(eval($string)); 

但是,如果您不想在所有處使用eval ,那麼最終可能會在某個函數中寫入switch。這不是東西,如果你想給它一個鏡頭,我覺得這樣做對你來說,位:

//Get the constants 
preg_match_all('/[A-Z_]/',$string,$constants); 
//Get the bitwise operators 
preg_match_all('[&|~^\s]', $string, $bitOps); 

//eg: 
$string= 'E_ALL& ~E_NOTICE ^FOOBAR'; 
//~~> 
$constants = array(array ('E_ALL', 'E_NOTICE', 'FOOBAR')); 
$bitops = array(array(' & ~', ' ^'));//pay close attention to the spaces! 

結論/我的意見:
爲什麼經歷這一切?它很慢,昂貴而且不安全。一個更安全,更簡單,更簡單的解決方案恕我直言,將存儲int值,而不是字符串
您希望您的客戶選擇error_reporting水平(我不明白爲什麼...),爲什麼不創建一個select,給他們一些預定義的選項。

如果您想讓他們完全控制,請允許他們使用自己的ini文件,但坦率地說:您的目標應該是編寫代碼,使其在E_STRICT | E_ALL下運行。如果你這樣做,有沒有很多激勵的改變error_reporting ...
如果你允許你的客戶端運行自己的代碼,這是提高警告或錯誤,請指出來他們他們不應該打壓,但修正它們!

+0

不錯的解決方案+1! – HamZa 2013-03-17 22:26:56

+0

非常好的解決方案。腳本是vBulletin,無論如何都使用eval()。此外,這將是一個後端選項。 – 2013-03-18 07:48:37

-1

您可以通過陣列這樣做只是:

 
     $string = "E_ALL"; 
     $errorLevel = array("E_ALL"  => E_ALL, 
          "E_NOTICE" => E_NOTICE, 
          "E_ERROR" => E_ERROR, 
          "E_WARNING" => E_WARNING, 
          "E_PARSE" => E_PARSE); 
     error_reporting($errorLevel[$string]); 
+2

你將如何處理'E_ALL&〜E_NOTICE'輸入? – zerkms 2013-03-17 22:00:52

0

我不知道分裂的一部分,但我認爲你可以做這樣的事:

$level = NULL; 

// Modifications 
$level = E_ALL; 
$level &= ~E_NOTICE; 

error_reporting($level); 

隨着放置條件,你可以添加首選常量到你的變量。